我在php中有这个cURL
代码。
curl_setopt($ch, CURLOPT_URL, trim("http://stackoverflow.com/questions/tagged/java"));
curl_setopt($ch, CURLOPT_PORT, 80); //ignore explicit setting of port 80
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_setopt($ch, CURLOPT_HTTPHEADER, $v);
curl_setopt($ch, CURLOPT_VERBOSE, true);
HTTPHEADER
的内容是;
Proxy-Connection: Close
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1017.2 Safari/535.19
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: __qca=blabla
Connection: Close
数组$v
中的每个项目。
当我在主机上传文件并运行代码时,我得到的是:
400错误请求
您的浏览器发送了无效请求。
但是当我使用命令行PHP在我的系统上运行它时,我得到的是这个和整页。
< HTTP/1.1 200 OK
< Vary: Accept-Encoding
< Cache-Control: private
< Content-Type: text/html; charset=utf-8
< Content-Encoding: gzip
< Date: Sat, 03 Mar 2012 21:50:17 GMT
< Connection: close
< Set-Cookie: buncha cokkies; path=/; HttpOnly
< Content-Length: 22151
<
* Closing connection #0
不仅仅是在stackoverflow上,这种情况发生了,它也发生在4shared上,但适用于谷歌和其他人。
感谢您的帮助。
答案 0 :(得分:1)
您的空CURLOPT_ENCODING参数导致问题。如果您不想要gzip / deflate,只需省略标题。
我也看到你在curl_setopt()和HTTP_HEADER
数组中定义了编码。
您应该尽可能使用本机curl_setopt()
命令。 CURLOPT_USERAGENT
是您可以移出HTTP_HEADER
数组的地方。
但正如安德鲁马歇尔所说,屏幕刮擦不是你应该做的事情;特别是因为他们有API。
修改强>
以下是我使用的示例脚本:
<?php
$v = Array(
'Proxy-Connection: Close',
'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1017.2 Safari/535.19',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language: en-US,en;q=0.8',
'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Cookie: __qca=blabla',
'Connection: Close'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, trim("http://stackoverflow.com/questions/tagged/java"));
//curl_setopt($ch, CURLOPT_PORT, 80); //ignore explicit setting of port 80
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
//curl_setopt($ch, CURLOPT_ENCODING, "");
curl_setopt($ch, CURLOPT_HTTPHEADER, $v);
curl_setopt($ch, CURLOPT_VERBOSE, true);
echo curl_exec($ch);
?>
现在我通过命令行运行它,但净效果是一样的。我删除了$v
数组中的Accept-Encoding,因此我可以得到未压缩的输出。
我们尚未建立的一件事是您的PHP和libcurl版本。对我来说,这是带有libcurl 7.12.1的PHP 5.3.2。这很重要。您可以在命令行上通过php -i | grep -i curl
找到libcurl版本,也可以通过服务器上基于Web的脚本找到phpinfo()
。
答案 1 :(得分:0)
似乎有些标题在某些网站上打破了预期的请求模式。解决此问题的最简单方法是逐个删除标题并进行测试。
我认为它应该是编码的。
答案 2 :(得分:-2)
似乎缺少“主机”标头:
Host: stackoverflow.com