2012-04-26 4 views
0

В настоящее время я скручиваю URL со следующим кодом, который отлично работает либо с привязкой к концу URL-адреса, либо с данными POST. Но не с получением и с почтой.PHP Curl GET & POST

Однако, когда я использую расширенный клиент для отдыха (добавьте его для google chrome), он работает отлично. Раздражающе, однако, я не вижу запроса, который он посылает, чтобы имитировать его.

Это звонок, который я делаю с ним.

$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.

ответ

0

Это работает

$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; 

Вам необходимую информацию печенья и убедитесь, что завиток использует GET POST не

Смотрите демо: http://codepad.viper-7.com/gTThxX (я надеюсь, что cokkies не истекли Befor е вы его просмотр)

+0

Вы попробовали это, прежде чем предлагать очевидное? – David

+0

Я думаю, что, вероятно, нет, так как вы найдете свой код, дает ту же проблему, о которой я спрашиваю в основном тексте этой темы. – David

+1

'Я могу получить первые 500 результатов все время, но не следующие 500' проверили его .... есть ли что-то, что вы считаете пропущенным? – Baba

0

Не знаю, почему это не удается, выглядит хорошо .. Что происходит, когда вы пропустите 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); 
+0

$ PostData = http_build_query ( массив ( '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); $ html = new simple_html_dom(); $ html-> load ($ result); echo $ html; – David

+0

Пробовал это и получил тот же результат. – David

0

Я имел взгляд на этой странице выскабливания и заметил следующее:

  • При изменении результатов на страницу он выполняет поиск еще раз
  • Они, по всей видимости, используют сеанс для хранения ваших параметров поиска

Вы не сохраняете идентификатор сеанса при использовании CURL (и это, вероятно, немного сложнее, чем вам хотелось бы), поэтому это не будет вести себя так же, как на веб-сайте ,

Я заметил, однако, что если вы добавите параметр searchPaginationResultsPerPage в URL-адрес, он отлично работает. Как это:

http://www.microgenerationcertification.org/mcs-consumer/installer-search.php?searchPaginationPage=0&searchPaginationResultsPerPage=500

Это означает, что вы могли бы реально использовать file_get_contents и не беспокоиться о CURL вещи.

+0

Я попытался получить второй 500 страниц с помощью метода, предлагаемого вами, и он не работает, только первые 500. – David

+0

Тогда вам нужно будет сохранить идентификатор сеанса. Вероятно, что происходит в их коде, если у вас нет ключа поиска, хранящегося в сеансе, по умолчанию вы получаете первую страницу. Если вы не сохраняете идентификатор сеанса между запросами CURL, это как новый сеанс каждый раз. Читайте о CURL и куках здесь: http://coderscult.com/php/php-curl/2008/05/20/php-curl-cookies-example/ – RolandLovelock

+0

Я действительно боялся, что это, вероятно, будет проблемой. Странно, что он работает в обоих клиентах REST, которые я пробовал прямо. – David