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とブラウザを使用している場合に異なるバージョンを返す理由は、今ではさらに混乱しています。どちらも同じユーザーエージェントを使用しています...
他のサイトでもこの動作に気づきました。問題が何であるかを説明していただければ幸いです。
リファラーヘッダーも設定してみてください。
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();
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 オブジェクトを取得します。エラーの場合にコンテンツタイプとステータスコードを確認するのに役立ちます。
後で応答オブジェクトを解析してドキュメントを取得できます。
Facebookがリクエストに特定のCookieを設定し(そして期待する)、ヘッダーのないヘッダーをボット/モバイルユーザー/制限付きブラウザー/何かと見なしている可能性があります。
JSoupでCookieを処理する についていくつかの質問がありますが、HttpUrlConnectionまたはApacheのHttpClientを使用して、その結果をJSoupに渡す方が簡単な場合があります。知っておく必要があるすべての優れた記事: Java.net.URLConnectionを使用してHTTPリクエストを起動および処理する
ブラウザとJSoupの違いをデバッグする便利な方法の1つは、 Chromeのネットワークインスペクター です。期待どおりの動作が得られるまで、ブラウザーからJSoupにヘッダーを1つずつ追加してから、必要なヘッダーを正確に絞り込みます。
403の問題があり、.userAgent("Mozilla")
の設定が機能しました(したがって、動作するために特別なものである必要はありません。