Не получается получить содержимое веб-страницы через cURL - пользовательский агент и HTTP-заголовки оба установлены? - PullRequest
3 голосов
/ 30 декабря 2011

По какой-то причине я не могу получить содержимое этой конкретной веб-страницы через cURL. Мне удалось использовать cURL, чтобы нормально добраться до содержимого «страницы верхнего уровня», но та же самая встроенная функция быстрого cURL, похоже, не работает для одной из связанных суб-веб-страниц.

Страница верхнего уровня: http://www.deindeal.ch/

Подстраница: http://www.deindeal.ch/deals/hotel-cristal-in-nuernberg-30/

Моя функция cURL (в functions.php)

function curl_get($url) {
    $ch = curl_init();
    $header = array(
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7',
    'Accept-Language: en-us;q=0.8,en;q=0.6'
    );
    $options = array(
        CURLOPT_URL => $url, 
        CURLOPT_HEADER => 0, 
        CURLOPT_RETURNTRANSFER => 1, 
        CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13',
        CURLOPT_HTTPHEADER => $header
        );
    curl_setopt_array($ch, $options);
    $return = curl_exec($ch);
    curl_close($ch);

    return $return;
}

PHP-файл для получения содержимого (используется echo для тестирования)

require "functions.php";
require "phpQuery.php";

echo curl_get('http://www.deindeal.ch/deals/hotel-walliserhof-zermatt-2-naechte-30/');

До сих пор я пытался сделать следующее, чтобы это заработало

  • Запуск файла как локально (XAMPP), так и удаленно (LAMP).
  • Добавлено в заголовки user-agent и HTTP, как рекомендовано здесь file_get_contents и CURL не может открыть конкретный веб-сайт - до того, как функция curl_get() содержала все параметры в качестве текущих, за исключением CURLOPT_USERAGENT and CURLOPT_HTTPHEADERS`.

Возможно ли, чтобы веб-сайт полностью блокировал запросы с помощью cURL или других механизмов удаленного открытия файлов, независимо от того, сколько данных предоставлено, чтобы попытаться выполнить настоящий запрос браузера?

Кроме того, возможно ли диагностировать, почему мои запросы ничего не показывают?

Любая помощь в ответе на два вышеупомянутых вопроса или редактирование / внесение предложений для получения содержимого файла, даже если с помощью метода, отличного от cURL, будет принята с благодарностью;).

1 Ответ

5 голосов
/ 30 декабря 2011

Попробуйте добавить:

CURLOPT_FOLLOWLOCATION => TRUE

к вашим параметрам.

Если вы запустите простой запрос curl из командной строки (включая -i для просмотра заголовков ответа), тогда ондовольно легко увидеть:

$ curl -i 'http://www.deindeal.ch/deals/hotel-cristal-in-nuernberg-30/'
HTTP/1.1 302 FOUND
Date: Fri, 30 Dec 2011 02:42:54 GMT
Server: Apache/2.2.16 (Debian)
Vary: Accept-Language,Cookie,Accept-Encoding
Content-Language: de
Set-Cookie: csrftoken=d127d2de73fb3bd72e8986daeca86711; Domain=www.deindeal.ch; Max-Age=31449600; Path=/
Set-Cookie: generic_cookie=1; Path=/
Set-Cookie: sessionid=987b1a11224ecd0e009175470cf7317b; expires=Fri, 27-Jan-2012 02:42:54 GMT; Max-Age=2419200; Path=/
Location: http://www.deindeal.ch/welcome/?deal_slug=hotel-cristal-in-nuernberg-30
Content-Length: 0
Connection: close
Content-Type: text/html; charset=utf-8

Как видите, он возвращает 302 с заголовком Location.Если вы нажмете на это местоположение напрямую, вы получите контент, который ищете.

И ответьте на два вопроса:

  1. Нет, это , а не возможность блокировать запросы от чего-то вроде curl.Если потребитель может говорить по HTTP, он может получить все, что может получить браузер.
  2. Диагностика с использованием прокси-сервера HTTP могла бы быть полезной для вас.Wireshark, Fiddler, Charles и др.должен помочь вам в будущем.Или сделайте, как я, и сделайте запрос из командной строки.

РЕДАКТИРОВАТЬ
Ах, я понимаю, о чем вы сейчас говорите.Таким образом, когда вы переходите по этой ссылке в первый раз, вы перенаправляетесь и устанавливаете cookie (или cookie).После того, как у вас есть эти куки, ваш запрос будет выполнен в соответствии с назначением.

Итак, вам нужно использовать cookiejar, как в этом примере: http://icfun.blogspot.com/2009/04/php-how-to-use-cookie-jar-with-curl.html

Итак, вам нужно будет сделатьПервоначальный запрос, сохраните файлы cookie и сделайте последующие запросы, включая файлы cookie, после этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...