我正在尝试使用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' => '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字段?或者我在解决这个爬行问题时有一些基本的误解?谢谢。