通过PHP发送浏览器标题
如何将标题发送到网站,就好像PHP/Apache是浏览器一样?我试图刮一个网站,但它看起来像他们发送一个404错误,如果它来自另一台服务器...通过PHP发送浏览器标题
或者,如果你知道任何其他好方法从网站刮内容?
而且,这里是我当前的代码:
<?php
$curl_handle=curl_init();
curl_setopt($curl_handle,CURLOPT_URL,$_GET['url']);
curl_setopt($curl_handle, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
curl_setopt($curl_handle, CURLOPT_REFERER, "http://google.com");
curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,2);
curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1);
$buffer = curl_exec($curl_handle);
curl_close($curl_handle);
echo $buffer;
?>
所以,我会作出像一个AJAX请求:
/spider.php?url=http://target.com
它返回一个空字符串。我知道这是设置正确,但因为如果我切换目标与twitter.com它的作品...我错过了什么使它看起来像一个完整的浏览器?
对于卷曲,存在对CURLOPT_USERAGENT选项,
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
但是它也可能是否使用检查Referer标头,其可以通过
curl_setopt($ch, CURLOPT_REFERER, "http://<somesite>");
检查我的更新后... target.com不工作,返回一个空字符串,但Twitter的作品。有任何想法吗? – 2010-07-24 06:42:04
关于你的代码: 1.你应该尝试增加超时至少10 2.您应该抓住头了。用curl_setopt($ curl_handle,CURLOPT_HEADER,true);在杀死你的句柄之前,你应该从curl_error($ curl_handle)中检索错误。它会为您提供进一步的提示,确切地说错了什么。 – 2010-07-24 07:04:00
你摇滚!这是一个301移动到www,如果我做了http://www.target.com它的作品。那么,我如何关注所有的301s直到200? – 2010-07-24 07:10:01
如果您使用的卷曲,可以使用CURLOPT_HTTPHEADER
选项,它可以将您希望与发送请求头的数组。
如果您使用的是file_get_contents()
,则可以将其传递给使用stream_create_context()
创建的流上下文。
你知道如何改变浏览器吗? – 2010-07-24 06:23:01
这将是'User-Agent'标头。我的浏览器发送的User-Agent头是Mozilla/5.0(X11; U; Linux x86_64; en-US; rv:1.9.2.8pre)Gecko/20100718 Ubuntu/10.04(lucid)Namoroka/3.6.8pre' for实例。 – 2010-07-24 06:33:39
谢谢,我还添加了Daniel的代码,但它仍然为target.com和twitter.com返回一个空字符串...任何想法为什么? – 2010-07-24 06:40:20
设置[卷曲](HTTP:/ /www.php.net/curl)? – BoltClock 2010-07-24 06:11:32
我正在使用cURL – 2010-07-24 06:23:27