好吧,我试图用curl打开页面http://gratka.pl来获取它的内容,不幸的是它们似乎对它有很好的保护。我的代码(在ZEND FW中):
$client = new \Zend\Http\Client;
$client->setHeaders($options);
$adapter = new \Zend\Http\Client\Adapter\Curl();
$agent = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; chromeframe/13.0.782.218; chromeframe; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)';
//$agent = 'Googlebot/2.1 (+http://www.googlebot.com/bot.html)';
$header=array(
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language: en-us,en;q=0.5',
'Accept-Encoding: gzip,deflate',
'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7',
'Keep-Alive: 115',
'Connection: keep-alive',
);
$clientOptions = array(
'curloptions' => array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => true,
//CURLOPT_ENCODING => "gzip",
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_USERAGENT => $agent,
CURLOPT_VERBOSE => true,
CURLOPT_AUTOREFERER => true,
CURLOPT_COOKIEJAR => 'cookie.txt',
CURLOPT_COOKIEFILE => 'cookie.txt',
CURLOPT_HTTPHEADER => $header,
CURLOPT_REFERER => "http://google.com",
//CURLOPT_COOKIE => 'sesja_gratka=065ad930ce08fa203b39e2599f19e345; __gfp_64b=8IF3rdQKeCJiUBB.P4vNx3KWyCYii.16iOnjxq.C6tz.77; PHPSESSID=26f34d5c637c9db9c752695b2a2db427; __utmc=239465948',
),
);
$client->setOptions($clientOptions);
$client->setAdapter($adapter);
$client->setUri($url);
$result = $client->send();
$cookies = $client->getCookies();
$header = $result->getHeaders();
$body = $result->getBody();
var_dump($body);die;
var_dump(htmlspecialchars($header));die;
我正在尝试许多选项和事情,但仍然是相同的 - 没有得到饼干,没有得到身体......除了有效的网站内容我一直在得到的所有页面说 - '你是临时阻止“。用浏览器打开同一个网站时一切都很好。
答案 0 :(得分:0)
如果生成了cookie.txt
,则将其清空并再次运行卷曲。可能是它根据cookie的值阻止了你。
如果未生成cookie.txt
文件,则使用绝对路径,例如/var/xyz/cookie.txt
,并检查您是否对该文件具有写入权限,以便curl可以在该文件上写入cookie。
此外,详细模式返回了什么?您可以将请求与浏览器的请求进行匹配。你在同一台PC上运行浏览器和卷曲吗?或者它部署在你的服务器上?只是为了交叉检查!