2010-07-24 114 views
1

如何将标题发送到网站,就好像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它的作品...我错过了什么使它看起来像一个完整的浏览器?

+0

设置[卷曲](HTTP:/ /www.php.net/curl)? – BoltClock 2010-07-24 06:11:32

+0

我正在使用cURL – 2010-07-24 06:23:27

回答

3

对于卷曲,存在对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>"); 
+0

检查我的更新后... target.com不工作,返回一个空字符串,但Twitter的作品。有任何想法吗? – 2010-07-24 06:42:04

+1

关于你的代码: 1.你应该尝试增加超时至少10 2.您应该抓住头了。用curl_setopt($ curl_handle,CURLOPT_HEADER,true);在杀死你的句柄之前,你应该从curl_error($ curl_handle)中检索错误。它会为您提供进一步的提示,确切地说错了什么。 – 2010-07-24 07:04:00

+0

你摇滚!这是一个301移动到www,如果我做了http://www.target.com它的作品。那么,我如何关注所有的301s直到200? – 2010-07-24 07:10:01

2

如果您使用的卷曲,可以使用CURLOPT_HTTPHEADER选项,它可以将您希望与发送请求头的数组。

如果您使用的是file_get_contents(),则可以将其传递给使用stream_create_context()创建的流上下文。

+0

你知道如何改变浏览器吗? – 2010-07-24 06:23:01

+0

这将是'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

+0

谢谢,我还添加了Daniel的代码,但它仍然为target.com和twitter.com返回一个空字符串...任何想法为什么? – 2010-07-24 06:40:20