我想知道如何在循环(第1页,第2页......)中抓取一个具有无限循环(例如imgur)的网页...?
我尝试了下面的代码,但它只返回第一页。由于无限滚动模板,如何触发下一页?
<?php
$mr = $maxredirect === null ? 10 : intval($maxredirect);
if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) {
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $mr > 0);
curl_setopt($ch, CURLOPT_MAXREDIRS, $mr);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
} else {
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
if ($mr > 0) {
$original_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
$newurl = $original_url;
$rch = curl_copy_handle($ch);
curl_setopt($rch, CURLOPT_HEADER, true);
curl_setopt($rch, CURLOPT_NOBODY, true);
curl_setopt($rch, CURLOPT_FORBID_REUSE, false);
do {
curl_setopt($rch, CURLOPT_URL, $newurl);
$header = curl_exec($rch);
if (curl_errno($rch)) {
$code = 0;
} else {
$code = curl_getinfo($rch, CURLINFO_HTTP_CODE);
if ($code == 301 || $code == 302) {
preg_match('/Location:(.*?)\n/', $header, $matches);
$newurl = trim(array_pop($matches));
// if no scheme is present then the new url is a
// relative path and thus needs some extra care
if(!preg_match("/^https?:/i", $newurl)){
$newurl = $original_url . $newurl;
}
} else {
$code = 0;
}
}
} while ($code && --$mr);
curl_close($rch);
if (!$mr) {
if ($maxredirect === null)
trigger_error('Too many redirects.', E_USER_WARNING);
else
$maxredirect = 0;
return false;
}
curl_setopt($ch, CURLOPT_URL, $newurl);
}
}
return curl_exec($ch);
}
$ch = curl_init('http://www.imgur.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec_follow($ch);
curl_close($ch);
echo $data;
?>
答案 0 :(得分:2)
cURL
通过获取网页的源代码来工作。您的代码将仅从原始网页收集HTML。在imgur的情况下,它将包括~40个图像,以及页面布局的其余部分。
向下滚动时,此原始源代码不会更改。但是,浏览器中的HTML确实如此。这是通过AJAX完成的。您正在查看的页面从第二页请求信息。
如果您使用FireBug(适用于FireFox)或Google Chrome的页面检查程序,则可以通过分别转到网络或网络标签来监控这些请求。当您向下滚动时,该页面将再发出约45个请求(主要用于图像)。您还会看到它请求此页面:
http://imgur.com/gallery/hot/viral/day/page/0?scrolled&set=1
imgur主页上的JavaScript会将此HTML附加到主页的底部。如果要获取图像列表,您可能希望查询此页面(或API,如the other Chris所述)。您可以使用URL末尾的数字来获取更多图像。
答案 1 :(得分:0)
页面抓取很少是出于这种原因的最佳方法。 Imgur offers an API完成了我认为你在不使用任何黑客刮擦的情况下尝试的任务。
如果你与刮痧的想法结合,你将不得不做一些研究。您不需要仅抓取主页面,而是需要记下AJAX请求使用的API,您可以直接调用它并继续抓取后续页面的数据。这种方法的细节超出了本答案的范围,特别是考虑到已有既定的API。
相关阅读