Антон Рябов bio photo

Антон Рябов

Не люблю бриться и у меня умный взгляд.

Email Twitter Telegram Github PGP RSS

07.04.2024: Эта статья изначально была опубликована на habr.com и была просмотрена там 17 тысяч раз. Но теперь я решил перенести её в свой блог.

От переводчика: Оригинал статьи Web scraping with morph.io

Обзор



Если вы читали предыдущие две статьи, Веб-парсинг на Ruby и Продвинутый парсинг веб-сайтов с Mechanize, то у вас есть базовые знания как написать парсер, который получает структурированные данные с веб-сайта.

Следующим логичным шагом будет запускать парсер регулярно, чтобы всегда иметь свежие данные. Этим как раз и занимается morph.io от талантливых людей из OpenAustralia.

Morph.io позиционирует себя как “Heroku для парсеров”. Вы можете выбрать либо запускать парсеры вручную, или им работать автоматически каждый день. При этом вы можете использовать API для извлечения данных в JSON/CSV и использования их в своем приложении или скачать sqlite базу с данными. Morph.io заполняет пробел, оставленный Scraperwiki Classic. Парсеры в morph.io хостятся на GitHub, что означает что вы можете их “форкнуть” и исправить в дальнейшем, если они перестанут работать.

Создание парсера

Мы будем использовать код из моего предыдущего поста, чтобы показать насколько легко запустить ваш парсер на morph.io.

Для входа на morph.io необходимо использовать ваш аккаунт GitHub. После авторизации вы можете создать парсер. На данный момент morp.io поддерживает парсеры написанные на Ruby, PHP, Python или Perl, выберите язык и задайте имя вашего парсера, свой я назвал pitchfork_scraper. Затем нажмите кнопку “Create Scraper” чтобы создать новый GitHub репозиторий содержащий скелет парсера в соответствии с языком, который вы выбрали.

Склонируйуте себе репозиторий, созданный на предыдущем шаге, в моем случае это выглядит так:

git clone https://github.com/chrismytton/pitchfork_scraper

Репозиторий будет содержать файлы README.md и scraper.rb.

Morph.io ожидает две вещи от парсера. Первое - репозиторий парсера должен содержать файл scraper.rb для Ruby парсеров, второе - сам парсер должен писать в sqlite базу данных, которая называется data.sqlite.

Соответственно для парсера на Python файл должен называться - scraper.py, для PHP - scraper.php, a для Perl - scraper.pl.

Для того чтобы добавить это в наш парсер, нужно внести небольшие изменения чтобы выводить данные в базу sqlite, а не в STDOUT в виде JSON.

Для начала нужно добавить код из предыдущей статьи в наш scraper.rb, затем нужно изменить код так, чтобы он использовал гем scraperwiki чтобы записывать данные в sqlite базу данных.

diff --git a/scraper.rb b/scraper.rb
index 2d2baaa..f8b14d6 100644
--- a/scraper.rb
+++ b/scraper.rb
@@ -1,6 +1,8 @@
 require 'mechanize'
 require 'date'
-require 'json'
+require 'scraperwiki'
+
+ScraperWiki.config = { db: 'data.sqlite', default_table_name: 'data' }

 agent = Mechanize.new
 page = agent.get("http://pitchfork.com/reviews/albums/")
@@ -34,4 +36,6 @@ reviews = review_links.map do |link|
   }
 end

-puts JSON.pretty_generate(reviews)
+reviews.each do |review|
+  ScraperWiki.save_sqlite([:artist, :album], review)
+end

Данный код использует метод ScraperWiki.save_sqlite чтобы сохранять обзор в базу данных. Первый аргумент это список полей, которые должны быть уникальными. В данном случае, мы используем артиста и альбом, так как маловероятно, что один и тот же артист выпустит два альбома с одним и тем же названием. Чтобы запускать код локально, вам нужно установить Ruby гем scraperwiki в дополнение к зависимостям, которые уже есть.

gem install scraperwiki

Затем можно запускать код на локальной машине:

ruby scraper.rb

В результате создастся новый файл в текущей директории с названием data.sqlite, который будет содержать спарсенные данные.

Запуск парсера на morph.io

Теперь, когда мы сделали все необходимые изменения, можно запустить наш код на morph.io. Во-первых закоммитим наши изменения - git commit и отправим их в репозиторий git push.

Теперь можно запускать парсер и результат будет добавлен в базу данных на morph.io. Это должно выглядеть примерно так:




Как вы можете видеть, данные доступны авторизованным пользователям в формате JSON или CSV, или вы можете скачать sqlite базу данных и просмотреть её локально.

Код парсера доступен на GitHub. Вы можете видеть вывод парсера на morph.io. Учтите, что вам необходимо авторизоваться через GitHub чтобы получить доступ к самим данным и управлению через API.

Эта статья должна дать вам достаточный уровень знаний, чтобы начать хостить свои парсеры на morph.io. На мой взгляд, это удивительный сервис, который берет на себя хлопоты по эксплуатации и обслуживанию парсеров, позволяя вам сконцентрироваться на уникальных частях вашего приложения.

Вперед за структурированными данными из веба!

Все статьи серии:

  1. Веб-парсинг на Ruby
  2. Продвинутый парсинг веб-сайтов с Mechanize
  3. Использование morph.io для веб-парсинга (вы здесь)
#Ruby