我正在尝试制作一个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.
参考文献:
干杯!
Pek*_*ica 19
这不是您的脚本的问题,而是您请求的资源.Web服务器返回"禁止"状态代码.
它可能会阻止PHP脚本以防止抓取,或者如果您提出了太多请求,则阻止您的IP.
您应该与远程服务器的管理员交谈.
小智 7
在包含 simple_html_dom.php 之后添加这个
ini_set('user_agent', 'My-Application/2.5');
Run Code Online (Sandbox Code Playgroud)
您可以在第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)
您是否尝试过其他网站?
远程服务器似乎有某种类型的阻塞。可能是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)