Php 网络抓取:如何检测列表中的新项目?

Php 网络抓取:如何检测列表中的新项目?,php,web-scraping,Php,Web Scraping,我正在编写一些PHP代码,可以从远程广播页面获取音乐播放列表,这意味着它会不断更新。 我想将曲目历史记录存储在我的数据库中 我的问题是,我需要检测何时将新条目添加到远程跟踪列表,知道: 我不知道远程页面的更新频率 我不知道远程页面上显示了多少曲目。有时是单轨,有时是几十轨 同一曲目可能会出现多次 例如,我将在第一次抓取页面时获得以下数据: 死亡组合-埃塞·奥尔哈克时代索特 如果我给了你我的爱 胡佛音-巴达博姆 阿兰·钱福特-班布-皮洛斯基/杰维奇再版 威廉·奥尼亚博-原子弹 柯蒂斯·梅菲尔德

我正在编写一些PHP代码,可以从远程广播页面获取音乐播放列表,这意味着它会不断更新。 我想将曲目历史记录存储在我的数据库中

我的问题是,我需要检测何时将新条目添加到远程跟踪列表,知道:

  • 我不知道远程页面的更新频率
  • 我不知道远程页面上显示了多少曲目。有时是单轨,有时是几十轨
  • 同一曲目可能会出现多次
例如,我将在第一次抓取页面时获得以下数据:

  • 死亡组合-埃塞·奥尔哈克时代索特
  • 如果我给了你我的爱
  • 胡佛音-巴达博姆
  • 阿兰·钱福特-班布-皮洛斯基/杰维奇再版
  • 威廉·奥尼亚博-原子弹
  • 柯蒂斯·梅菲尔德-向上移动-扩展版
  • Mos Def-胖战利品女士
  • Nicki Minaj-感受我自己
  • 披露-你和我(Flume混音)
  • 奥蒂斯·雷丁-我的女孩-重拍单声道
  • 第二次我会得到:

  • 查尔斯·阿兹纳沃-埃蒙内斯·莫伊
  • Mos Def-胖战利品女士
  • 碎骨人-人类
  • 伯纳德·拉维利尔斯-黑色
  • 朱利安牧师
  • 滚石乐队-只是你的傻瓜
  • 死亡组合-埃塞·奥尔哈克时代索特
  • 如果我给了你我的爱
  • 胡佛音-巴达博姆
  • 阿兰·钱福特-班布-皮洛斯基/杰维奇再版
  • 如您所见,第二次,我得到的条目7->10似乎与第一次相同(因此条目1->6是新条目);曲目#2已经在第一个列表中播放,但似乎从那时起就开始重播

    这里的新条目是:

  • 查尔斯·阿兹纳沃-埃蒙内斯·莫伊
  • Mos Def-胖战利品女士
  • 碎骨人-人类
  • 伯纳德·拉维利尔斯-黑色
  • 朱利安牧师
  • 滚石乐队-只是你的傻瓜
  • 我将跟踪条目存储在一个表中,并在另一个表中跟踪历史记录

    轨道表的结构

    | ID |   artist   |     title     |     album     |
    --------------------------------------------------
    | 12 |   Mos Def  | Ms. Fat Booty |               |
    
    | ID |   track ID  |        time         |
    ------------------------------------------
    | 24 |     12      | 2016-07-03 13:40:26 |
    
    轨道历史记录表的结构

    | ID |   artist   |     title     |     album     |
    --------------------------------------------------
    | 12 |   Mos Def  | Ms. Fat Booty |               |
    
    | ID |   track ID  |        time         |
    ------------------------------------------
    | 24 |     12      | 2016-07-03 13:40:26 |
    
    你对我如何处理这件事有什么想法吗


    谢谢

    我想您是想在第二个列表的末尾找到与第一个列表开头匹配的项目

    如果可以将两个列表存储在一个数组中(旧列表在
    $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);
    }
    
    我的输出是:

    新曲目:查尔斯·阿兹纳沃-埃蒙内斯·莫伊;Mos Def-胖战利品女士; 碎骨人-人;伯纳德·拉维利尔斯-黑衣主教;朱利安克雷 -法国总理;滚石乐队-只是你的傻瓜

    老曲目:死亡组合-埃塞·奥尔哈克时代索特;Myron&E-如果我 给了你我的爱;胡佛音-巴达博姆;阿兰·钱福特-班布- 皮洛斯基/杰维奇重演


    你可以用数据库端的信息做你想做的事。

    @Veve:我不明白。。。你是什么意思?谢谢你的回答;但我搜索的是一种逻辑方法(如果有)来查找新条目的起始位置。这意味着在第二个数组中,如果已经播放了曲目,它也可能出现。也许那是不可能的。。。请重新阅读我的第一篇文章。我想这就是你所说的。一旦函数遇到$previous中不存在的条目,或者与$previous中的条目顺序不同,它就会使用$current的剩余部分递归调用自己。因此,返回值不可能包含尚未播放的曲目。但也许我误解了你。如果我是对的,那么要找到新条目开始的索引位置,可以使用count($current)-count($old_tracks)或类似的方法。