Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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中发送http请求并保持登录?_Ruby_Http_Cookies_Http Headers_Session Cookies - Fatal编程技术网

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

在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'

我正在尝试用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字段吗?还是我在解决爬行问题时有一些基本的误解?谢谢

如果不提供有问题的网页,真的很难说——这可能是他们的错。你试过用mechanize gem实现这个吗?@本能地感谢你指出这个工具。我会试试看。如果不提供有问题的网页,真的很难说——这可能是他们的错。你试过用mechanize gem实现这个吗?@本能地感谢你指出这个工具。我试试看。