Получение другой веб-страницы со соскобом
Мы должны сделать одно предположение, что веб-сервер вернет тот же вывод, если будет дан тот же ввод. С этим предположением мы неизбежно приходим к выводу, что мы не даем ему тот же вклад. В этом сценарии есть два браузера или http-клиентов: тот, который дает желаемый результат (например, Firefox, IE, Chrome или Safari), и тот, который не дает вам желаемый результат (напр., LWP, wget или cURL).
Сначала убей легкие возможности
Прежде, прежде чем продолжить, прежде всего убедитесь, что простые UserAgents совпадают, вы можете сделать это, перейдя по адресу whatsmyuseragent.com и установив строку UserAgent в заголовке другого браузера, чтобы все, что возвращает этот сайт. Вы также можете использовать Firefox Панель инструментов веб-разработчика , чтобы отключить CSS, JavaScript, Java и мета-перенаправления: это поможет вам отследить проблему, убив действительно простые вещи.
Теперь попытайтесь продублировать работающий браузер
Теперь с Firefox вы можете использовать FireBug для анализа REQUEST
, который отправляется. Вы можете сделать это на вкладке NET
в FireBug, в разных браузерах должны быть инструменты, которые могут делать то же, что FireBug с FireFox; однако, если вы не знаете, о каком инструменте идет речь, вы все равно можете использовать tshark или wireshark , как описано ниже. Важно отметить, что tshark и wireshark всегда будут более точными, поскольку они работают на более низком уровне, что, по крайней мере в моем опыте, оставляет меньше места для ошибок. Например, вы увидите такие вещи, как мета-перенаправления, которые выполняет браузер, которые иногда FireBug может потерять.
После того, как вы поймете, что первый веб-запрос работает, сделайте все возможное, чтобы установить второй веб-запрос на первый. Под этим я подразумеваю правильную настройку заголовков запроса и других элементов запроса. Если это все еще не работает, вы должны знать, что делает второй браузер, чтобы увидеть, что не так.
Устранение неполадок
Чтобы устранить эту проблему, мы должны иметь полное представление о запросах от обоих браузеров. Второй браузер обычно обманщик, это часто библиотеки и неинтерактивные браузеры командной строки, у которых нет возможности проверить запрос. Если у них есть возможность отклонить запрос, вы все равно можете просто проверить их. Для этого я предлагаю wireshark и tshark suite . Сразу же вы должны быть предупреждены, потому что они работают ниже браузера. По умолчанию вы увидите фактические сетевые (IP) пакеты и кадры канала передачи данных. Вы можете отфильтровать то, что вам нужно, с помощью такой команды.
sudo tshark -i <interface> -f tcp -R "http.request" -V |
perl -ne'print if /^Hypertext/../^Frame/'
Это будет захватывать все TCP-пакеты, отображать-фильтровать только http.requests
, затем Perl-фильтровать только для HTTP уровня 4. Возможно, вы захотите добавить фильтр отображения, чтобы захватить только один веб-сервер тоже -R "http.request and http.host == ''"
Вы захотите проверить все, чтобы убедиться, что два запроса совпадают: куки, GET URL, пользовательский агент и т. Д. Убедитесь, что сайт не делает глупостей.
Обновлено 23 января 2010 г. : Исходя из новой информации, я бы предложил установить Accept
и Accept-Language
, Accept-Charset
и Accept-Encoding
. Вы можете сделать это с помощью $ua->default_headers()
. Если то, что вам требуется, намного больше функциональности из вашего пользовательского агента, вы всегда можете создать его подкласс. Я использовал этот подход для своего API GData, вы можете найти мой пример подкласса UserAgent на github .