file_get_contents返回 403 禁止访问

2022-08-30 13:12:58

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

警告:file_get_contents(http://example.com/viewProperty.html?id=7715888) [function.file-get-content]: 无法打开流: 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);

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


答案 1

我知道这是一个相当古老的线索,但我想分享一些想法。

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

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

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

  • 铬:'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 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.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);

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

引用:

干杯!


答案 2

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

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

您可能应该与远程服务器的管理员联系。


推荐