我正在尝试保存http://www.woorank.com搜索结果中的信息。该网站缓存热门网站的数据,但对于大多数人来说,您需要在返回报告之前进行搜索。所以我尝试了这个:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.woorank.com/en/report/generate');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('url'=>'hellothere.com'));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
curl_close($ch);
似乎(基于curl输出)重定向到http://www.woorank.com/en/www/hellothere.com,就像搜索后应该一样,但它不会生成报告,只是说明还没有报告(就像你在报告时那样)直接访问网址。
我做错了吗?或者是否无法检索此信息?
请求标头:http://pastebin.com/3ijZfMmF
(Request-Line) POST /en/report/generate HTTP/1.1 Host www.woorank.com User-Agent Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 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 Referer http://www.woorank.com/ Cookie __utma=201458455.1161920622.1291713267.1291747441.1291773488.4; __utmc=201458455; __utmz=201458455.1291713267.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmb=201458455.1.10.1291773488 Content-Type application/x-www-form-urlencoded Content-Length 16
我不确定如何从测试脚本中获取请求标头,但使用它:
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
$headers = curl_getinfo($ch);
$headers
var包含:
Array ( [url] => http://www.woorank.com/en/www/someothersite.com [content_type] => text/html; charset=UTF-8 [http_code] => 200 [header_size] => 841 [request_size] => 280 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 1 [total_time] => 0.904581 [namelookup_time] => 3.2E-5 [connect_time] => 3.3E-5 [pretransfer_time] => 3.7E-5 [size_upload] => 155 [size_download] => 5297 [speed_download] => 5855 [speed_upload] => 171 [download_content_length] => 5297 [upload_content_length] => 0 [starttransfer_time] => 0.242975 [redirect_time] => 0.577306 [request_header] => GET /en/www/someothersite.com HTTP/1.1 Host: www.woorank.com Accept: */* )
在我看来,这是在提交搜索表单后发生的重定向。但我不确定是否根本没有POST,或者在这些标题中看不到它。但由于它不起作用,我猜它是前者。
curl_exec
的输出只是来自http://www.woorank.com/en/www/someothersite.com的HTML。
我尝试使用以下方法将一些标题添加到curl请求中
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
,例如
$headers = array(
"Host: www.woorank.com",
"Referer: http://www.woorank.com/"
);
不对表单进行POST,但现在curl_exec
显示响应标头。这是区别:
Firefox,来自网站的响应标题:
HTTP/1.1 302 Found Date Wed, 08 Dec 2010 02:19:18 GMT Server Apache/2.2.9 (Fedora) X-Powered-By PHP/5.2.6 Set-Cookie language=en; expires=Wed, 08-Dec-2010 03:19:18 GMT; path=/ Set-Cookie generate=somesite.com; expires=Wed, 08-Dec-2010 03:19:19 GMT; path=/ Location /en/www/somesite.com Cache-Control max-age=1 Expires Wed, 08 Dec 2010 02:19:19 GMT Vary Accept-Encoding,User-Agent Content-Encoding gzip Content-Length 20 Keep-Alive timeout=1, max=100 Connection Keep-Alive Content-Type text/html; charset=UTF-8
来自test.php:
HTTP/1.1 302 Found Date: Wed, 08 Dec 2010 02:27:21 GMT Server: Apache/2.2.9 (Fedora) X-Powered-By: PHP/5.2.6 Set-Cookie: language=en; expires=Wed, 08-Dec-2010 03:27:21 GMT; path=/ Set-Cookie: generate=someothersite.com; expires=Wed, 08-Dec-2010 03:27:22 GMT; path=/ Location: /en/www/someothersite.com Cache-Control: max-age=1 Expires: Wed, 08 Dec 2010 02:27:22 GMT Vary: Accept-Encoding,User-Agent Content-Length: 0 Keep-Alive: timeout=1, max=100 Connection: Keep-Alive Content-Type: text/html; charset=UTF-8
我只注意到测试中遗漏了Content-Encoding gzip
和Content-Length 20
。不知道这意味着什么,但是当向标题添加“Content-Length:20”时,它说“HTTP / 1.1 413请求实体太大”并且什么都不做;添加“Content-Encoding:gzip”使其返回HTML gzip(我假设,因为它看起来像这样:“<ÍXésÚ8ÿœüZíì&amp;]ìºG”æè1MmÚ...“)。
希望此信息有所帮助。
答案 0 :(得分:1)
您希望确保匹配必要的标头。使用cURL发出要模拟的请求,并在此处发布标题。在firefox或类似工具上使用像HTTPFox这样的插件。然后我们可以看看您的查询是否与标题匹配
答案:我自己查看了该网站,发现它使用Cookie来确保您在生成报告之前不是一个简单的机器人。可以通过更新cURL脚本来生成正确的cookie来避免这种情况。
您可能还需要绕过其他简单检查(例如Referer,User-Agent等),但您可以使用cURL完成所有操作。
但是,他们可能会使用这种cookie保护,因为他们不希望人们抓取他们的数据。如果你要破解这个限制,你应该通过要求管理员下载他的网站的权限。虽然你没有法律风险(他们没有ToS),但这是件好事。
答案 1 :(得分:0)
也许是这样的?特别想知道你得到什么作为输出(print_r)?
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.woorank.com/en/report/generate');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('url'=>'hellothere.com'));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec ($ch);
print_r($result); // output?
curl_close($ch);