首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP cURL crawler无法获取所有数据

PHP cURL crawler无法获取所有数据
EN

Stack Overflow用户
提问于 2013-01-01 03:39:28
回答 2查看 1.6K关注 0票数 1

我正在尝试使用PHP和cURL库来编写我的第一个爬虫。我的目标是系统地从一个站点获取数据,这意味着代码不会跟踪给定站点上的所有超链接,而只是特定的链接。

我代码的逻辑是转到主页,获取几个类别的链接,并将这些链接存储在一个数组中。一旦完成,爬虫就会转到页面上的那些分类站点,并查看该分类是否有多个页面。如果是这样,它还会将子页面存储在另一个数组中。最后,我合并数组以获得需要抓取的站点的所有链接,并开始获取所需的数据。

我调用下面的函数来启动cURL会话并将数据获取到一个变量,稍后将该变量传递给一个DOM对象,并使用Xpath对其进行解析。我将cURL total_time和http_code存储在日志文件中。

问题是爬虫运行了5-6分钟,然后停止,并且没有获取所有需要的子页面链接。我打印数组的内容来检查结果。我在日志中看不到任何http错误,所有站点都给出了http 200状态代码。即使我在本地主机上打开PHP debug,我也看不到任何与PHP相关的错误。

我假设网站在几分钟后阻止了我的爬虫,因为太多的请求,但我不确定。有没有办法获得更详细的调试?你认为PHP对这种类型的活动足够吗?因为我以后不想使用相同的机制从100多个其他网站获取内容?

我的cURL代码如下:

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-01 20:12:16

使用set_time_limit延长脚本可以运行的时间。这就是为什么你在错误日志中得到Fatal error: Maximum execution time of 30 seconds exceeded的原因。

票数 1
EN

Stack Overflow用户

发布于 2013-01-01 05:15:53

您需要在服务器上运行此程序吗?如果不是这样,您应该尝试使用php的cli版本-它不受常见限制的限制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14105471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档