1

このページからリンクを取得しようとしています: http://www.seas.harvard.edu/academics/areas

ページの中ほどに「Computer Science」というリンクがあります。その基礎となるリンクは「/academics/areas/computer-science」として与えられます。Java 組み込み URL クラスを使用して絶対 URL に変換し、「http://www.seas.harvard.edu/academics/areas/computer-science」を取得できます。

しかし、Chrome ブラウザでリンクをクリックすると、絶対 URL が「http://www.seas.harvard.edu/computer-science」に変わります。

だから私の質問は2つあります:

  1. このページで URL リダイレクトはどのように機能しますか?
  2. リダイレクト後に URL を取得するのに役立つ Java のライブラリまたはメソッドはありますか?

ページのソースコードを読みたいのでリダイレクト後のURLを取得する必要があるのですが、リダイレクト前のURLがうまくいきません。ライブラリを使用しJSoupて URL から読み取っているので、javascript ベースのリダイレクトであると思われます。

4

5 に答える 5

4

curl --dump-header [file] [URL]ファイルから次のようになりました。

HTTP/1.1 301 Moved Permanently
Age: 0
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
Content-Type: text/html
Date: Tue, 13 Aug 2013 13:00:12 GMT
ETag: "1376398812"
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Tue, 13 Aug 2013 13:00:12 GMT
Location: http://www.seas.harvard.edu/computer-science
Server: nginx
Vary: Accept-Encoding
Via: 1.1 varnish
X-AH-Environment: prod
X-Cache: MISS
X-Drupal-Cache: MISS
X-Redirect-ID: 44
X-Varnish: 2704315535
transfer-encoding: chunked
Connection: keep-alive

ご覧のとおり、これはサーバーから提供される 301 パーマネント リダイレクトです。

データを取得するには:

HttpURLConnection を使用して接続できますが、接続する前に を呼び出しますmyConn.setInstanceFollowRedirects(true)。リダイレクトが続き、出力ストリームを取得して読み取ることができます。

URL 自体を取得するには:

を使用HttpURLConnectionして接続できますが、接続する前に、リダイレクトmyConn.setInstanceFollowRedirects(false)に従わないように呼び出します。これにより、実際の URL が適切な場所に保存されます。

ここでの秘訣は、何か奇妙な理由で、日付として解析しない限り、HttpURLConnection が名前でヘッダーを取得できないことです。

したがって、整数を反復処理getHeaderFieldKeyし、接続を確立した後に呼び出し、等しいかどうかを確認し、等しいLocation場合getHeaderFieldは同じ整数を取得して位置を取得する必要があります。迷惑です、私は知っています。しかし、場所は日付ではなく、これは JRE の見落としです。

于 2013-08-13T13:09:41.957 に答える
0

私は Fiddler を使用して調査し、サイトはリダイレクトを実行するリンクhttp://www.seas.harvard.edu/academics/areas/computer-science HTTP 301 応答コードを返しました。

実際の URL を取得したい。harvard.edu Web サーバーに対して実際の要求を実行し、応答を解析する必要があります。(リダイレクト URL はLocationHTTP ヘッダーのキーにあります)。

2番目の質問で申し訳ありません。Javaのスキルがありません。

この SO の質問が役立つ場合があります ( httpclient-4-how-to-capture-last-redirect-url )

于 2013-08-13T13:08:26.347 に答える
0
  1. おそらく、たとえば a.htaccessmod_rewriteリダイレクトがあります。Firefox のコンソールを使用して、リクエストを確認できました。以下に示すように、サーバーはメッセージを送り返してい301 Moved Permanentlyます。Locationこれにより、ブラウザーは、応答のヘッダーで 返されたアドレスにリダイレクトするように指示されます。ウェブリクエスト
  2. 変更された URL を取得する方法は、ページを読み込む方法によって異なります。
    • 準備ができているライブラリとコードを使用してページを DOM オブジェクトなどにロードする場合、その準備ができている HTTP システムを使用して応答をロードできます。これにより、おそらく自動的にリダイレクトされます -> の URL から URL を取得します読み込まれたページ。そうでない場合は、ステータス コード 301 または 302 を確認する必要があります。これらが受信されると、変更された URL がLocation応答のヘッダーに含まれます。
    • TCP ソケット経由で応答をロードする独自のコードを作成している場合は、通常どおり応答をロードする必要がありますが、301 および 302 ステータス コードを再度チェックし、前のセクションで説明したように実行します。
于 2013-08-13T13:09:10.517 に答える
0

Redirect URL以下のコード設定からfollowRedirectsを取得できますfalse

に設定すると、リダイレクトされたページのソースコードが取得されます。これがtrueデフォルトの動作ですJsoup

 Connection con = Jsoup.connect("http://www.seas.harvard.edu/academics/areas/computer-science")
                              .userAgent("Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36")
                              .followRedirects(false);

           System.out.println("Redirected Url : " + con.execute().header("Location")); //null if followRedirect is true

           Document doc = con.get();
           System.out.println(doc.html());
           System.out.println("=================================================");
于 2013-08-13T22:22:46.753 に答える