0

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

我应该使用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 超时,或者还有其他解决方案吗?

4

5 回答 5

7

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

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

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

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

  1. 表现
  2. 代码设计

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

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

于 2012-08-06T19:23:42.897 回答
3

curl 是不错的选择。file_get_contents 用于读取服务器上的文件

您可以将 curl 中的超时设置为 0 以获得无限超时。您也必须在 Apache 上设置超时

于 2012-08-06T19:18:49.120 回答
3

我推荐使用 curl 来阅读网站内容。

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

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

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

于 2012-08-06T19:21:14.373 回答
3

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

但为什么要重新发明轮子呢?查看PHPCrawl。它使用套接字fsockopen(他们也为您处理超时,并为基本的爬虫提供了很好的示例。

于 2012-08-06T19:21:36.290 回答
2

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

根据文档file_get_contents最适合读取服务器上的文件,因此我强烈建议您curl改用。至于解决任何超时问题,set_time_limit是您想要的选项。set_time_limit(0)应该防止您的脚本超时。

但是,您还需要在 Apache 中设置超时。编辑您的httpd.conf并将读取的行更改TimeoutTimeout 0无限超时。

于 2012-08-06T19:20:20.060 回答