Php 简单\u html\u dom:403访问被拒绝
为了使用两种不同的“方法”解析HTML页面,我实现了这个函数。 正如您所看到的,两者都使用非常方便的类,名为Php 简单\u html\u dom:403访问被拒绝,php,Php,为了使用两种不同的“方法”解析HTML页面,我实现了这个函数。 正如您所看到的,两者都使用非常方便的类,名为simple\uhtml\udom。 区别在于第一种方法也使用curl加载HTML,而第二种方法不使用curl 这两种方法在很多页面上都可以正常工作,但我正在努力解决这个特定的调用: searchThroughDOM('https://fr.shopping.rakuten.com/offer/buy/3458931181/new-york-1997-4k-ultra-hd-blu-ray
simple\uhtml\udom
。
区别在于第一种方法也使用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“,”简单的“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>';
}
函数searchThroughDOM($url$method)
{
回显“$url=”.$url.“
”.$method=”.$method.“
”;
$time\U start=微时间(真);
开关($方法){
案例“curl”:
$curl=curl_init();
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($curl,CURLOPT_头,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(windowsnt 10.0;Win64;x64)AppleWebKit/537.36(KHTML,像Gecko)Chrome/74.0.3729.169 Safari/537.36');
$str=curl\u exec($curl);
curl_close($curl);
//创建DOM对象
$html=新的简单html\U dom();
//从字符串加载HTML
$html->load($str);
打破
案例“简单”html dom:
$html=新的简单html\U dom();
$html->load_文件($url);
打破
}
$collection=$html->find('h1');
foreach($x=>$x_值的集合){
回显'x='.$x.=>值='.$x_值'.
';
}
$html->save('result.htm');
$html->clear();
$time\U end=微时间(真);
回显“已用时间(DOM)=”。($Time\U end-$Time\U start)。”
;
}
在我看来,“简单的html\U dom”没有错
您可以删除代码中简单的HTMLDOM“部分”,只剩下CURL
我想这就是问题的根源。
有很多原因导致卷曲无法在页面上工作
首先,我可以看到你补充
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
您还应该尝试添加CURLOPT_SSL_VERIFYHOST,false
其次,检查你的卷发版本,看看是否太旧
第三个选项,如果以上都不起作用,您可能希望启用cookie,这可能是由于禁用cookie导致网站检测到它是机器,而不是真人发送请求。
最后,如果上述所有尝试都失败,请尝试其他库,甚至文件获取内容,
卷曲不是你唯一的选择,因为它是最强大的选择。嗨,达曼,当然,在这种情况下,你“必须关闭”有两个原因,1是为了摆脱卷曲是否导致问题,如果你关闭检查,403不见了,你知道问题在哪里。2“fr.shopping.rakuten.com”的服务器不在“StfA”的控制之下。你不能要求他/她向“fr.shopping.rakuten.com”发送电子邮件,说“嗨,伙计们,帮我安装一些严重的SSL证书”,这样我就可以为我/我的老板抓取你的网页。如果你想完成这项工作,必须使用自签名Cpanel认证关闭“VERIFYHOST”的webiste,对吗?嗨,达曼,如果你能简单地接受我在这个例子中是正确的,并给那些曾经/现在/将来对这个问题感到困惑的人一个正确的方式来解决,那就太好了。我不能接受任何东西。如果OP不接受你的答案,那就意味着它可能对他们没有帮助。在我这边,我已经说过,关闭验证几乎从来都不是一个好主意。我不会就此和你争论。