file_get_contents returns html 输入没有任何内容

file_get_contents returns nothing on html input

file_get_contents() returns www.akaar.org but not on www.ptsda.org.

上的正确文件内容

主要区别在于akaar.org is a php project and ptsda.org是html。

基本上我正在 php 中构建网络爬虫。当我成功爬过至少 150 多个站点时,它没有爬过那个特定站点。

http://www.ptsda.org/

是一个 Flash 网站,不能像 HTML 那样容易被抓取

ptsda.org 正在返回此 403(禁止)错误:

failed to open stream: HTTP request failed! HTTP/1.1 403 ModSecurity Action

看起来他们有 Apache ModSecurity 保护来阻止他们的内容以这种方式被抓取。

这里是某些网站不允许抓取的原因。

  1. file_get_contents('http://www.akaar.org/')您可以从网站获取结果,这意味着托管该网站的服务器未配置文件墙来阻止抓取请求。
  2. file_get_contents('http://www.ptsda.org/') 在这种情况下,您将得到 HTTP request failed! HTTP/1.1 403 ModSecurity 作为输出,这意味着服务器配置了防火墙,您不会收到响应。阅读更多关于 ModSecurity.

这里是解决方法,尝试使用CURL instead of file_get_contents。注意:这是一个解决方法。

<?php
    $curl_handle=curl_init();
    curl_setopt($curl_handle, CURLOPT_URL,'http://www.ptsda.org/');
    curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
    curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl_handle, CURLOPT_USERAGENT, 'ptsda');
    $query = curl_exec($curl_handle);
    curl_close($curl_handle);
    //print_r($query);
?>

您的问题是 ptsda.org 的主机返回此 403(禁止)错误:

file_get_contents("http://www.ptsda.org"): failed to open stream: HTTP request failed! HTTP/1.1 403 ModSecurity

这表明他们有适当的保护措施来阻止他们的内容被机器人抓取。您 可能 能够通过在 PHP (See this question).

中设置用户代理字符串来绕过此问题

终于找到解决办法了。

我将页面另存为 HTML 并为我的 php 抓取工具提供了输入。

<?php

     $contents = file_get_contents("The downloaded HTML file");
     print_r($contents);
?>

成功:)

感谢大家的回复。