http-conduit浏览器用法

ako*_*sch 8 https haskell session-cookies web-scraping http-conduit

我正在尝试使用HTTPS从网站上抓取数据.我成功地使用Network.HTTP.Conduit发布基本请求(发布凭据等),但是无法从响应头(Set-Cookie)中提取cookie信息.貌似http-conduit有自己的处理cookie 的机制,我无法理解.

Network.HTTP.Conduit.Browser似乎自动处理cookie(我很好),但由于缺少文档,我无法使用它.

有经验处理http-conduit浏览器模块的人可以告诉我如何:

  1. 处理自签名证书(我设法在基本模块中使用managerCheckCerts执行此操作)
  2. 在正文中发送带有URL编码参数的POST请求,而不是遵循任何重定向(我在基础模块中使用了urlEncodedBody)
  3. 在简单的GET请求中使用2.步骤中的cookie并将响应读作(懒惰)ByteString(我本来会使用httpLbs)

对我来说,看起来Network.HTTP.Conduit.Browser的抽象级别比Network.HTTP.Conduit更适合我的应用程序,所以即使我可以使用后者手动处理cookie,我也想进行切换.

hao*_*hao 2

我从未使用过浏览器,但我使用过http-conduit。我阅读了源代码来回答这些问题,如果有任何错误,我深表歉意。

  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. 我相信设置redirectCount为 0 以禁用重定向跟随。

  3. 我相信你只需要使用getCookieJar :: BrowserAction CookieJar; 来自.BrowserActiongetBrowserState :: BrowserAction BrowserState

http-conduit 在浏览器模块之外管理 cookie 的方式并非如此。Cookie 在 HTTP 响应中返回;您可以做的就是解析响应并将 cookie 存储在 cookie jar 中。这实际上就是浏览器真正所做的一切。