网络爬虫如何工作?

时间:2012-08-06 19:14:18

标签: php timeout web-crawler

使用一些基本的网站抓取,我正在尝试准备一个数据库进行价格比较,这将减轻用户的搜索体验。现在,我有几个问题:

我应该使用file_get_contents()curl来获取所需网页的内容吗?

$link = "http://xyz.com";
$res55 = curl_init($link);
curl_setopt ($res55, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($res55, CURLOPT_FOLLOWLOCATION, true); 
$result = curl_exec($res55);

此外,每当我抓取一个网页时,我都会获取大量链接以便访问下一个网页。这可能需要很长时间(如果您抓取像Ebay这样的大型网站,则需要几天时间)。在这种情况下,我的PHP代码将超时。应该采用哪种自动方式来做到这一点?有没有办法阻止PHP通过在服务器上进行更改来超时,还是有其他解决方案?

5 个答案:

答案 0 :(得分:7)

  

因此,在这种情况下,我的PHP代码会超时,并且不会持续那么久。

您是否在驱动网页的代码中执行此操作?也就是说,当有人提出请求时,您是否正在爬行并在那里构建响应?如果是这样,那么肯定有更好的方法。

如果您有需要抓取的网站列表,则可以设置预定作业(例如,使用cron)来运行命令行应用程序(不是网页)来抓取网站。此时,您应该解析您正在寻找的数据并将其存储在数据库中。然后,您的网站只需要指向该数据库。

这是一项改进,原因有两个:

  1. 性能
  2. 代码设计
  3. 效果:在像网站这样的请求/响应系统中,您希望最大限度地减少I / O瓶颈。响应应该尽可能少的时间。因此,您希望尽可能避免在线工作。通过将此过程卸载到网站上下文之外并使用本地数据库,您可以将一系列外部服务调用(慢速)转换为单个本地数据库调用(更快)。

    代码设计: Separation of concerns。这个设置会使您的代码更加模块化。您有一个负责获取数据的模块和另一个负责显示数据的模块。他们都不应该知道或关心对方如何完成任务。因此,如果您需要更换一个(例如找到更好的抓取方法),您也不需要更改另一个。

答案 1 :(得分:3)

卷曲是很好的选择。 file_get_contents用于读取服务器上的文件

您可以将curl中的超时设置为0,以便无限制超时。 你必须在Apache上设置超时

答案 2 :(得分:3)

我建议使用curl阅读网站内容。

为避免PHP脚本超时,您可以使用set_time_limit。这样做的好处是您可以设置每个服务器连接的超时以终止脚本,因为调用该方法会重置先前的超时倒计时。如果将0作为参数传递,则不会应用时间限制。

或者,您可以在php配置属性 max_execution_time 中设置超时,但请注意,这将适用于所有PHP脚本而不仅仅是爬虫。

http://php.net/manual/en/function.set-time-limit.php

答案 3 :(得分:3)

我选择了cURL,因为你可以获得更大的灵活性,你可以使用cURL启用压缩和http keep-alive。

但为什么要重新发明轮子呢?查看PHPCrawl。它使用套接字(fsockopen)来下载URL,但同时支持多个抓取工具(在Linux上),并且有很多爬行选项可能满足您的所有需求。他们也为您处理超时,并为基本爬虫提供了很好的示例。

答案 4 :(得分:2)

你可以在这里重新发明轮子,但为什么不看一下像PHPCrawlSphider这样的框架呢? (虽然后者可能不是你想要的)

根据the documentationfile_get_contents最适合阅读服务器上的文件,因此我强烈建议您改用curl。至于修复任何超时问题,set_time_limit是您想要的选项。 set_time_limit(0)应阻止您的脚本超时。

但是,您也希望在Apache中设置超时。修改您的httpd.conf并将阅读Timeout的行更改为Timeout 0无限超时。