8

HTTPS を使用してサイトからデータをスクレイピングしようとしています。Network.HTTP.Conduit を使用して基本的な要求を正常に行うことができました (資格情報の投稿など) が、応答ヘッダー (Set-Cookie) から Cookie 情報を抽出することに失敗しました。http-conduit にはCookie を処理するための独自のメカニズムがあるようですが、私には理解できませんでした。

Network.HTTP.Conduit.Browser は Cookie を自動的に処理するようですが (私には問題ありません)、ドキュメントが不足しているため機能しませんでした。

http-conduit ブラウザー モジュールを扱った経験のある人が、次の方法を教えてくれませんか?

  1. 自己署名証明書を処理します (基本モジュールのmanagerCheckCertsでこれを行うことができました)
  2. リダイレクトに従わず、本文に URL エンコードされたパラメーターを含む POST 要求を送信します (これにはベース モジュールのurlEncodedBodyを使用しました)。
  3. 2. ステップからの Cookie を単純な GET リクエストで使用し、応答を (遅延) ByteString として読み取ります (これにはhttpLbsを使用します) 。

Network.HTTP.Conduit.Browser の抽象化レベルは、Network.HTTP.Conduit と比較して私のアプリケーションにより適しているように見えるので、後者を使用して手動で Cookie を処理できたとしても切り替えたいと思います。

4

1 に答える 1

2

私はブラウザを使用したことはありませんが、http コンジットを使用したことがあります。これらの質問に答えるためにソースコードを読みました。間違いがあればお詫びします。

  1. あなたがしているのと同じことをしてください。Managerを右で作成したらmanagerCheckCerts、それを に渡しbrowse :: Manager -> BrowserAction a -> ResourceT IO aます。

  2. makeRequest :: Request IO -> BrowserAction (Response (Source IO BS.ByteString))かかりRequest IOます; 前と同じように使用urlEncodedBodyして、本文にパラメータを含む POST リクエストを作成し、それを に渡しますmakeRequest。0 に設定redirectCountすると、リダイレクトの追跡が無効になると思います。

  3. を使用するだけでよいと思いますgetCookieJar :: BrowserAction CookieJar。からBrowserActiongetBrowserState :: BrowserAction BrowserStateます。

http-conduit が Browser モジュールの外部で Cookie を管理する方法は、そうではありません。Cookie は HTTP 応答で返されます。できることは、応答を解析し、Cookie を Cookie jar に保存することです。ブラウザが実際に行うことはこれだけです。

于 2013-01-04T21:57:54.417 に答える