使用海葵和nokogiri进行屏幕刮擦需要帮助

时间:2010-10-01 04:46:05

标签: ruby screen-scraping nokogiri

我有一个http://www.example.com/startpage的起始页面,其中1220个列表以标准方式分页,例如每页20个结果。

我有代码工作,解析结果的第一页,并在其网址中包含“example_guide / paris_shops”的链接。然后我使用Nokogiri来提取该最终页面的特定数据。一切正常,20个结果写入文件。

但是,我似乎无法弄清楚如何让Anemone抓取到下一页的结果(http://www.example.com/startpage?page=2),然后继续解析该页面然后是第3页(http://www.example.com/startpage?page=3)等等。

所以我想问一下是否有人知道如何在页面上启动海葵,解析该页面上的所有链接(以及特定数据的下一级数据),然后跟着分页到下一页结果页面,所以海葵可以再次开始解析,依此类推。鉴于分页链接与结果中的链接不同,Anemone当然不会遵循它们。

目前我正在加载第一页结果的网址,让它完成然后粘贴到第二页结果等的下一个网址等。非常手动和低效,尤其是获取数百页。

非常感谢任何帮助。

require 'rubygems'
require 'anemone'
require 'nokogiri'
require 'open-uri'

Anemone.crawl("http://www.example.com/startpage", :delay => 3) do |anemone|
  anemone.on_pages_like(/example_guide\/paris_shops\/[^?]*$/) do | page |

doc = Nokogiri::HTML(open(page.url))

name = doc.at_css("#top h2").text unless doc.at_css("#top h2").nil?
address = doc.at_css(".info tr:nth-child(3) td").text unless doc.at_css(".info tr:nth-child(3) td").nil?
website = doc.at_css("tr:nth-child(5) a").text unless doc.at_css("tr:nth-child(5) a").nil?

open('savedwebdata.txt', 'a') { |f|
  f.puts "#{name}\t#{address}\t#{website}\t#{Time.now}"
}
  end
end

2 个答案:

答案 0 :(得分:4)

实际上,Anemone内置了nokogiri doc。如果你调用page.doc这是一个nokogiri文档,所以不需要有两个nokogiri文档

答案 1 :(得分:3)

如果没有实际的HTML或真实的网站,很难给出确切的例子。我已经完成了你多次尝试做的事情,而且你真的只需要open-urinokogiri

有许多不同的方法可以确定如何从一个页面移动到另一个页面,但是当您知道页面上有多少元素以及有多少页面时,我会使用一个简单的循环1200/20 = 60页。例行程序的要点如下:

require 'open-uri'
require 'nokogiri'

1.upto(60) do |page_num|
  doc = Nokogiri::HTML(open("http://www.example.com/startpage?page=#{page_num}"))
  # ... grab the data you want ...
  # ... sleep n seconds to be nice ...
end

您可能希望使用Mechanize来抓取网站。它本身不是一个爬虫,而是一个工具包,可以轻松浏览网站,填写表格并提交,处理身份验证,会话等。它在内部使用Nokogiri,可以轻松地遍历文档并提取内容使用常规的Nokogiri语法。