我实现了此功能,以便使用两种不同的“方法”来解析HTML页面。
如您所见,两者都使用了非常方便的类simple_html_dom
。
区别在于,第一种方法也使用curl来加载HTML,而第二种方法不使用curl
这两种方法在很多页面上都可以正常工作,但是我为此特定的调用而苦苦挣扎:
searchThroughDOM('https://fr.shopping.rakuten.com/offer/buy/3458931181/new-york-1997-4k-ultra-hd-blu-ray-blu-ray-bonus-edition-boitier-steelbook.html', 'simple_html_dom');
在两种情况下,我最终都会收到403访问被拒绝的响应。 我做错什么了吗? 还是有另一种方法可以避免这种拒绝?
function searchThroughDOM ($url, $method)
{
echo '$url = '.$url.'<br>'.'$method = '.$method.'<br><br>';
$time_start = microtime(true);
switch ($method) {
case 'curl':
$curl = curl_init();
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_REFERER, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36');
$str = curl_exec($curl);
curl_close($curl);
// Create a DOM object
$html = new simple_html_dom();
// Load HTML from a string
$html->load($str);
break;
case 'simple_html_dom':
$html = new simple_html_dom();
$html->load_file($url);
break;
}
$collection = $html->find('h1');
foreach($collection as $x => $x_value) {
echo 'x = '.$x.' => value = '.$x_value.'<br>';
}
$html->save('result.htm');
$html->clear();
$time_end = microtime(true);
echo 'Elapsed Time (DOM) = '.($time_end - $time_start).'<br><br>';
}
答案 0 :(得分:-1)
从我的角度来看,“ simple_html_dom”没有任何问题 您可以删除代码的简单html dom“部分”,仅留给CURL 我认为这是问题的根源。 有很多原因导致卷曲无法在页面上使用 首先,我可以看到您添加
curl_setopt($ curl,CURLOPT_SSL_VERIFYPEER,false); 您还应该尝试添加CURLOPT_SSL_VERIFYHOST,false
其次,检查您的curl版本,看它是否太旧 第三种选择,如果以上都不起作用,则可能要启用cookie,可能是cookie禁用导致网站检测到它是机器,而不是真人发送请求。 最后,如果以上所有尝试均失败,请尝试其他库甚至file_get_content, 卷毛不是唯一的选择,因为它是最强大的选择。