在Ruby中发送http请求并保持登录?
我正在尝试用ruby抓取网站。我实现它的方式是发送一个页面请求,获取页面中的所有链接(href标记),然后生成另一个get请求。问题是我想在整个过程中保持登录状态。我写了一些代码如下在Ruby中发送http请求并保持登录?,ruby,http,cookies,http-headers,session-cookies,Ruby,Http,Cookies,Http Headers,Session Cookies,我正在尝试用ruby抓取网站。我实现它的方式是发送一个页面请求,获取页面中的所有链接(href标记),然后生成另一个get请求。问题是我想在整个过程中保持登录状态。我写了一些代码如下 def start_crawling uri = URI(@host + "/login") @visited.push @host + "/login" req = Net::HTTP::Post.new(uri) req.set_form_data({ 'email'
def start_crawling
uri = URI(@host + "/login")
@visited.push @host + "/login"
req = Net::HTTP::Post.new(uri)
req.set_form_data({
'email' => 'test',
'password' => 'test'
})
Net::HTTP.start(uri.hostname, uri.port) do |http|
res = http.request req
puts uri
puts res.code
content = res.body
puts content
puts res.response
cookie = res.response['Set-Cookie'] # this gives nothing
puts cookie
puts res["Set-Cookie"] # prints nothing here
hrefs = get_href_tag_array_from_html(content)
send_get_requests(hrefs, cookie)
end
end
def send_get_requests(hrefs, cookie)
while not hrefs.empty?
href = hrefs.pop
href = @host + href if not href.start_with?"http"
next if @visited.include?(href)
puts "href: " + href
uri = URI(href)
Net::HTTP.start(uri.host, uri.port) do |http|
req = Net::HTTP::Get.new uri
res = http.request req
puts "------------------href: #{href}---------------------------"
puts res.code
puts res.message
puts res.class.name
puts "Cookie: "
puts res['Set-Cookie'] # this works and prints cookies
puts res.body
puts "------------------end of: #{href}---------------------------"
new_hrefs = get_href_tag_array_from_html(res.body)
hrefs += new_hrefs
end
@visited.push href
end
end
我想从登录页面开始爬网。理想情况下,我希望在整个爬网过程中保持登录状态。我对会话/cookie的内容了解不多,但我想如果我能从上一个响应中获取cookie并在下一个请求中发送它,我应该能够保持登录状态。但是,我无法从登录响应中获取任何cookie。正如我所料,响应主体是302重定向。我在浏览器上检查了它,302响应头中确实包含一个cookie字段,该cookie用于下一个get请求重定向到主页,但我无法获取cookie字段
当我发送GET请求并获得响应时,我可以从中获取cookie字段,但当我发送登录页面的POST请求时,我无法获取任何cookie。在这种情况下,GET和POST请求之间有什么根本区别吗
知道我怎么才能得到这个cookie字段吗?还是我在解决爬行问题时有一些基本的误解?谢谢 如果不提供有问题的网页,真的很难说——这可能是他们的错。你试过用mechanize gem实现这个吗?@本能地感谢你指出这个工具。我会试试看。如果不提供有问题的网页,真的很难说——这可能是他们的错。你试过用mechanize gem实现这个吗?@本能地感谢你指出这个工具。我试试看。