【发布时间】:2014-05-22 16:51:10
【问题描述】:
我正在尝试抓取网站的页面以获取某些文本内容。 新页面总是被添加,所以我希望能够增加每个页面(使用固定格式的 URL),直到我得到 404。
页面采用以下格式:
http://thesite.com/page-1.html
http://thesite.com/page-2.html
http://thesite.com/page-3.html
……等等……
一切顺利,直到它到达第 36 页,然后就死了(甚至没有到达 404 测试用例)。我知道这个示例中存在大约 100 个页面,我可以手动查看它们,没有任何问题。另外,第36页没有错误。
测试用例 - 我尝试循环 http://google.com 50 次,并且 cURL 递归没有问题。似乎只是我真正想要 cURL 的网站,或者我的服务器上的东西。
这似乎是对远程服务器或我的服务器的某种限制,因为我可以毫无延迟地一遍又一遍地运行此页面,并且我总是在它死之前读取 36 个页面。
远程服务器可以对 cURL 请求设置限制吗?我还需要增加其他超时吗?是否可能是服务器内存问题?
**递归抓取函数:** ($curl 对象是在第一次调用该方法时创建的,然后只是通过引用传递。我读到这比创建和关闭大量 cURL 对象要好)
function scrapeSite(&$curl,$preURL,$postURL,$parameters,$currentPage){
//Format URL
$formattedURL = $preURL.$currentPage.$postURL;
echo "Formatted URL: ".$formattedURL."<br>";
echo "Count: ".$currentPage."<br>";
//Create CURL Object
curl_setopt($curl, CURLOPT_URL, $formattedURL);
//Set PHP Timeout
set_time_limit(0);// to infinity for example
//Check for 404
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if($httpCode == 404 || $currentPage == 50) {
curl_close($curl);
return 'PAGE NOT FOUND<br>';
}
//Set other CURL Options
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT ,0);
curl_setopt($curl, CURLOPT_FRESH_CONNECT, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 400); //timeout in seconds
$content = curl_exec($curl);
$html = str_get_html($content);
echo "Parameter Check: ".is_array($html->find($parameters))."<br>";
if(is_array($html->find($parameters))>0){
foreach($html->find($parameters) as $element) {
echo "Text: ".$element->plaintext."<br>";
}
return scrapeSite($curl,$preURL,$postURL,$parameters,$currentPage+1);
}else{
echo "No Elements Found";
}
}
【问题讨论】:
-
可能是防火墙阻止了?
-
如果我重新加载页面,防火墙阻止不会阻止请求吗?我可以根据需要多次重新加载页面,并且脚本始终运行,仅在第 36 页停止。
-
是否同时连接 36 次?还是 1 比 1?完成 1 页然后继续下一页?
-
@CreativeMind 一页又一页。循环当前页面查找指定元素,完成后调用递归函数进入下一页。
标签: php curl timeout remote-server limits