25

我有一个合作伙伴为我创建了一些内容供我抓取。
我可以使用浏览器访问该页面,但是在尝试使用 user 时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);
4

4 回答 4

42

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

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

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

我建议使用 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); 
于 2012-07-27T02:44:40.790 回答
27

//先设置用户代理

ini_set('user_agent','Mozilla/4.0 (compatible; MSIE 6.0)'); 
于 2012-07-27T03:04:14.003 回答
0

我有两件事,如果您要打开一个带有特殊字符(例如空格)的 URI,则需要使用 urlencode() 对 URI 进行编码,并且如果 fopen 包装器有,则可以使用此函数将 URL 用作文件名已启用。

于 2012-07-27T02:50:08.977 回答
0

此外,如果由于某种原因您正在请求 http 资源,但该资源存在于您的服务器上,如果您只是将文件包含为绝对路径,则可以为自己节省一些麻烦。

喜欢:/home/sally/statusReport/myhtmlfile.html
而不是
https://example.org/myhtmlfile.html

于 2021-07-20T21:19:00.847 回答