simple_html_dom:403访问被拒绝

时间:2019-08-13 11:44:27

标签: php

我实现了此功能,以便使用两种不同的“方法”来解析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>';
}

1 个答案:

答案 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, 卷毛不是唯一的选择,因为它是最强大的选择。

相关问题