web-dev-qa-db-ja.com

JSoup UserAgent、正しく設定する方法は?

FacebookのフロントページをJSoupで解析しようとしていますが、通常のブラウザー(私の場合はFirefox 5.0)のバージョンではなく、モバイルデバイスのHTMLコードを常に取得しています。

私はこのようにユーザーエージェントを設定しています:

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とブラウザを使用している場合に異なるバージョンを返す理由は、今ではさらに混乱しています。どちらも同じユーザーエージェントを使用しています...

他のサイトでもこの動作に気づきました。問題が何であるかを説明していただければ幸いです。

35
Markus

リファラーヘッダーも設定してみてください。

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();
48
Denaitre Roux
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 オブジェクトを取得します。エラーの場合にコンテンツタイプとステータスコードを確認するのに役立ちます。

後で応答オブジェクトを解析してドキュメントを取得できます。

32
Sorter

Facebookがリクエストに特定のCookieを設定し(そして期待する)、ヘッダーのないヘッダーをボット/モバイルユーザー/制限付きブラウザー/何かと見なしている可能性があります。

JSoupでCookieを処理する についていくつかの質問がありますが、HttpUrlConnectionまたはApacheのHttpClientを使用して、その結果をJSoupに渡す方が簡単な場合があります。知っておく必要があるすべての優れた記事: Java.net.URLConnectionを使用してHTTPリクエストを起動および処理する

ブラウザとJSoupの違いをデバッグする便利な方法の1つは、 Chromeのネットワークインスペクター です。期待どおりの動作が得られるまで、ブラウザーからJSoupにヘッダーを1つずつ追加してから、必要なヘッダーを正確に絞り込みます。

8
dimo414

403の問題があり、.userAgent("Mozilla")の設定が機能しました(したがって、動作するために特別なものである必要はありません。

1
Cody Jacques