gin*_*nga 5 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
Run Code Online (Sandbox Code Playgroud)
如果没有实际的 HTML 或真实的网站,很难给出准确的例子。我已经做了很多次你想做的事情,而你真的只需要open-uri和nokogiri。
有很多不同的方法可以确定如何从一个页面移动到另一个页面,但是当您知道页面上有多少个元素以及有多少个页面时,我会使用 1200 / 20 = 60 页的简单循环。该例程的要点如下:
需要“open-uri”
需要“nokogiri”
1.upto(60) 执行 |page_num|
doc = Nokogiri::HTML(open("http://www.example.com/startpage?page=#{page_num}"))
# ...抓取你想要的数据...
# ...睡n秒就可以了...
结尾
您可能想考虑使用 Mechanize 来抓取该网站。它本身不是一个爬虫,而是一个工具包,可以轻松浏览网站、填写表单并提交、处理身份验证、会话等。它在内部使用 Nokogiri,可以轻松遍历文档并提取内容使用常规的 Nokogiri 语法。
| 归档时间: |
|
| 查看次数: |
2345 次 |
| 最近记录: |