2017-05-05 6 views
0

次のコードを使用してNew York Timesページのhtmlを取得していますが、残念ながらnullが返されます。私は他のウェブサイト(CNN、The Guardianなど)で試してみて、うまく動作します。私はGoogle App EngineからURLFetchServiceを使用しています。GAFを使用するURLFetchServiceは、New York Timesページを取得しようとするとnullを返します。

ここにコードスニペットがあります。何が間違っているのか教えてください。

//url = https://www.nytimes.com/2017/05/02/us/politics/health-care-paul-ryan-fred-upton-congress.html 

private String extractFromUrl(String url, boolean forced) throws java.io.IOException, org.xml.sax.SAXException, 
         de.l3s.boilerpipe.BoilerpipeProcessingException { 

    Future<HTTPResponse> urlFuture = getMultiResponse(url); 

    HTTPResponse urlResponse = null; 
    try { 
     urlResponse = urlFuture.get(); // Returns null here 
    } catch (InterruptedException ie) { 
     ie.printStackTrace(); 
    } catch (ExecutionException ee) { 
     ee.printStackTrace(); 
    } 

    String urlResponseString = new String(urlResponse.getContent()); 
    return urlResponseString; 
} 

public Future<HTTPResponse> getMultiResponse(String website) { 
    URLFetchService fetcher = URLFetchServiceFactory.getURLFetchService(); 
    URL url = null; 
    try { 
     url = new URL(website); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } 

    FetchOptions fetchOptions = FetchOptions.Builder.followRedirects(); 
    HTTPRequest request = new HTTPRequest(url, HTTPMethod.GET, fetchOptions); 
    Future<HTTPResponse> futureResponse = fetcher.fetchAsync(request); 
    return futureResponse; 
} 

私は取得しています例外がこれです:カールの詳細な出力を見ると

java.util.concurrent.ExecutionException: java.io.IOException: Could not fetch URL: https://www.nytimes.com/2017/05/02/us/politics/health-care-paul-ryan-fred-upton-congress.html, error: Received exception executing http method GET against URL https://www.nytimes.com/2017/05/02/us/politics/health-care-paul-ryan-fred-upton-congress.html: null 
[INFO] at com.google.appengine.api.utils.FutureWrapper.setExceptionResult(FutureWrapper.java:66) 
[INFO] at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:97) 
[INFO] at main.java.com.myapp.app.MyServlet.extractFromUrl(MyServlet.java:10) 

答えて

1

、あなたはウェブサイトがCookieを設定しようとすると、クッキーがある場合には、あなたをリダイレクトすることがわかります受け入れられません。

時間があきらめる前に、あなたに7回をリダイレクトすることが表示されます -

$ curl --verbose -L "https://www.nytimes.com/2017/05/02/us/politics/health-care-paul-ryan-fred-upton-congress.html" 2>&1 | grep 303 | wc -l 
7 

UrlFetchのためのリダイレクトの最大数は5 [0]であることが表示されます。

www.nytimes.comを正常にクロールするには、次のリダイレクトを無効にして、Cookieロジックを自分で処理する必要があります。ここではいくつかのインスピレーション[1]、ここで[2]

[0] https://groups.google.com/forum/#!topic/google-appengine/F2dX3LqOrhY

[1] https://groups.google.com/d/msg/google-appengine-java/pE0xak7LRxg/M__U-SM3YMMJ

を[2] https://stackoverflow.com/a/13588616/7947020

+0

ありがとうございました。私はそれらの提案を見上げます。 – BlueChips23

+0

最後にあなたの提案を調べて、自分のコードが動作するようにしました。最初のリクエストでクッキーを設定した後、別のページにリダイレクトされ、さらに2つのクッキーが設定されます。その後、3つのCookie(1つは第1の要求、もう1つはリダイレクトの2番目の要求)が使用されている元のページにリダイレクトされます。 – BlueChips23

+0

@ BlueChips23恐ろしい!この動作が再び変わる可能性が高いので、ログオフとエラー処理が適切に行われていることを確認してください。 – alpeware

関連する問題