我正在尝试使用PHP和cURL库来编写我的第一个爬虫。我的目标是系统地从一个站点获取数据,这意味着代码不会跟踪给定站点上的所有超链接,而只是特定的链接。
我代码的逻辑是转到主页,获取几个类别的链接,并将这些链接存储在一个数组中。一旦完成,爬虫就会转到页面上的那些分类站点,并查看该分类是否有多个页面。如果是这样,它还会将子页面存储在另一个数组中。最后,我合并数组以获得需要抓取的站点的所有链接,并开始获取所需的数据。
我调用下面的函数来启动cURL会话并将数据获取到一个变量,稍后将该变量传递给一个DOM对象,并使用Xpath对其进行解析。我将cURL total_time和http_code存储在日志文件中。
问题是爬虫运行了5-6分钟,然后停止,并且没有获取所有需要的子页面链接。我打印数组的内容来检查结果。我在日志中看不到任何http错误,所有站点都给出了http 200状态代码。即使我在本地主机上打开PHP debug,我也看不到任何与PHP相关的错误。
我假设网站在几分钟后阻止了我的爬虫,因为太多的请求,但我不确定。有没有办法获得更详细的调试?你认为PHP对这种类型的活动足够吗?因为我以后不想使用相同的机制从100多个其他网站获取内容?
我的cURL代码如下:
function get_url($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_URL, $url);
$data = curl_exec($ch);
$info = curl_getinfo($ch);
$logfile = fopen("crawler.log","a");
echo fwrite($logfile,'Page ' . $info['url'] . ' fetched in ' . $info['total_time'] . ' seconds. Http status code: ' . $info['http_code'] . "\n");
fclose($logfile);
curl_close($ch);
return $data;
}
// Start to crawle main page.
$site2crawl = 'http://www.site.com/';
$dom = new DOMDocument();
@$dom->loadHTML(get_url($site2crawl));
$xpath = new DomXpath($dom);发布于 2013-01-01 20:12:16
使用set_time_limit延长脚本可以运行的时间。这就是为什么你在错误日志中得到Fatal error: Maximum execution time of 30 seconds exceeded的原因。
发布于 2013-01-01 05:15:53
您需要在服务器上运行此程序吗?如果不是这样,您应该尝试使用php的cli版本-它不受常见限制的限制。
https://stackoverflow.com/questions/14105471
复制相似问题