2012-02-26 49 views
8

我试图从使用HTTPS的网站上刮取数据。我设法使用Network.HTTP.Conduit成功发布基本请求(发布凭证等),但未能从响应头文件(Set-Cookie)中提取cookie信息。它看起来像http-conduit有它的own mechanism处理cookie,我不明白。http-conduit浏览器使用

Network.HTTP.Conduit.Browser似乎自动处理cookie(这对我来说很好),但由于缺少documentation,我无法工作。

可能有人与处理HTTP的导管浏览器模块更多的经验告诉我如何:

  1. 处理自签名证书(我管理的基本模块与managerCheckCerts做到这一点)
  2. 在主体中发送带有URL编码参数的POST请求,但不遵循任何重定向(我为此从基本模块中使用urlEncodedBody
  3. 使用来自简单GET请求中的第2步中的cookie并将响应作为(懒)ByteString(我会用这个httpLbs

对我来说,它看起来像Network.HTTP.Conduit.Browser的抽象层更适合我的应用程序相比Network.HTTP.Conduit,所以我想使交换机即使我可以处理手动使用后者的Cookie。

+0

我也有问题找到文档,它看起来像源代码有示例代码:https://github.com/exbb2/http-conduit-browser/blob/master/Network/HTTP/Conduit/Browser.hs – Lionel 2014-05-09 05:46:18

回答

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; BrowserAction来自getBrowserState :: BrowserAction BrowserState

http-conduit在浏览器模块外部管理cookie的方式是它没有。 Cookie在HTTP响应中返回;你可以做的是解析响应并将cookie存储在cookie罐中。这实际上是浏览器的全部功能。