2010-10-01 37 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文檔