【问题标题】:Automated data scraping using CRON使用 CRON 自动抓取数据
【发布时间】:2011-03-01 23:59:11
【问题描述】:

我目前正在开发一个应用程序,该应用程序可以从赛车网站收集有关赛狗的信息,并对给定数据执行大量计算。当前的应用程序通过根据用户输入在赛车网站上执行单独的 YQL 请求来正确显示数据并执行正确的计算。

但是,我发现由于大量的 HTTP 调用和缺乏数据缓存,应用程序往往有点慢。为了加快速度并开放进一步分析数据的能力,我想构建某种系统,该系统将通过 cron 选项卡抓取和存储与前一天晚上相关的所有数据。但是,我不确定如何去做。

目前,应用程序经历了以下粗略的过程:

  1. 允许用户选择日期
  2. 执行 YQL 查询并遍历结果以获取该日期的所有比赛
  3. 允许用户从以上列表中选择种族
  4. 执行 YQL 查询并遍历结果以获取比赛中的所有狗
  5. 执行 YQL 查询并遍历结果以获取每只狗执行的所有比赛
  6. 根据每只狗的比赛计算统计数据
  7. 输出所有内容

如您所见,有很多单独的 HTTP 请求。这是不可避免的,因为每个数据集都存在于赛车网站的不同页面上。出于这个原因,我宁愿通过一个单独的系统来完成大部分处理,并将数据存储在数据库中,而不是在用户请求时收集和处理。

我可以轻松地从当前系统中提取提取和计算处理,然后让它们从 cron 选项卡中运行,但它们都将从单个 PHP 请求中运行。这意味着服务器将不得不遍历数以千计的数据,将每组数据存储在数据库中,所有这些都在一个 PHP 请求中。没试过,我会假设请求会超时?

所以总结一下,这是我的问题:

  1. 如果我将处理放入单个 PHP 文件并从 cron 运行它,它会在完成工作之前超时还是继续进行?
  2. 是否有任何预先存在的库可以处理此类任务?
  3. 对实现此目的的替代方法有什么想法吗?

非常感谢,

【问题讨论】:

  • 相关网站是否授权数据抓取?如果没有,您可能希望同时运行整个批次,这种事情会引起注意。
  • 不,它没有。我还假设他们也不喜欢 YQL 被用来抓取他们的页面。如果我最终必须在后台处理全部内容,我想我将不得不在一天左右的时间内错开处理该项目以避免被注意到?

标签: php cron yql


【解决方案1】:

不是大规模抓取网站,而是按需缓存?

这可能更容易实现,并且如果他们的 TOS 不允许抓取(它可能不允许),也不会让比赛网站产生怀疑。

您只需要一个以日期为键的本地 sql 表,并且包含您已经输出的统计信息的列。

你的流程会是这样的

  1. 允许用户选择日期
  2. 执行 sql 查询以查找该日期的预计算数据。如果数据不存在转到3,否则转到9。
  3. 执行 YQL 查询并遍历结果以获取该日期的所有比赛
  4. 允许用户从以上列表中选择种族
  5. 执行 YQL 查询并遍历结果以获取比赛中的所有狗
  6. 执行 YQL 查询并遍历结果以获取每只狗执行的所有比赛。
  7. 根据每只狗的比赛计算统计数据
  8. 按用户日期将统计信息存储到 sql 表中。
  9. 输出所有内容

【讨论】:

  • 这是关于赛车网站的一个很好的观点,可能会注意到来自我的 IP 的大量 HTTP 请求一击即中。我肯定会考虑只缓存计算,毫无疑问,这也会大大加快速度。
  • 我能看到的唯一问题是,也许在将来,我想对整个数据集中的某些内容进行一些分析。例如,假设我想获得上周每场比赛的平均完成时间,由于 HTTP 请求数量巨大,使用 YQL 请求处理它是不可能的,而且由于数据库本质上是用户填充的,所以它是由于用户尚未访问它们,因此可能会丢失许多统计信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
相关资源
最近更新 更多