- PVSM.RU - https://www.pvsm.ru -
“Распарсить сайт” — словосочетание, которое повергало меня в уныние всего полгода назад. В моей голове сразу же проносились знакомые проблемы с настройкой фантома, или возней с селениумом. Мысли о возможной необходимости подменять useragent, пагинации и других действиях во время парсинга заставляли откладывать эту задачу в долгий ящик…
Но всё изменилось, когда я встретил Гуся. Мир парсинга заиграл новыми красками. Под катом я хочу показать несколько простых примеров, которые могут помочь распарсить непростые сайты.
Кстати, написав парсер, Гусь решил снять фильм про это, пока что вы можете насладиться трейлером:
Всем известно, Гусь любит пощипать — травку, бабушку, гусынь… и конечно же сайты. Чтобы Гусь отложил свои дела и пощипал сайт для вас, необходимо просто указать ему дорогу.
На данный момент Гусь умеет парсить:
Каждый из способов имеет свои плюшки и недостатки. Например, Phantom может работать на сервере, но в нем не очень удобно дебажить, запуск Гуся в браузере требует внешнего инструмента, который садит Гуся на сайт. Селениум является довольно универсальным решением, но на данный момент Гусь только учится его использовать.
Итак, чтобы запустить Гуся на сайт, прежде всего надо выбрать и создать среду обитания. Возможные среды:
В данной статье я буду рассматривать 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 // если знаем что результаты откроются на новой странице
}
];
Гусь описателен. Он прост и немногословен.
Итак, теперь мы знаем, как найти гусынь. Пора стрельнуть у них адресок. Допустим верстка результатов поиска выглядит вот так:
<ul class="goose-babes">
<li class="goose-babe">
<img src="https://habrastorage.org/getpro/habr/post_images/3df/cbd/088/3dfcbd088e8f5b4ba060a73f8d5e3788.jpg" alt="Кряша" class="photo">
<span class="name">Кряша</span>
<div>
<address>Гусятник №5</address>
</div>
</li>
<li class="goose-babe">
<img src="https://habrastorage.org/getpro/habr/post_images/a48/283/87b/a4828387bbe8658749cc7a42d53ddcd9.jpg" alt="Гатильда" class="photo">
<span class="name">Гатильда</span>
<div>
<address>Хлев</address>
</div>
</li>
</ul>
Сориентируем Гуся, задав правила для расположения данных в этой верстке:
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": "Хлев"
}
]
Конечно же данная статья лишь знакомит читателей с Гусем, а не описывает все его возможности. Подробно о том, что умеет Гусь можно прочитать в документации [1]. Но все же давайте перечислим некоторые приемы, которые Гусь приберег для непростых ситуаций:
Поставьте Гусю звезду — и он захватит мир ради вас github.com/redco/goose-parser [2]
Автор: and_rew
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/129065
Ссылки в тексте:
[1] документации: https://github.com/redco/goose-parser/blob/master/README.md
[2] github.com/redco/goose-parser: https://github.com/redco/goose-parser
[3] Источник: https://habrahabr.ru/post/271425/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.