Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Ruby中的curl将cookies从一个页面传递到另一个页面?_Ruby_Cookies_Curl - Fatal编程技术网

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

如何使用Ruby中的curl将cookies从一个页面传递到另一个页面?,ruby,cookies,curl,Ruby,Cookies,Curl,我正在用ruby做一个视频爬虫。在那里,我必须通过启用cookies和下载页面来登录页面。为此,我使用ruby中的CURL库。我可以成功登录,但我无法使用curl下载其中的页面。我如何修复此问题或下载其他页面 我的代码是 curl = Curl::Easy.new(1st url) curl.follow_location = true curl.enable_cookies = true curl.cookiefile = "cookie.txt" curl.cookiejar = "cook

我正在用ruby做一个视频爬虫。在那里,我必须通过启用cookies和下载页面来登录页面。为此,我使用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
使这类事情变得非常简单(它将处理存储Cookie等事情)。

自动启用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)

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

我认为你错在这里:

curl = Curl::Easy.perform(2nd url)
路缘文档说明这将创建一个新对象。该新对象未设置任何现有Cookie。如果您将代码更改为如下所示,我相信它应该可以工作。我还删除了curl.perform作为第一个url,因为curl.http_post已经隐式执行了“perform”。基本上,您在尝试http\u-get之前已经发布了两次http\u-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
如果这似乎仍然不适用于您,您可以通过添加

curl.verbose = true
以前

curl.http_post

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

您应该始终发布代码。当我们可以从你现在的位置开始时,这会使帮助你变得更容易。