我正在尝试通过将 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);