2014-06-29 14 views
5

Tôi mới sử dụng Jsoup nhưng tôi không thể hiểu tại sao tôi nhận được lỗi 404 khi cố gắng lấy trang, ngay cả khi trang có thể truy cập được từ trình duyệt và tôi không sử dụng bất kỳ proxy nào. Tôi đã thử với đoạn mã sau:Lỗi Jsoup 404

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; 
} 

và tôi nhận được thông báo ngoại lệ:

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) 

Trả lời

18

Có vẻ như rằng các trang web không cho phép chương trình và nó sẽ ném một phản ứng 404 lỗi trong trường hợp nó không định vị tiêu đề User-Agent. dưới đây hoạt động như nó đặt user agent Headers

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

Các Hypertext Transfer Protocol (HTTP) xác định các phần mềm máy khách có xuất xứ theo yêu cầu, sử dụng một "User-Agent "tiêu đề, ngay cả khi khách hàng không được điều hành bởi người dùng.


Người giới thiệu (Tôi không nghĩ rằng đây là cần thiết)

HTTP referer (ban đầu là một lỗi chính tả của người giới thiệu) là một tiêu đề HTTP lĩnh vực xác định địa chỉ của trang web (ví dụ URI hoặc IRI) liên kết với tài nguyên được yêu cầu.

Chỉ để cung cấp dịch vụ đầy đủ, tôi khuyên bạn nên đặt khoảng thời gian chờ cho các yêu cầu của bạn. Mặc định là 3 giây, nếu máy chủ mất nhiều thời gian hơn bạn sẽ nhận được một ngoại lệ. Dưới đây là mã của bạn với setter timeout. Đặt nó về 0 trong thời gian dài nhất có thể.

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

Cảm ơn !! Nó đã làm việc. Tôi xin lỗi tôi không thể upvote bạn trả lời, bạn xứng đáng với nó. Bạn có thể giải thích những gì với các phương thức userAgent và referrer; Vai trò của họ là gì? Cảm ơn một lần nữa – mawus

+0

Không sao cả. Thực tế là bạn đã thực hiện thêm bước để cảm ơn tôi với một bình luận, là quá đủ. Tôi rất vui vì tôi có thể giúp. P.S. Kiểm tra cập nhật của tôi. – alkis

+0

Nó phù hợp với tôi, cảm ơn –

11

Nếu trong trường hợp bạn đang nhận được mã phản hồi 404, bạn có thể bỏ qua mà url

Sử dụng ignoreHttpErrors (true), chắc chắn sẽ giải quyết vấn đề của bạn

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