我现在正在使用以下代码卷曲一个 URL,这对于附加到 URL 末尾或 POST 数据都可以正常工作。但不是获取和帖子。
但是,当我使用高级休息客户端(谷歌浏览器的附加组件)时,它工作得很好。不过令人讨厌的是,我看不到它发送的模仿它的请求。
这是我用它打的电话。
$fields = array(
'searchPaginationResultsPerPage'=>500 );
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
$fields_string = rtrim($fields_string,'&');
$curl = curl_init();
curl_setopt( $curl, CURLOPT_URL, 'http://www.microgenerationcertification.org/mcs-consumer/installer-search.php?searchPaginationPage=1' );
curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl,CURLOPT_POST,count($fields));
curl_setopt($curl,CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 80);
$str = curl_exec($curl);
curl_close($curl);
只是将其用作比其他任何事情都多的测试,但似乎无法使其正常工作。我可以一直得到前 500 个结果,但不能得到下一个 500 个结果。
这有效
$fields = array (
'searchPaginationResultsPerPage' => 500,
'searchPaginationPage' => 1
);
$headers = array (
"Connection: keep-alive",
"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.162 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"
);
$fields_string = http_build_query ( $fields );
$cookie = 'cf6c650fc5361e46b4e6b7d5918692cd=49d369a493e3088837720400c8dba3fa; __utma=148531883.862638000.1335434431.1335434431.1335434431.1; __utmc=148531883; __utmz=148531883.1335434431.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); mcs=698afe33a415257006ed24d33c7d467d; style=default';
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, 'http://www.microgenerationcertification.org/mcs-consumer/installer-search.php?searchPaginationPage=1&searchPaginationResultsPerPage=500' );
curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 80 );
curl_setopt ( $ch, CURLOPT_COOKIE, $cookie );
curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );
$str = curl_exec ( $ch );
curl_close ( $ch );
echo $str;
您需要cookie信息并确保curl使用的是GET而不是POST
。请参阅演示:http://codepad.viper-7.com/gTThxX(我希望cokkies在您查看之前不会过期)
不知道为什么会失败,看起来不错。当您跳过 CURL 并使用 PHP 流方法时会发生什么:
$postdata = http_build_query(
array(
'searchPaginationResultsPerPage' => 500
)
);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata
)
);
$context = stream_context_create($opts);
$result = file_get_contents('http://www.microgenerationcertification.org/mcs-consumer/installer-search.php?searchPaginationPage=1', false, $context);
我看了一下您正在抓取的页面,并注意到以下内容:
- 当您更改每页的结果时,它会再次发布您的搜索
- 他们似乎正在使用会话来存储您的搜索参数
使用 CURL 时,您不会保留会话 ID(这样做可能比您想要的要复杂一些),因此其行为与网站上的行为不同。
但是,我确实注意到,如果您将搜索页面结果PerPage参数附加到URL,则可以正常工作。 喜欢这个:
http://www.microgenerationcertification.org/mcs-consumer/installer-search.php?searchPaginationPage=0&searchPaginationResultsPerPage=500
这意味着您实际上可以使用file_get_contents而不必担心 CURL 的东西。