Как парсить интернет по-гусиному
«Распарсить сайт» — словосочетание, которое повергало меня в уныние всего полгода назад. В моей голове сразу же проносились знакомые проблемы с настройкой фантома, или возней с селениумом. Мысли о возможной необходимости подменять useragent, пагинации и других действиях во время парсинга заставляли откладывать эту задачу в долгий ящик…
Но всё изменилось, когда я встретил Гуся. Мир парсинга заиграл новыми красками. Под катом я хочу показать несколько простых примеров, которые могут помочь распарсить непростые сайты.
Кстати, написав парсер, Гусь решил снять фильм про это, пока что вы можете насладиться трейлером:
Как натравить Гуся на сайт
Всем известно, Гусь любит пощипать — травку, бабушку, гусынь… и конечно же сайты. Чтобы Гусь отложил свои дела и пощипал сайт для вас, необходимо просто указать ему дорогу.
На данный момент Гусь умеет парсить:
- внутри nodejs, используя PhantomJS;
- прямо в браузере (идеально если вы пишете плагин для браузера)
- используя селениум
Каждый из способов имеет свои плюшки и недостатки. Например, Phantom может работать на сервере, но в нем не очень удобно дебажить, запуск Гуся в браузере требует внешнего инструмента, который садит Гуся на сайт. Селениум является довольно универсальным решением, но на данный момент Гусь только учится его использовать.
Итак, чтобы запустить Гуся на сайт, прежде всего надо выбрать и создать среду обитания. Возможные среды:
- PhantomEnvironment
- BrowserEnvironment
- SeleniumEnvironment
В данной статье я буду рассматривать PhantomEnvironment, как наиболее развитый на данный момент.
import {
PhantomEnvironment,
Parser
} from 'goose-parser';
const env = new PhantomEnvironment({
url: 'http://www.gooseplanet.ru/'
});
const parser = new Parser({env});
Среда определяет точку входа Гуся — УРЛ начальной страницы сайта.
До парсинга
Зачастую, до того как мы начнем парсить нам необходимо выполнить какие-либо действия на странице. Например, поиск на гусином сайте знакомств. Гусь поищет за вас — только попросите.
const actions = [
{
type: 'type', // тип действия - печатать
text: 'гусыня', // Гусь будет искать гусынь, чтоб неплохо потоптаться
scope: '.field[name=search]' // селектор елемента
},
{
type: 'click',
scope: 'button[type=submit]',
waitForPage: true // если знаем что результаты откроются на новой странице
}
];
Декларативность — наше всё
Гусь описателен. Он прост и немногословен.
Пора бы и пощипать
Итак, теперь мы знаем, как найти гусынь. Пора стрельнуть у них адресок. Допустим верстка результатов поиска выглядит вот так:
-
Кряша
Гусятник №5
-
Гатильда
Хлев
Сориентируем Гуся, задав правила для расположения данных в этой верстке:
const rules = {
scope: '.goose-babe',
collection: [[
{
name: 'name',
scope: '.name'
},
{
name: 'address',
scope: 'address'
}
]]
};
Запускаем Гуся!
parser.parse({ actions, rules }).then(console.log);
И получаем результат:
[
{
"name": "Кряша",
"address": "Гусятник №5"
},
{
"name": "Гатильда",
"address": "Хлев"
}
]
И это только начало
Конечно же данная статья лишь знакомит читателей с Гусем, а не описывает все его возможности. Подробно о том, что умеет Гусь можно прочитать в документации. Но все же давайте перечислим некоторые приемы, которые Гусь приберег для непростых ситуаций:
- Гусь не боится пагинации — он может скролить страницы или прокликивать ссылки для получения нового контента. Вы можете даже научить Гуся кастомной пагинации;
- Гусь умеет ходить между страницами, важно и грациозно;
- Гусь может выполнять необходимые действия с клавиатурой и мышью для получения конкретного кусочка информации — у него очень шустрые лапки;
- Гусь может преобразовать полученные результаты;
- Гусь — умное, интеллигентное животное, вы можете рассказать ему новые фишки для парсинга и он начнет их применять — API для Гусь-парсера очень легко расширяется;
- Гусь — животное общинное, за счет своей любви к nodejs, легко может жить на гусиной ферме и парсить миллионы сайтов единовременно;
Поставьте Гусю звезду — и он захватит мир ради вас github.com/redco/goose-parser