Нужна помощь с очисткой экрана с помощью анемона и нокогири - PullRequest
5 голосов
/ 01 октября 2010

У меня есть начальная страница http://www.example.com/startpage, в которой 1220 списков разбиты по страницам стандартным способом, например, 20 результатов на странице.

У меня работает код, который анализирует первую страницу результатов и переходит по ссылкам, которые содержат "example_guide / paris_shops" в их URL. Затем я использую Nokogiri, чтобы получить конкретные данные этой последней страницы. Все работает хорошо, и 20 результатов записываются в файл.

Однако я не могу понять, как заставить Anemone сканировать до следующей страницы результатов (http://www.example.com/startpage?page=2), а затем продолжить анализ этой страницы, а затем до 3-й страницы (http://www.example.com/startpage?page=3) и т. Д. *) 1009 *

Так что я хотел бы спросить, знает ли кто-нибудь, как я могу заставить анемон начать на странице, проанализировать все ссылки на этой странице (и следующий уровень данных для конкретных данных), но затем перейти к нумерации страниц до следующего страница результатов, так что анемона может начать анализ снова и так далее, и так далее. Учитывая, что ссылки на страницы отличаются от ссылок в результатах, Anemone, конечно, не следует за ними.

В данный момент я загружаю URL для первой страницы результатов, позволяю завершить это, а затем вставляю в следующий URL для 2-й страницы результатов и т. Д. И т. Д. Очень ручной и неэффективный, особенно для получения сотен страниц.

Любая помощь будет высоко ценится.

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 ]

4 голосов
/ 04 октября 2010

На самом деле у Анемона есть встроенный в него документ нокогири.если вы называете page.doc документом nokogiri, вам не нужно иметь два документа nokogiri

3 голосов
/ 01 октября 2010

Без реального HTML или реального сайта трудно привести точные примеры. Я сделал то, что вы пытаетесь сделать много раз, и вам действительно нужны только open-uri и nokogiri.

Существует множество разных способов определить, как перейти с одной страницы на другую, но когда вы знаете, сколько элементов на странице и сколько там страниц, я бы использовал простой цикл 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 для внутренних целей и облегчает обход документа и извлечение информации используя обычный синтаксис Нокогири.

...