我有一个合作伙伴为我创造了一些内容
我可以使用浏览器访问该页面,但在尝试使用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);
答案 0 :(得分:30)
这不是您的脚本中的问题,它是您合作伙伴Web服务器安全性的一项功能。
很难确切地说是什么阻止了你,很可能是某种阻止刮擦的方法。如果您的合作伙伴可以访问其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);
答案 1 :(得分:16)
//首先设置用户代理
ini_set('user_agent','Mozilla/4.0 (compatible; MSIE 6.0)');
答案 2 :(得分:0)
我脑子里有两件事,如果你打开一个带有特殊字符的URI,比如空格,你需要用urlencode()编码URI,如果是这个函数,可以用一个URL作为文件名。 fopen包装器已启用。
答案 3 :(得分:0)
另外,如果由于某种原因您请求一个 http 资源,但该资源位于您的服务器上,如果您只将文件作为绝对路径包含进来,您可以省去一些麻烦。
喜欢:/home/sally/statusReport/myhtmlfile.html
而不是
https://example.org/myhtmlfile.html