2011-07-05 14 views
31

Próbuję przeanalizować stronę główną Facebooka z JSoup, ale zawsze otrzymuję kod HTML dla urządzeń mobilnych, a nie wersję dla zwykłych przeglądarek (w moim przypadku Firefox 5.0).JSoup UserAgent, jak ustawić to dobrze?

mam ustawienie mojego agenta użytkownika tak:

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

Czy robię coś źle?

EDIT:

właśnie analizowany http://whatsmyuseragent.com/ i wygląda Agent użytkownik pracuje. Teraz jeszcze bardziej mylące jest dla mnie, dlaczego strona http://www.facebook.com/ zwraca inną wersję podczas korzystania z JSoup i mojej przeglądarki. Oba używają tego samego użytkownika użytkownika ...

Zauważyłem to zachowanie również na innych stronach. Gdybyś mógł mi wyjaśnić, czym jest ten problem, byłbym bardziej niż szczęśliwy.

+2

Nie mogę być jedynym napotykając ten problem, czy jestem? – Markus

+0

Thank Dodanie klienta tylko rozwiązało mój problem – Bloomberg58

Odpowiedz

43

Można spróbować ustawienie nagłówka odwołania, a także:

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(); 
+0

Jak to działa? – Silentbang

+0

@silentbang, jak działa * co * działa? – Gili

+1

@Gili Miałem na myśli stronę odsyłającą, jaka jest jej rola w tym: – Silentbang

8

Jest wielce prawdopodobne, że Facebook jest ustawienie (a następnie spodziewa) pewne cookies w swych żądań i uważa, nagłówek, że brak jest jakiegokolwiek być bot/użytkownik mobilny/ograniczona przeglądarka/coś innego.

Istnieje kilka pytań na temat handling cookies with JSoup, jednak może się okazać prostsze korzystanie z HttpUrlConnection lub HttpClient Apache'a, a następnie przekazywanie wyniku do JSoup. Doskonały napis na wszystko, co musisz wiedzieć: Using java.net.URLConnection to fire and handle HTTP requests

Jednym z użytecznych sposobów debugowania różnicy między przeglądarką i JSoup jest Chrome's network inspector. Możesz dodawać nagłówki z przeglądarki do JSoup po kolei, aż uzyskasz pożądane zachowanie, a następnie zawęzić dokładnie te nagłówki, których potrzebujesz.

26
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(); 

User Agent

używać najnowszej agenta użytkownika. Oto pełna lista http://www.useragentstring.com/.

Timeout

Również nie zapomnij dodać Timout, ponieważ czasami trwa więcej niż normalny czas oczekiwania na pobranie strony.

Referer

Ustaw odsyłający jak Google.

przekierowań

przekierowań aby dostać się do strony.

execute() zamiast get()

Zastosowanie execute(), aby uzyskać obiekt Response. Które mogą pomóc w sprawdzeniu treści i kodów stanu w przypadku błędu.

Później można przeanalizować obiekt odpowiedzi, aby uzyskać dokument.

+1

useragentstring.com wydaje się być teraz zepsuty. – Siddhartha

+0

Tylko dla wyjaśnienia, podczas gdy dokładny link w odpowiedzi jest zepsuty (http://www.useragentstring.com/pages/Firefox/), sama strona jest w górze (od czasu pisania tego komentarza): http: //www.useragentstring.com/ –

+0

Dzięki. Zaktualizowano link w odpowiedzi – Sorter

1

miałem problem 403 i ustawienie .userAgent("Mozilla") pracował dla mnie (tak, to nie musi być super specyficzny do pracy.