我试图学习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
我仍然得到默认字符串,我必须得到没有登录。我将很高兴,如果有人能帮助我与此代码留在会话,直到提取完成。
当您尝试使用Nokogiri打开URL时,服务器将其视为新请求,并需要对该用户进行身份验证,因此,您需要捕获cookie并在每个请求时发送它们。
然而,实现结果的一种更简单的方法是使用机械化进行刮擦。因为它是建立在Nokogiri和Nokogiri方法也可用于机械化。
这是对你的代码的修改,使用Mechanize
来抓取agent = Mechanize.new
在你的情况下,你可以用mechanize来代替agent。
#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
这里的关键是继续使用您创建的mechanize实例进行抓取,因为它在服务器上已经有一个活动会话。