2017-04-03 60 views
-1

我正在研究一些PHP代码,它将从远程广播页面抓取音乐播放列表 - 这意味着它不断更新。 我想在我的数据库中存储曲目历史记录。网页抓取:如何检测列表中的新项目?

我的问题是,我需要检测时,新条目已被添加到远程曲目列表,因为他们知道:

  • 我不知道多久远程页面将被更新
  • 我不不知道远程页面上显示了多少曲目。有时它会是一条单曲,有时候会是几十条。
  • 同一曲目可能会出现好几次。

例如,抓住页面,第一次时,我会得到这样的数据:

  1. 死组合 - 爱喜Olhar阙儿阿SóTEU
  2. 迈伦&Ë - 如果我给你我的爱
  3. 胡佛菲尼克 - Badaboum
  4. 阿兰尚福尔 - BAMBOU - Pilooski/Jayvich重奏
  5. 威廉·奥尼伯 - 原子弹
  6. 柯蒂斯梅菲尔德 - 移动上了 - 扩展版
  7. 莫斯戴夫 - 脂肪藏宝女士
  8. 本站Minaj - 感觉我自己
  9. 披露 - 你&我(水槽混音)
  10. 奥蒂斯雷丁 - 我的女孩 - 修复单

然后在第二次我会得到:

  1. 查尔斯阿森纳沃尔 - Emmenez MOI
  2. 莫斯戴夫 - 脂肪藏宝女士
  3. Rag'n'Bone人 - 人
  4. 伯纳德·拉维利尔斯 - IDEES noires
  5. 朱利安克莱尔 - 马偏好
  6. 滚石乐队 - 只是你的傻瓜
  7. Dead Combo - Esse Olhar Que EraSóTeu
  8. 迈伦&Ë - 如果我给你我的爱
  9. 胡佛菲尼克 - Badaboum
  10. 阿兰尚福尔 - BAMBOU - Pilooski/Jayvich重奏

正如你所看到的,第二次,我得到了条目7 - > 10似乎与第一次相同(所以参赛作品1-> 6是新作品);第2首曲目已经在第一个列表中播放过了,但似乎已经重播了。

这里的新条目将是:

  1. 查尔斯阿森纳沃尔 - 带我
  2. 莫斯戴夫 - 脂肪藏宝女士
  3. Rag'n'Bone人 - 人
  4. Lavilliers - 思想黑
  5. 朱利安克莱尔 - 我的选择
  6. 滚石乐队 - 只需哟乌尔傻瓜

我存储在表中的轨道入口,并在另一个轨道的历史。表

结构跟踪表的

| ID | artist |  title  |  album  | 
-------------------------------------------------- 
| 12 | Mos Def | Ms. Fat Booty |    | 

结构跟踪历史

| ID | track ID |  time   | 
------------------------------------------ 
| 24 |  12  | 2016-07-03 13:40:26 | 

你有我能怎么我们处理任何想法?

谢谢!

+0

@Veve:我不明白这一点...什么ü意味着什么呢? – gordie

回答

0

我觉得你试图想找到第二个名单是那些在比赛的第一个开始的结束的项目?

如果你能盲目阵列中的两个列表(旧列表中$previous$current新的列表),这个功能不宜帮助:

function find_old_tracks($previous, $current) 
{ 
    for ($i = 0; $i < count($current); $i++) 
    { 
     if ($previous[$i] == $current[$i]) continue; 
     return find_old_tracks($previous, array_slice($current, $i + 1)); 
    } 
    return array_slice($previous, 0, $i); 
} 

它扫描的连续比赛通过$current$previous,递归其余的每次发现一个错配。当我运行此:

$previous = array(
    'Dead Combo — Esse Olhar Que Era Só Teu', 
    'Myron & E — If I Gave You My Love', 
    'Hooverphonic — Badaboum', 
    'Alain Chamfort — Bambou - Pilooski/Jayvich Reprise', 
    'William Onyeabor — Atomic Bomb', 
    'Curtis Mayfield — Move on up - Extended version', 
    'Mos Def — Ms. Fat Booty', 
    'Nicki Minaj — Feeling Myself', 
    'Disclosure — You & Me (Flume remix)', 
    'Otis Redding — My Girl - Remastered Mono' 
); 

$current = array(
    'Charles Aznavour — Emmenez moi', 
    'Mos Def — Ms. Fat Booty', 
    'Rag Bone Man — Human', 
    'Bernard Lavilliers — Idées noires', 
    'Julien Clerc — Ma préférence', 
    'The Rolling Stones — Just Your Fool', 
    'Dead Combo — Esse Olhar Que Era Só Teu', 
    'Myron & E — If I Gave You My Love', 
    'Hooverphonic — Badaboum', 
    'Alain Chamfort — Bambou - Pilooski/Jayvich Reprise' 
); 

$old_tracks = find_old_tracks($previous, $current); 
$new_tracks = array_slice($current, 0, count($current) - count($old_tracks)); 

print "NEW TRACKS: " . implode($new_tracks, '; '); 
print "<br /><br />OLD TRACKS: " . implode($old_tracks, '; '); 

我的输出是:

新的轨道:查尔斯阿森纳沃尔 - 带我; Mos Def - Fat Booty女士; 抹布骨人 - 人; Bernard Lavilliers - 黑色想法;朱利安克莱尔 - 我的偏好;滚石乐队 - 只是你的傻瓜

旧迹:死组合 - 爱喜Olhar什么时代如此TEU;迈伦&ë - 如果我给你我的爱; Hooverphonic - Badaboum;阿兰尚福尔 - 竹 - Pilooski /重奏Jayvich

你可以做你喜欢什么随着数据库结束该信息。

+0

谢谢您的回答;目标是什么我寻找而是一种逻辑方法(如果有的话)来找到*当新的项目开始。这意味着集群,第二阵列中,如果轨道过气已经打过,它会* *露了出来。也许这是不可能的......请重新阅读我的第一篇文章。 – gordie

+0

,我认为这确实你说的话。只要函数遇到$ previous中不存在的条目,或者该条目的顺序与$ before不同,它就会递归地调用自身的剩余部分$ current。因此,返回的值不会包含尚未播放的曲目。但也许我误解了你。 如果我说得对,那么要找到新条目开始处的索引位置,您可以使用 count($ current) - count($ old_tracks)或类似的东西。 – craigmc