【问题标题】:Data scraping information from all of the search results pages所有搜索结果页面的数据抓取信息
【发布时间】:2016-06-02 16:09:38
【问题描述】:

我正在尝试从 UCAS 网站上抓取数据,以显示从基本搜索返回的所有页面中的所有 Uni 名称。

到目前为止,在没有循环工作的情况下,它会显示第一页中所有大学的名称以及一些随机信息,如下所示:

"The University of Aberdeen
Abertay University
Aberystwyth University
ABI College
Abingdon and Witney College
The Academy of Contemporary Music
Access to Music
Accrington & Rossendale College
Activate Learning (Oxford, Reading, Banbury & Bicester)
The College of Agriculture, Food and Rural Enterprise
Amersham & Wycombe College
Amsterdam Fashion Academy
Anglia Ruskin University
Anglo European College of Chiropractic
Arden University (RDI)
University of the Arts London
Arts University Bournemouth (formerly University College)
ARU London
Askham Bryan College
Aston University, Birmingham
Availability
Applying through Extra
Single/Combined subjects
Provider types
How you study
Qualification level
Conservatoire specialism"

这是我的代码:

require 'rubygems' 
require 'nokogiri'  
require 'open-uri'  
require 'mechanize'

mechanize = Mechanize.new

doc = mechanize.get('http://search.ucas.com/')

form = doc.forms.first

form['Vac'] = '2'  
form['AvailableIn'] = '2016'  
doc = form.submit
doc.search('li.results clearfix').each do |h3|  
  puts h3.text.strip  


  while a = doc.at('div.pagerclearfix a')   
    doc = Nokogiri::HTML(open(a[:href]))    
    doc.search('results clearfix').each do |h3|    
      puts h3.text.strip   

    end 
  end 
end

【问题讨论】:

  • 您的问题到底是什么?您只从第一页而不是所有页面获取结果?
  • 是的,第一个 puts 似乎是打印的,并且循环似乎不起作用,所以那里的 puts 不会。我认为在检查元素时页面上的 div.pagerclearfix 存在问题,称为 pager.clearfix。
  • 欢迎来到 SO。请阅读“minimal reproducible example”。我们需要问题本身中的最小 HTML 样本。一些试图提供帮助的人无法访问互联网,或者他们不想通过一个大文件来筛选有问题的标签。

标签: ruby-on-rails ruby web-scraping nokogiri mechanize


【解决方案1】:

您不需要require 'rubygems',因为这是一种反模式。你不需要require 'nokogiri',因为它是 Mechanize 要求的,你不需要 OpenURI。

分页不起作用,因为div.pagerclearfix 选择器不匹配任何内容,因为pagerclearfix 是单独的类。此外,while 循环位于错误的位置,它不应该在打印结果的 each 循环内。

你最终应该是这样的:

require 'mechanize'

mechanize = Mechanize.new

page = mechanize.get('http://search.ucas.com/')

form = page.forms.first
form['Vac'] = '2'
form['AvailableIn'] = '2016'

page = form.submit

page.search('li.result h3').each do |h3|
  puts h3.text.strip
end

while next_page_link = page.at('.pager a[text()=">"]')
  page = mechanize.get(next_page_link['href'])

  page.search('li.result h3').each do |h3|
    puts h3.text.strip
  end
end

有多种方法可以实现分页,搜索“下一页”链接通常是最直接的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    相关资源
    最近更新 更多