【问题标题】:http-conduit browser usagehttp-conduit 浏览器使用
【发布时间】:2012-03-16 05:00:45
【问题描述】:

我正在尝试使用 HTTPS 从站点中抓取数据。我成功地使用 Network.HTTP.Conduit 发出基本请求(发布凭据等),但未能从响应标头(Set-Cookie)中提取 cookie 信息。看起来 http-conduit 有它的 own mechanism 用于处理 cookie,我无法理解。

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

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

  1. 处理自签名证书(我设法在基本模块中使用managerCheckCerts 做到这一点)
  2. 在正文中发送带有 URL 编码参数的 POST 请求,不遵循任何重定向(我为此使用了基本模块中的 urlEncodedBody
  3. 在简单的 GET 请求中使用 2. 步骤中的 cookie,并将响应读取为(惰性)ByteString(我会为此使用 httpLbs

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

【问题讨论】:

标签: haskell https web-scraping session-cookies http-conduit


【解决方案1】:

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

  1. 做你正在做的事情。当您使用正确的managerCheckCerts 创建Manager 后,将其传递给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 CookieJarBrowserAction 来自 getBrowserState :: BrowserAction BrowserState

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

【讨论】:

    猜你喜欢
    • 2012-03-03
    • 1970-01-01
    • 2014-03-14
    • 2011-03-05
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多