如何使用Ruby中的curl将cookie从一个页面传递到另一个页面?

时间:2011-02-02 05:01:14

标签: ruby cookies curl

我正在使用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

3 个答案:

答案 0 :(得分:3)

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

我认为你出错的地方就在这里:

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

curb文档声明这会创建一个新对象。该新对象没有任何现有的Cookie设置。如果您将代码更改为如下所示,我相信它应该可行。我还删除了第一个url的curl.perform,因为curl.http_post已经隐式执行了“perform”。在尝试你的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。我现在没有任何示例输出,但我会尽快发布后续内容。

答案 1 :(得分:0)

HTTPClient会像Mechanize一样自动启用Cookie。

来自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)

答案 2 :(得分:-1)

Mechanize使这类事情变得非常简单(它将处理存储cookie等等)。