2014-06-29 38 views
5

Jestem nowy z Jsoup, ale nie mogę zrozumieć, dlaczego otrzymuję błąd 404 podczas próby uzyskania strony, nawet jeśli strona jest dostępna z przeglądarki i nie używam żadnych serwerów proxy. Próbowałem z następującego kodu:Jsoup 404 error

private static Document connect() { 
    String url = "http://www.transfermarkt.co.uk/real-madrid/startseite/verein/418"; 
    Document doc = null; 
    try { 
     doc = Jsoup.connect(url).get(); 
    } catch (NullPointerException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (HttpStatusException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return doc; 
} 

i pojawia się komunikat o wyjątku:

org.jsoup.HttpStatusException: HTTP error fetching URL. Status=404, URL=http://www.transfermarkt.co.uk/real-madrid/startseite/verein/418 
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:449) 
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:424) 
at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:178) 
at org.jsoup.helper.HttpConnection.get(HttpConnection.java:167) 
at ro.pago.ucl2015.UCLWebParser.connect(UCLWebParser.java:27) 
at ro.pago.ucl2015.UCLWebParser.main(UCLWebParser.java:16) 

Odpowiedz

18

Wydaje się, że witryna nie pozwalają botów i będzie rzucać odpowiedź 404 o błędzie w przypadku nie lokalizuje nagłówków User-Agent. Poniższa działa tak jak ustawia kliencka nagłówki

private static Document connect() { 
    String url = "http://www.transfermarkt.co.uk/real-madrid/startseite/verein/418"; 
    Document doc = null; 
    try { 
     doc = Jsoup.connect(url) 
       .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0") 
       .referrer("http://www.google.com")    
       .get(); 
    } catch (NullPointerException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (HttpStatusException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return doc; 
} 

User Agent

Hypertext Transfer Protocol (HTTP) identyfikuje oprogramowanie klienckie pochodzące żądanie, przy użyciu „User-Agent "nagłówek, nawet jeśli klient nie jest obsługiwany przez użytkownika.


Polecający (nie sądzę, że jest to konieczne)

Referer HTTP (pierwotnie ortograficzny w odsyłającego) jest nagłówek HTTP dziedziną, która identyfikuje adres strony internetowej (tj URI lub IRI) , które łączyły się z żądanym zasobem.

Tylko w celu zapewnienia pełnej obsługi Radziłbym ustawić limit czasu dla żądań. Wartością domyślną są 3 sekundy, jeśli serwer trwa dłużej, niż otrzymasz wyjątek. Bellow podąża za kodem z ustawianiem limitu czasu. Ustaw go na zero na najdłuższy możliwy okres.

private static Document connect() { 
    String url = "http://www.transfermarkt.co.uk/real-madrid/startseite/verein/418"; 
    Document doc = null; 
    try { 
     doc = Jsoup.connect(url) 
       .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0") 
       .referrer("http://www.google.com") 
       .timeout(1000*5) //it's in milliseconds, so this means 5 seconds.    
       .get(); 
    } catch (NullPointerException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (HttpStatusException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return doc; 
} 
+0

Dzięki !! Zadziałało. Przepraszam, nie mogę odpowiedzieć, że zasługujesz na to. Czy możesz wyjaśnić, co jest z metodami userAgent i referrer; Jaka jest ich rola? Jeszcze raz dziękuję – mawus

+0

Bez problemu. To, że zrobiłeś dodatkowy krok, by podziękować mi za komentarz, to więcej niż wystarczy. Cieszę się że mogłem pomóc. P.S. Sprawdź moją aktualizację. – alkis

+0

To działa dla mnie, dzięki –

11

Jeśli w przypadku otrzymujesz kod odpowiedzi 404, można pominąć ten adres URL

Zastosowanie ignoreHttpErrors (prawda), z pewnością rozwiąże Twój problem

Document doc3 = null; 
    try { 
     doc3 = Jsoup.connect(url).userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0") 
       .referrer("http://www.google.com").ignoreHttpErrors(true).get(); 

    } catch (NullPointerException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }