从网站(在PHP中)抓取数据的最有效方法是什么?

时间:2010-02-09 00:26:42

标签: php screen-scraping

我试图从IMDB中抓取数据,但自然会有很多页面,并且以连续方式执行它需要太长时间。即使我做多线程CURL。

有更快的方法吗?

是的我知道IMDb提供了文本文件,但它们并不以任何理智的方式提供所有内容。

2 个答案:

答案 0 :(得分:1)

我用PHP进行了大量的暴力破解,顺序处理似乎很好。我不确定“你需要多长时间”,但我经常在其他事情上做其他事情。

通常情况下,没有任何东西取决于我的实时抓取,它的重要数据,我通常会刮掉它并同时按摩它。

其他时候我会使用一个狡猾的wget命令来下载一个站点并在本地保存。然后有一个带有一些正则表达式魔法的PHP脚本提取数据。

我在PHP中使用curl_ *并且效果非常好。

您可以拥有一个父作业,该作业会分析子进程,为其提供URL以进行抓取,并在本地处理并保存数据(db,fs等)。父母负责确保相同的网址不会被处理两次而儿童不会挂起。

在linux(pcntl_,fork等)上很容易做到,在Windows机器上更难。

您还可以添加一些逻辑来查看最后修改时间和(您之前存储的),并且如果内容没有更改或您已经拥有它,则跳过抓取页面。可能会有一些优化技巧,你可以这样做。

答案 1 :(得分:0)

如果你正在使用curl_multi_add_handle和curl_multi_select正确使用cURL,那么你无能为力。您可以进行测试以找到要为系统处理的最佳句柄数。太少了,你会把你的带宽闲置得太多,而且你会松开太多时间来切换手柄。

您可以尝试使用master-worker多进程模式来并行运行许多脚本实例,每个脚本实例使用cURL来获取并稍后处理页面块。像http://gearman.org/?id=gearman_php_extension这样的框架可以帮助创建优雅的解决方案,但在Unix上使用过程控制功能或在后台调用脚本(通过系统shell或通过非阻塞HTTP)也可以很好地工作。