【问题标题】:file_get_contents() give me 403 Forbiddenfile_get_contents() 给我 403 Forbidden
【发布时间】:2012-07-25 17:07:04
【问题描述】:

我有一个合作伙伴创建了一些内容供我抓取。
我可以使用我的浏览器访问该页面,但是当我尝试使用file_get_contents 时,我得到了一个403 forbidden

我尝试过使用stream_context_create,但这无济于事 - 可能是因为我不知道应该在那里输入什么。

1) 我有什么方法可以抓取数据吗?
2) 如果没有,并且不允许合作伙伴配置服务器允许我访问,我该怎么办?

我尝试使用的代码:

$opts = array(
  'http'=>array(
    'user_agent' => 'My company name',
    'method'=>"GET",
    'header'=> implode("\r\n", array(
      'Content-type: text/plain;'
    ))
  )
);

$context = stream_context_create($opts);

//Get header content
$_header = file_get_contents($partner_url,false, $context);

【问题讨论】:

    标签: php html http-headers screen-scraping


    【解决方案1】:

    这不是您脚本中的问题,它是您合作伙伴网络服务器安全性中的一项功能。

    很难说到底是什么阻碍了你,很可能是某种阻碍抓取。如果您的合作伙伴可以访问他的网络服务器设置,这可能有助于查明。

    您可以做的是通过设置用户代理标头来“伪造网络浏览器”,使其模仿标准网络浏览器。

    我建议使用 cURL 来执行此操作,并且很容易找到执行此操作的好文档。

        // create curl resource
        $ch = curl_init();
    
        // set url
        curl_setopt($ch, CURLOPT_URL, "example.com");
    
        //return the transfer as a string
        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');
    
        // $output contains the output string
        $output = curl_exec($ch);
    
        // close curl resource to free up system resources
        curl_close($ch); 
    

    【讨论】:

    • 我也打算推荐 cURL。我也用过。您可以将您的用户代理设置为您想要的任何内容,因此只需选择一个常见的,如 IE,您可能会通过此锁定。
    • @clerick,谢谢,我会试试的。我只需要弄清楚如何在我的网络服务器上启用CURL - 因为我收到一条消息说curl_init() 是一个未知功能。
    • 祝你好运,我认为这可能会帮助你安装 cURL stackoverflow.com/questions/1347146/how-to-enable-curl-in-php
    【解决方案2】:

    //先设置用户代理

    ini_set('user_agent','Mozilla/4.0 (compatible; MSIE 6.0)'); 
    

    【讨论】:

    • 我已经尝试过了,但没有成功。但可能是因为我没有使用公认的代理。
    • 我在调用 file_get_contents() 时遇到了一个禁止的 403 错误,并在我的调用解决我的问题之前添加了这个 ini_set
    • 谢谢。我想先使用 curl,它已安装、启用并显示在我的 phpinfo 中,但没有定义函数,所以我曾经使用普通的 file_get_contents 函数。实际上 github api 需要一个浏览器代理。感谢您的解决方案。 +1
    • ini_set('user_agent','Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); 对我有用。
    【解决方案3】:

    我有两件事,如果您要打开带有特殊字符(例如空格)的 URI,则需要使用 urlencode() 对 URI 进行编码,并且如果fopen 包装器已启用。

    【讨论】:

      【解决方案4】:

      此外,如果您出于某种原因请求 http 资源,但该资源位于您的服务器上,您只需将文件作为绝对路径包含在内,就可以省去一些麻烦。

      点赞:/home/sally/statusReport/myhtmlfile.html
      而不是
      https://example.org/myhtmlfile.html

      【讨论】:

        猜你喜欢
        • 2018-11-22
        • 1970-01-01
        • 2016-06-09
        • 2014-02-17
        • 1970-01-01
        • 1970-01-01
        • 2014-07-20
        • 1970-01-01
        相关资源
        最近更新 更多