如何使用 ruby​​ Mechanize gem 抓取需要先登录的网站

Atc*_*ava 5 ruby nokogiri mechanize-ruby

我试图学习 ruby​​ Mechanize gem 的用法,从中我可以填写表格并登录网站。但我无法在登录后提取数据。基本上,该网站仅在登录后才显示数据,否则它会显示一些默认字符串。例如:“查看网站”而不是 www.example.com

我尝试编写这段代码:

#code to login
require 'mechanize'
require 'logger'
require 'rubygems'
require 'nokogiri'
require 'open-uri'
require 'zlib'

mechanize = Mechanize.new

login = mechanize.get('website login page')
form = login.forms.first
form['student_email'] = 'email@gmail.com'
form['student_password'] = 'password'
result = form.submit
puts result.code
puts "logged in"

#code to extract
url = 'data_path_url'
    doc = Nokogiri::HTML(open(url))
    paths = doc.css('.college_name a')  #capturing the link to extract.
    paths.each do |path|
        path = path['href']
        path = path.to_s
        page = Nokogiri::HTML(open(path))
        data = page.css('.font11.bold') #data to extract
        puts data.text #data to display.

    end
Run Code Online (Sandbox Code Playgroud)

我仍然获得默认字符串,我必须在不登录的情况下获得这些字符串。如果有人可以帮助我使用此代码以留在会话中直到提取完成,我会很高兴。

use*_*754 2

当您尝试使用 Nokogiri 打开 URL 时,服务器会将其视为新请求,并且需要验证该用户的身份,因此,您需要捕获 cookie 并在每个请求上发送它们。

然而,实现这一结果的更简单方法是使用机械化进行刮削。由于它是基于 Nokogiri 构建的,并且 Nokogiri 方法也可以在 mechanize 中使用。

这是对代码的修改,以便使用 Mechanize 进行抓取

agent = Mechanize.new
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您可以使用“机械化”代替代理。

#code to extract data

doc = agent.get('data_path_url')
paths = doc.css('.college_name a')  #capturing the link to extract.
paths.each do |path|
    path = path['href']
    path = path.to_s
    page = agent.get('path')
    data = page.css('.font11.bold') #data to extract
    puts data.text #data to display.
end
Run Code Online (Sandbox Code Playgroud)

这里的关键是继续使用您创建的 mechanize 实例进行抓取,因为它已经在服务器上有一个活动会话。