简单网络爬虫速度问题

3
我已经用PHP创建了一个非常简单的网络爬虫,它可以在一些足球网站上抓取比赛结果。
但是当我抓取一个网站时,需要0.5-1秒的时间。如果我有很多URL需要抓取,那么就需要花费很长时间。
以下是我的代码开始抓取网站:
$doc = new DOMDocument();
$doc->loadHTMLFile("http://resultater.dai-sport.dk/tms/Turneringer-og-resultater/Pulje-Stilling.aspx?PuljeId=229");
$xpath = new DOMXpath($doc);

我自己创建了爬虫,也许有更好的方法或更快的方法?或者我的速度期望值太高了?


4
您可以使用线程同时抓取多个网页。 - Iván Pérez
1
有几种策略可以减少加载速度,包括跳过加载图像、静态DNS、缓存等。 - Raptor
@IvánPérez - 我会研究多线程 - 运行同时的线程数量有限制吗? - Andreas Baran
由于您想要在一个站点中爬取许多URL,而不是一个站点中的一个URL,因此您需要减慢速度,而不是加快速度。如果您经常以快速率抓取内容,那么您可以期望被IP阻止。在每个HTTP操作之间放置几秒钟的暂停,并在cron作业上调用脚本。 - halfer
如果您在良好的连接上爬行得太快,您将会(意外地)执行拒绝服务攻击。您可能会受到自动或手动IP/范围阻止的限制。 - halfer
显示剩余5条评论
2个回答

1
请查看这个库,它可以实现你的爬虫的异步操作。它使用了 PHP 5.5 中出现的 "yield":https://github.com/icicleio/Icicle 你可以在库的示例中找到使用案例。

基本上,这只是一种在库中包装pcntl_fork函数的方法。当感到幸运时,请使用pcntl_fork并编写自己的(shell)脚本。 - twicejr
1
但是要使用pcntl扩展功能,您必须在服务器上安装它。Icicle可以在没有它的情况下工作。 - Anton
Icicle不使用pcntl_fork()。它使用非阻塞I/O来调度异步任务。它利用yield来创建可中断的函数。OP可以使用它同时爬取许多网站,因为他脚本的大部分运行时间都消耗在网络操作上的阻塞上。 - Trowski

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接