在Ruby中发送http请求并保持登录状态?

时间:2016-02-17 20:00:50

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

0 个答案:

没有答案