2009-10-08 2 views
3

Предположим, у меня есть весь HTML-адрес страницы результатов поиска Google. Кто-нибудь знает какой-либо существующий код (Ruby?), Чтобы очистить/проанализировать первую страницу результатов поиска Google? В идеале он будет обрабатывать разделы «Результаты покупок и видео», которые могут появиться где угодно.Скремблирование/анализ результатов поиска Google в Ruby

Если нет, то какой лучший инструмент на основе Ruby для скриншотов в целом?

Чтобы уточнить: я знаю, что трудно или невозможно получить результаты поиска Google программно/API-интерфейсом, а просто страницы результатов CURLing имеют много проблем. На обоих этих пунктах есть консенсус в stackoverflow. Мой вопрос другой.

+0

Предлагаю взглянуть на проверку ранга Google (http://google-rank-checker.squabbel.com). Это не рубин, это написано на PHP. Но это открытый исходный код и решает все задачи, которые вам нужны. Вы, похоже, не были исправлены в рубине, я лично использовал PHP (консольные скрипты) для многих таких проектов (также в производственных средах). Во всяком случае, даже когда вы пишете в рубине, вы найдете код PHP полезным, поскольку некоторые задачи при очистке Google могут быть довольно сложными (задержки, IP-адреса, разбор DOM, отправка правильных параметров GET и т. Д.). – John

ответ

11

Это должно быть очень просто, посмотрите на экран Screen Scraping with ScrAPI, снятый Райаном Бейтсом. Вы все еще можете обойтись без очищения libs, просто придерживайтесь простых вещей, таких как nokogiri.

Update:

От nokogiri-х documentation:

require 'nokogiri' 
    require 'open-uri' 

    # Get a Nokogiri::HTML:Document for the page we’re interested in... 

    doc = Nokogiri::HTML(open('http://www.google.com/search?q=tenderlove')) 

    # Do funky things with it using Nokogiri::XML::Node methods... 

    #### 
    # Search for nodes by css 
    doc.css('h3.r a.l').each do |link| 
    puts link.content 
    end 

    #### 
    # Search for nodes by xpath 
    doc.xpath('//h3/a[@class="l"]').each do |link| 
    puts link.content 
    end 

    #### 
    # Or mix and match. 
    doc.search('h3.r a.l', '//h3/a[@class="l"]').each do |link| 
    puts link.content 
    end 
+0

И вы можете сделать 'link ['href']', чтобы получить href ссылки;). – Dorian

+0

У Райана есть два скринкаста на соскабливание одного на ScrAPI, упомянутом выше, и [на Нокигири] (http: // railscasts.com/episodes/190-screen-scraping-with-nokogiri), который использует код, более похожий на тот, который содержится в этом ответе. –

1

Вы должны быть в состоянии достигнуть своей цели легко с Mechanize.

Редактировать: На самом деле, если у вас уже есть результаты, все, что вам нужно, это HPricot или Nokogiri.

+0

Добро пожаловать! И посмотрите мое обновление: если у вас уже есть результаты, Mechanize может быть излишним. – Avdi

5

Непонятно, почему вы хотите, чтобы в первую очередь был скребок экрана. Возможно, более подходящим может быть API поиска REST? Он вернет результаты в формате JSON, что будет намного легче разобрать и сэкономить на пропускной способности. Например, если ваш поиск был «foo bar», вы можете просто отправить запрос GET на http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=foo+bar и обработать ответ.

Для получения дополнительной информации см. Это blog post или official documentation.

+1

Это не возвращает те же результаты, к сожалению. См. Http://code.google.com/p/google-ajax-apis/issues/detail?id=43 –

2

Я хотел бы предложить HTTParty + Google Ajax Search API

1

Я не знаю, рубин конкретный код, но это google scraper может помочь вам. Это демо-версия онлайн-инструмента, которая работает соскабливанием и анализом результатов Google. Самое интересное - это статья с объяснением процесса синтаксического анализа в PHP, но она применима к Ruby и любому другому языку программирования.

2

Сломка становится все труднее и сложнее, поскольку Google продолжает меняться при расширении структуры результатов (богатые фрагменты, графа знаний, прямой ответ и т. Д.), Мы создали службу, которая обрабатывает часть этой сложности, и у нас есть Ruby library. Это довольно просто:

query = GoogleSearchResults.new q: "coffee" 

# Parsed Google results into a Ruby hash 
hash_results = query.get_hash