Нужна помощь с очисткой экрана с помощью анемона и нокогири.

У меня есть начальная страница 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) и так далее.

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

person ginga    schedule 01.10.2010    source источник


Ответы (2)


на самом деле в Anemone встроен документ nokogiri. если вы вызываете page.doc, это документ nokogiri, поэтому нет необходимости иметь два документа nokogiri

person Davinj    schedule 04.10.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 внутри и упрощает просмотр документа и извлечение данных. используя обычный синтаксис нокогири.

person the Tin Man    schedule 01.10.2010
comment
Спасибо Грег - это должно помочь мне начать. Я использовал Anemone из-за простоты захвата страниц, которые соответствуют его on_pages_like. Я предполагаю, что Нокогири, вероятно, тоже может это сделать, поэтому покопаюсь в документах и ​​посмотрю, что у меня получится. Еще раз - спасибо за вашу помощь - person ginga; 02.10.2010
comment
Из вашего описания того, как расположены страницы, вам не нужно искать информацию о следующей странице; Они используют стандартную ссылку на следующую страницу, поэтому просто введите номер страницы в строку и извлеките ее. Нокогири может легко найти ссылку на следующую страницу, но не похоже, что это необходимо, поэтому не тратьте время, если можете этого избежать. Эта страница в Stack Overflow может помочь: > stackoverflow.com/questions/2807500/ - person the Tin Man; 02.10.2010