使用PHP将数据发布到其他站点并保存输出

时间:2010-12-07 01:27:52

标签: php curl

我正在尝试保存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。

更新2

我尝试使用以下方法将一些标题添加到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 gzipContent-Length 20。不知道这意味着什么,但是当向标题添加“Content-Length:20”时,它说“HTTP / 1.1 413请求实体太大”并且什么都不做;添加“Content-Encoding:gzip”使其返回HTML gzip(我假设,因为它看起来像这样:“<ÍXésÚ8ÿœüZíì&amp;]ìºG”æè1MmÚ...“)。

希望此信息有所帮助。

2 个答案:

答案 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);