【问题标题】:How to pass cookies from one page to another using curl in Ruby?如何在Ruby中使用curl将cookie从一个页面传递到另一个页面?
【发布时间】:2011-02-02 05:01:14
【问题描述】:

我正在用 ruby​​ 做一个视频爬虫。在那里,我必须通过启用 cookie 和下载页面来登录页面。为此,我在 ruby​​ 中使用 CURL 库。我可以成功登录,但我不能用 curl 下载里面的页面。我该如何解决这个问题或以其他方式下载页面?

我的代码是

curl = Curl::Easy.new(1st url)
curl.follow_location = true
curl.enable_cookies = true
curl.cookiefile = "cookie.txt"
curl.cookiejar = "cookie.txt"
curl.http_post(1st url,field)

curl.perform
curl = Curl::Easy.perform(2nd url)
curl.follow_location = true
curl.enable_cookies = true
curl.cookiefile = "cookie.txt"
curl.cookiejar = "cookie.txt"
curl.http_get

code = curl.body_str

【问题讨论】:

  • 您应该始终发布您的代码。当我们可以从您所在的位置开始时,它会为您提供更轻松的帮助。

标签: ruby cookies curl


【解决方案1】:

我在编写自己的类似“post-then-get”脚本时看到的是 ruby​​/Curb(我使用 ruby​​ 1.8 的 0.7.15 版)似乎忽略了 Curl 的 cookiejar/cookiefile 字段::简单的对象。如果我设置了这些字段中的任何一个并且 http_post 成功完成,则不会创建 cookiejar 或 cookiefile 文件。此外,在您的 curl.http_post 之后,curl.cookies 仍然为零,但是,cookie 设置在 curl 对象中。我保证:)

我认为你的错误在哪里:

curl = Curl::Easy.perform(2nd url)

路边文档指出这会创建一个新对象。该新对象没有任何现有的 cookie 集。如果您将代码更改为如下所示,我相信它应该可以工作。我还删除了第一个 url 的 curl.perform,因为 curl.http_post 已经隐式地执行了“执行”。在尝试 http_get 之前,您基本上是 http_post'ing 两次。

curl = Curl::Easy.new(1st url)
curl.follow_location = true
curl.enable_cookies = true
curl.http_post(1st url,field)

curl.url = 2nd url
curl.http_get

code = curl.body_str

如果这似乎仍然不适合您,您可以通过添加来验证 cookie 是否正在设置

curl.verbose = true

之前

curl.http_post

您的 Curl::Easy 对象会将它从服务器响应中获得的所有标头转储到 $stdout,并且在那里的某处您应该会看到一行表明它添加/设置了 cookie。我现在没有任何示例输出,但我会尽快发布后续内容。

【讨论】:

    【解决方案2】:

    HTTPClient 自动启用 cookie,Mechanize 也是如此。

    来自 HTTPClient 文档:

    clnt = HTTPClient.new
    clnt.get_content(url1) # receives Cookies.
    clnt.get_content(url2) # sends Cookies if needed.
    

    发布表格也很容易:

    body = { 'keyword' => 'ruby', 'lang' => 'en' }
    res = clnt.post(uri, body)
    

    【讨论】:

      【解决方案3】:

      Mechanize 让这种事情变得非常简单(它会处理存储 cookie 等)。

      【讨论】:

        猜你喜欢
        • 2012-07-24
        • 2014-12-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多