2010-10-01 43 views
5

我有一个http://www.example.com/startpage的起始页面,其中有1220个列表按标准方式分页,例如每页20个结果。使用银莲花和nokogiri屏幕抓取所需的帮助

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

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

所以我想问问,如果有人知道我怎么才能让海葵开始在一个页面上,解析该页面上的所有链接(和特定数据的下一级数据),然后按照分页到结果的下一页,所以海葵可以再次开始解析,等等。鉴于分页链接与结果中的链接不同,海葵不会遵循它们。

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

任何帮助将不胜感激。

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 

回答

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 

您可能想要考虑使用机械化来抓取网站。它本身并不是一个抓取工具,而是一个工具包,可以轻松浏览网站,填写表单并提交它们,处理认证,会话等。它在内部使用Nokogiri,并且可以轻松地漫游文档并提取内容使用常规的Nokogiri语法。

+0

感谢格雷格 - 这应该帮助我开始。我使用海葵来轻松抓取与“on_pages_like”相匹配的页面。我猜Nokogiri也可以做到这一点,所以将围绕文档捅了一下,看看我得到了什么。再次 - thx寻求帮助 – ginga 2010-10-02 11:53:47

+0

从您对网页布局的描述中,您无需查找下一页信息;他们使用标准的下一页链接,只需将页码填入字符串并检索即可。 Nokogiri可以很容易地找到下一页的链接,但它看起来并不是必要的,所以如果可以避免的话,不要浪费时间。这个页面上堆栈溢出可能有所帮助:http://stackoverflow.com/questions/2807500/following-a-link-using-nokogiri-for-scraping – 2010-10-02 16:49:13

+0

这个伎俩为我工作... – Avishai 2011-10-26 14:47:37

4

实际上,银莲花的内置了nokogiri文档。如果你打电话给page.doc这是一个nokogiri文档,所以不需要有两个nokogiri文档