4

私は Scala で Web サイトのスクレイピング アプリケーションに取り組んでいます。私がスクレイピングしているサイトは非常にセッション指向であるため、他の操作を行う前に、セッション ID を取得するために一度サイトにアクセスする必要があります。

次のようにセッション ID を取得するための接続を取得します。

url.openConnection().asInstanceOf[HttpURLConnection]

それは正常に動作します。返された HttpURLConnection の .connected フィールドは false であり、.connect() を呼び出すと true に反転します。問題ない。

問題の最初のヒントは、接続を終了して .disconnect() を呼び出したときに発生します。.connected フィールドは true のままです。うーん。

これで、セッション ID を取得できたので、必要なフォームを含むページを取得します。電話する

url.openConnection().asInstanceOf[HttpURLConnection]

繰り返しますが、前回と同じように (実際には同じコードです)、今回は HttpURLConnection の .connected フィールドが true に設定されています。最初は、以前に渡されたのと同じオブジェクトが渡されたのではないかと思いましたが、いいえ、メモリ ID が異なります。

もちろん、接続で .setRequestProperty() を呼び出すと、 IllegalStateException: Already connected で爆発します。

HttpURLConnection の使い方を誤解していますか?

注: Scala 2.9.2、Java 6.0。また、.openConnection() を呼び出す URL オブジェクトは異なるオブジェクトであり、同じではありません。

ありがとう...

4

3 に答える 3

1

私の経験では、このURLクラスはセッションベースの作業(特にCookieベースのセッション)にはあまり適していません。

これを利用したい場合は、ApacheHTTPClientのようなものを使用することをお勧めします

私見では

于 2012-09-27T00:29:14.833 に答える
1

これは、HTTPキープアライブを求めて、接続プールと呼ばれます。それは良いです。あなたはそれをしたい。そうでない場合は、disconnect()メソッドを呼び出します。

于 2012-09-27T00:26:03.007 に答える
0

HttpUrlConnection がカバーの下で接続を維持しているように聞こえます。

接続を強制的に閉じて、あまり役に立たないヒントについては、この記事をご覧ください。

あなたのケースでは、不要な接続ハンドシェイクを回避することで Web サイトへの呼び出しを高速化できるため、キープアライブを使用することをお勧めします。

于 2012-09-27T00:20:20.863 に答える