Как пройти страницу «noframes», возвращаемую по запросу CURL? - PullRequest
0 голосов
/ 17 февраля 2011

Я настроил запрос скручивания, который корректно работает на нескольких сайтах, большинство из которых используют фреймы, и возвращает тег noframes с соответствующим сообщением, если фреймы не поддерживаются используемым браузером bing, все возвращают полную страницунаборов фреймов, которые я просматриваю, используя Domdocument.

Один сайт, однако, будет возвращать только страницу с указанием «вам понадобится браузер, который поддерживает фреймы».Я передаю CURLOPT_USERAGENT, Mozilla / 5.0 (Windows; U; Windows NT 6.1; en-GB; rv: 1.9.2.13) Gecko / 20101203 Firefox / 3.6.13, я пробовал множество определений пользовательских агентов и читал ипробовал другие варианты скручивания, но безуспешно.

Единственное различие, которое я вижу между сайтами, которые работают, и тем, которое не работает, заключается в том, что он объявляет тип документа:! DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Frameset // EN "" http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"

, тогда как работающие сайты корректно объявляют тип документа:! DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Transitional // EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"

URL-адрес, о котором идет речь: http://www.sainsburys.co.uk/groceries/index.jsp

Конечно, я могу получить нужный набор фреймов, используя прямые URL-адреса для ссылок внутри набора фреймов, но я бы предпочел начать с точки входа индексного файла, а не жестко кодировать ссылки на страницы.что мои изменения со временем.

Любой совет или скрипт, который работает, будет принят с благодарностью.

Кстати: использование собираемой информации находится в пределах допустимого использования.

1 Ответ

0 голосов
/ 17 февраля 2011

Я получаю полную страницу с фреймами, но с двумя запросами: first: запрос к index.jsp для получения данных сеанса из кода javascript. секунда: запросите index.jsp еще раз, но на этот раз с передачей ему данных сеанса.это код, который я использовал для этого:

<?php

function getGROSESSIONID(){
   $ch = curl_init();

   curl_setopt($ch, CURLOPT_URL, 'http://www.sainsburys.co.uk/groceries/index.jsp');
   curl_setopt($ch, CURLOPT_HEADER, 1);
   curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9) Gecko/2008052906 Firefox/3.0');
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

   $page_contents = curl_exec($ch);

   curl_close($ch);

   if(preg_match('/window\.location\.replace\(\"http\:\/\/www\.sainsburys\.co\.uk\/groceries\/frameset\/redirect\.jsp\;(.*)\"\)\;/', $page_contents, $matches)){
      return $matches[1];
   }
   return false;
}

function getSainsburysIndex($session_data){
   if($session_data == ''){
      return false;
   }
   $ch = curl_init();

   curl_setopt($ch, CURLOPT_URL, 'http://www.sainsburys.co.uk/groceries/index.jsp;'.$session_data);
   curl_setopt($ch, CURLOPT_HEADER, 0);
   curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9) Gecko/2008052906 Firefox/3.0');
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

   $page_contents = curl_exec($ch);

   curl_close($ch);

   return $page_contents;
}

$sessData = getGROSESSIONID();

if(false !== $sessData){
    echo "<pre>";
    print_r(htmlspecialchars(getSainsburysIndex($sessData)));
    echo "
";} else {echo" не может получить идентификатор сеанса. ";}?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...