我试图通过将PHP与cURL库一起编写我的第一个爬虫。我的目标是系统地从一个站点获取数据,这意味着代码不遵循给定站点上的所有超链接,而只是跟踪特定链接。
我的代码的逻辑是转到主页面并获取几个类别的链接并将它们存储在一个数组中。完成后,抓取工具会转到页面上的这些类别网站,并查看该类别是否包含多个网页。如果是这样,它还将子页面存储在另一个数组中。最后,我合并了数组,以获取需要抓取的网站的所有链接,并开始获取所需的数据。
我调用下面的函数来启动一个cURL会话并将数据提取到一个变量,我稍后将其传递给DOM对象并用Xpath解析它。我将cURL total_time和http_code存储在日志文件中。
问题是抓取工具运行5-6分钟然后停止,并且不会获取子页面的所有必需链接。我打印数组的内容来检查结果。我在日志中看不到任何http错误,所有网站都提供了http 200状态代码。即使我在本地主机上打开PHP调试,我也看不到任何与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);
答案 0 :(得分:1)
使用set_time_limit延长脚本运行的时间。这就是您在错误日志中获得Fatal error: Maximum execution time of 30 seconds exceeded
的原因。
答案 1 :(得分:0)
你需要在服务器上运行吗?如果没有,你应该尝试使用php的cli版本 - 它不受常见限制