我正在使用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
答案 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等等)。