如何使网页抓页继续工作

时间:2012-06-08 18:59:43

标签: php web-scraping

假设我创建了一个网页抓取PHP页面(getdata.php),它通过cUrl获取特定网站页面的内容,而不是将一些有用的信息保存到txt文件或数据库。

getdata.php的伪代码,

min = get latest search id from database
max = 1.000.000 (yes one million different pages)

while (min < max) {

  url = "http://www.website.com/page.php?id=".$min
  content = getContentFromURL(url)
  saveUsefulInfoToDb(content)
  min++
  set latest search id as min in database
}

没关系,过程是,

  1. 在浏览器上打开getdata.php
  2. 等待
  3. 还在等待,因为有大约一百万页会被刮掉。
  4. 等待
  5. 最后请求时间。
  6. 故障
  7. 所以问题是我不知道如何使这个过程合理。在浏览器上打开页面并等待它完成抓取URL,我认为这是一个非常糟糕的做法。

    如何让getdata.php在像cron这样的后台运行?

    最好的方法是什么?

    感谢。

2 个答案:

答案 0 :(得分:3)

除了@hackartists的答案之外,我还想添加不要通过浏览器调用这个PHP页面。而是从命令行调用它

http://www.php.net/manual/en/features.commandline.introduction.php

  

在浏览器上打开getdata.php

应该是

  

使用cron

安排getdata.php从命令行运行

此外,记录成功或失败,以便您可以设置一些日志文件监视,以了解您的Web抓取作业何时失败(毕竟,您不希望每天坐在浏览器前面并自己监视)。 / p>

答案 1 :(得分:2)

在代码顶部使用

set_time_limit(0);
ignore_user_abort(true);

然后每天或在需要时使用cron来启动它。你肯定希望这是一个后台进程,而不是一个网页。这两行将允许它无限期地作为网页或cmd行脚本运行。如果你想把它作为一个网页,你仍然可以使用cron用“

”这样的行“解雇”它
0 0 * * * /usr/bin/curl "http://yoursite.com/getdata.php" >> "/var/www/errors.log"

一些建议,因为我已经多次这样做了:肯定会创建一个日志功能来打印到文件,以便您可以看到它在运行时正在做什么,或者您将无法查看和编程到php文件中kill switch让你可以告诉它停止运行而不必使用unix top或重启apache。在一段时间内硬编码可能是一个好主意,它会在一定时间后停止,以免它运行超过一天而第二个实例启动并且你有几个同时运行。