JSoup UserAgent, как правильно его настроить? - PullRequest
35 голосов
/ 05 июля 2011

Я пытаюсь проанализировать главную страницу facebook с JSoup, но всегда получаю HTML-код для мобильных устройств, а не версию для обычных браузеров (в моем случае Firefox 5.0).

Я настраиваю свой пользовательский агент следующим образом:

doc = Jsoup.connect(url)
      .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0")
      .get();

Я что-то не так делаю?

РЕДАКТИРОВАТЬ:

Я только что проанализировал http://whatsmyuseragent.com/ и похоже, что пользовательский агент работает. Теперь меня еще больше смущает, почему сайт http://www.facebook.com/ возвращает другую версию при использовании JSoup и моего браузера. Оба используют один и тот же useragent ....

Я заметил это поведение и на некоторых других сайтах. Если бы вы могли объяснить мне, в чем проблема, я был бы более чем счастлив.

Ответы [ 4 ]

47 голосов
/ 22 августа 2011

Вы также можете попробовать установить заголовок реферера:

doc = Jsoup.connect("https://www.facebook.com/")
      .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")
      .referrer("http://www.google.com")
      .get();
32 голосов
/ 29 ноября 2013
Response response= Jsoup.connect(location)
           .ignoreContentType(true)
           .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0")  
           .referrer("http://www.google.com")   
           .timeout(12000) 
           .followRedirects(true)
           .execute();

Document doc = response.parse();

Пользовательский агент

Использовать последний пользовательский агент.Вот полный список http://www.useragentstring.com/pages/useragentstring.php.

Тайм-аут

Также не забудьте добавить тайм-аут, поскольку иногда загрузка страницы занимает больше обычного тайм-аута.

Referer

Установить реферера как google.

Следовать за перенаправлениями

следовать за перенаправлениями, чтобы получитьна страницу.

execute () вместо get ()

Используйте execute (), чтобы получить объект Response .Что может помочь вам проверить тип содержимого и коды состояния в случае ошибки.

Позже вы можете проанализировать объект ответа, чтобы получить документ.

8 голосов
/ 01 сентября 2012

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

Есть несколько вопросов об обработке файлов cookie с помощью JSoup , однако вам может оказаться проще использовать HttpUrlConnection или HttpClient Apache, а затем передать результат в JSoup. Отличная рецензия на все, что вам нужно знать: Использование java.net.URLConnection для запуска и обработки HTTP-запросов

Один полезный способ отладить разницу между вашим браузером и JSoup - Инспектор сети Chrome . Вы можете добавлять заголовки из браузера в JSoup по одному, пока не получите ожидаемое поведение, а затем сузить, какие именно заголовки вам нужны.

1 голос
/ 03 ноября 2016

У меня была проблема 403, и настройка .userAgent("Mozilla") сработала для меня (поэтому она не должна быть супер специфичной для работы.

...