【问题标题】:Help needed with screen scraping using anemone and nokogiri使用海葵和 nokogiri 进行屏幕抓取需要帮助
【发布时间】:2011-04-19 16:37:33
【问题描述】:

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

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

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

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

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

任何帮助将不胜感激。

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

【问题讨论】:

    标签: ruby screen-scraping nokogiri


    【解决方案1】:

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

    有很多不同的方法可以确定如何从一个页面移动到另一个页面,但是当您知道页面上有多少元素以及有多少页面时,我会使用 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 语法。

    【讨论】:

    • 谢谢 Greg - 这应该有助于我开始。我使用 Anemone 是因为它可以通过“on_pages_like”轻松抓取与其匹配的页面。我猜 Nokogiri 可能也可以这样做,所以会在文档中戳一下,看看我得到了什么。再次感谢您的帮助
    • 从您对页面布局方式的描述来看,您无需查找下一页信息;他们使用标准的下一页链接,因此只需将页码填充到字符串中并检索它。 Nokogiri 可以很容易地找到下一页链接,但它看起来不是必需的,所以如果可以避免的话,不要浪费时间。 Stack Overflow 上的这个页面可能会有所帮助:stackoverflow.com/questions/2807500/…
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-02-25
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 2020-08-14
      • 2013-03-02
      相关资源
      最近更新 更多