file_get_contents返回403禁止

abs*_*bsk 26 php curl

我正在尝试制作一个sitecraper.我是在我的本地机器上制作的,它在那里工作得很好.当我在我的服务器上执行相同的操作时,它显示403禁止错误.我正在使用PHP Simple HTML DOM Parser.我在服务器上得到的错误是这样的:

警告:file_get_contents(http://example.com/viewProperty.html?id=7715888)[function.file-get-contents]:无法打开流:HTTP请求失败!HTTP/1.1 403禁止在第40行的/home/scraping/simple_html_dom.php中

触发它的代码行是:

$url="http://www.example.com/viewProperty.html?id=".$id;

$html=file_get_html($url);
Run Code Online (Sandbox Code Playgroud)

我检查了服务器上的php.ini,并且allow_url_fopen是On.可能的解决方案是使用curl,但我需要知道我哪里出错了.

Ika*_*ari 35

我知道这是一个很老的线索,但想到分享一些想法.

最有可能的是,如果您在访问网页时没有获得任何内容,可能它不希望您能够获取内容.那么它如何识别脚本试图访问网页而不是人类?通常,它是User-Agent发送到服务器的HTTP请求中的标头.

因此,为了使网站认为访问网页的脚本也是人,您必须User-Agent在请求期间更改标题.如果将User-Agent标头设置为某些常用Web浏览器使用的值,则大多数Web服务器可能会允许您的请求.

下面列出了浏览器使用的常见用户代理列表:

  • 铬: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'

  • 火狐: 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0'

  • 等等...


$context = stream_context_create(
    array(
        "http" => array(
            "header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
        )
    )
);

echo file_get_contents("www.google.com", false, $context);
Run Code Online (Sandbox Code Playgroud)

这段代码伪造了用户代理并将请求发送到https://google.com.

参考文献:

干杯!

  • `"header" => "User-Agent: <signature>"` 或 `"user_agent" => "<signature>"` [愿意](http://php.net/manual/en/context.http .php)。 (2认同)

Pek*_*ica 19

这不是您的脚本的问题,而是您请求的资源.Web服务器返回"禁止"状态代码.

它可能会阻止PHP脚本以防止抓取,或者如果您提出了太多请求,则阻止您的IP.

您应该与远程服务器的管理员交谈.

  • @absk不,"403 forbidden"显然来自远程服务器.连接正常 - 尝试使用不同的IP进行验证.可能是您的服务器的IP在远程服务器端被阻止 (4认同)
  • 但与此同时,它在我的localhost上运行得很好.问题似乎与我的服务器配置不知何故. (2认同)

小智 7

在包含 simple_html_dom.php 之后添加这个

ini_set('user_agent', 'My-Application/2.5');
Run Code Online (Sandbox Code Playgroud)


Dej*_*vic 5

您可以在第35行及以后的解析器类中像这样更改它。

function curl_get_contents($url)
{
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  $data = curl_exec($ch);
  curl_close($ch);
  return $data;
}

function file_get_html()
{
  $dom = new simple_html_dom;
  $args = func_get_args();
  $dom->load(call_user_func_array('curl_get_contents', $args), true);
  return $dom;
}
Run Code Online (Sandbox Code Playgroud)

您是否尝试过其他网站?


Ser*_*rgi 5

远程服务器似乎有某种类型的阻塞。可能是user-agent,如果是这种情况,您可以尝试使用 curl 来模拟网络浏览器的用户代理,如下所示:

$url="http://www.example.com/viewProperty.html?id=".$id;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
$html = curl_exec($ch);
curl_close($ch);
Run Code Online (Sandbox Code Playgroud)