0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Парсинг сайтов (web scraping) можно использовать для создания сводки новостных лент, пополнения базы email-адресов, сравнения цен и других целей. В нашей статье мы поговорим о парсинге через API сайтов - данный подход отличается простотой, ведь парсинг всей страницы не требуется. В большинстве случаев этот подход весьма неплох. Но стоит учесть, что он может не сработать, если владелец сайта установит специальные настройки.</p>
1
<p>Парсинг сайтов (web scraping) можно использовать для создания сводки новостных лент, пополнения базы email-адресов, сравнения цен и других целей. В нашей статье мы поговорим о парсинге через API сайтов - данный подход отличается простотой, ведь парсинг всей страницы не требуется. В большинстве случаев этот подход весьма неплох. Но стоит учесть, что он может не сработать, если владелец сайта установит специальные настройки.</p>
2
<h2>Как это функционирует?</h2>
2
<h2>Как это функционирует?</h2>
3
<p>Алгоритм следующий: - парсер посылает веб-странице get-запрос; - парсер получает данные в виде HTML/XML; - осуществляется извлечение данных в желаемом формате.</p>
3
<p>Алгоритм следующий: - парсер посылает веб-странице get-запрос; - парсер получает данные в виде HTML/XML; - осуществляется извлечение данных в желаемом формате.</p>
4
<p>Чтобы загружать файлы через консоль нам подойдёт утилита<a>Wget</a>, однако вы вправе выбрать и другой инструмент на своё усмотрение.</p>
4
<p>Чтобы загружать файлы через консоль нам подойдёт утилита<a>Wget</a>, однако вы вправе выбрать и другой инструмент на своё усмотрение.</p>
5
<p>Для работы нам подойдёт программный пакет<a>osmosis</a>, который написан на Node.js. Пакет включает в себя небольшой http-обработчик и селектор css3/xpath. В принципе, существуют и другие фреймворки типа Webdriver, но они не потребуются.</p>
5
<p>Для работы нам подойдёт программный пакет<a>osmosis</a>, который написан на Node.js. Пакет включает в себя небольшой http-обработчик и селектор css3/xpath. В принципе, существуют и другие фреймворки типа Webdriver, но они не потребуются.</p>
6
<h2>Настройка проекта</h2>
6
<h2>Настройка проекта</h2>
7
<p>Итак, приступим: 1. Выполняем установку<a>Node.js</a>, которая поставляется совместно с npm (менеджером пакетов). 2. Выполняем создание новой папки, пусть это будет webscrap, но можете использовать и любое другое имя. 3. Переходим в эту папку командой cd webscrap. 4. Осуществляем запуск из консоли командой npm init, чтобы создать файл package.json. 5. Выполняем npm i osmosis --save - это обеспечивает установку пакета для парсинга. Дополнительных зависимостей не будет (только от обработчика и селектора). 6. Открываем package.json, потом создаём новый стартовый скрипт - он нам нужен для последующего выполнения команды npm start.</p>
7
<p>Итак, приступим: 1. Выполняем установку<a>Node.js</a>, которая поставляется совместно с npm (менеджером пакетов). 2. Выполняем создание новой папки, пусть это будет webscrap, но можете использовать и любое другое имя. 3. Переходим в эту папку командой cd webscrap. 4. Осуществляем запуск из консоли командой npm init, чтобы создать файл package.json. 5. Выполняем npm i osmosis --save - это обеспечивает установку пакета для парсинга. Дополнительных зависимостей не будет (только от обработчика и селектора). 6. Открываем package.json, потом создаём новый стартовый скрипт - он нам нужен для последующего выполнения команды npm start.</p>
8
<p>Вот как будет в итоге выглядеть наш package.json:</p>
8
<p>Вот как будет в итоге выглядеть наш package.json:</p>
9
{ "name": "webscrap", "version": "1.0.0", "main": "index.js", "scripts": { "start": "node index" }, "dependencies": { "osmosis": "^1.1.2" } }<p>Теперь потребуется создать файл index.js, в котором и будем работать.</p>
9
{ "name": "webscrap", "version": "1.0.0", "main": "index.js", "scripts": { "start": "node index" }, "dependencies": { "osmosis": "^1.1.2" } }<p>Теперь потребуется создать файл index.js, в котором и будем работать.</p>
10
<h2>Парсинг информативного заголовка в Google</h2>
10
<h2>Парсинг информативного заголовка в Google</h2>
11
<p>Приведём базовый пример для ознакомления с пакетом и запуском первого Node-скрипт. Давайте поместим нижеследующий код в файл index.js, а потом запустим консольную команду npm start. Эта команда выведет заголовок veb-страницы:</p>
11
<p>Приведём базовый пример для ознакомления с пакетом и запуском первого Node-скрипт. Давайте поместим нижеследующий код в файл index.js, а потом запустим консольную команду npm start. Эта команда выведет заголовок veb-страницы:</p>
12
const osmosis = require('osmosis'); osmosis .get('www.google.com') .set({'Title': 'title'}) // альтернатива: `.find('title').set('Title')` .data(console.log) // выведет {'Title': 'Google'}<p>Теперь давайте разберём, что выполняют методы. Первый (get) получает veb-страницу в сжатом формате. Второй (set) выбирает элемент заголовка, который представлен в виде css3-селектора. Третий (data с console.log) осуществляет вывод. Кроме того, set принимает в качестве аргумента строки.</p>
12
const osmosis = require('osmosis'); osmosis .get('www.google.com') .set({'Title': 'title'}) // альтернатива: `.find('title').set('Title')` .data(console.log) // выведет {'Title': 'Google'}<p>Теперь давайте разберём, что выполняют методы. Первый (get) получает veb-страницу в сжатом формате. Второй (set) выбирает элемент заголовка, который представлен в виде css3-селектора. Третий (data с console.log) осуществляет вывод. Кроме того, set принимает в качестве аргумента строки.</p>
13
<h2>Как получить релевантные результаты в Google?</h2>
13
<h2>Как получить релевантные результаты в Google?</h2>
14
<p>Представьте, что вы желаете получить результаты по такому ключевому слову, как analytics. Что делаем:</p>
14
<p>Представьте, что вы желаете получить результаты по такому ключевому слову, как analytics. Что делаем:</p>
15
osmosis .get('https://www.google.co.in/search?q=analytics') .find('#botstuff') .set({'related': ['.card-section .brs_col p a']}) .data(function(data) { console.log(data); })<p>Вот, собственно говоря, и всё. Данный код извлечёт соответствующие ключевые слова с 1-й страницы результатов поиска. Потом он поместит слова в массив, после чего запишет их в лог в консоли. Логика тут следующая: - мы анализируем veb-страницу, используя инструменты разработчика; - мы проверяем блок, где находится слово (в нашем случае это div #botstuff) и выполняем его сохранение в массив посредством селектора .card-section .brs_col p a, который сможет найти на странице все соответствующие ключевые слова.</p>
15
osmosis .get('https://www.google.co.in/search?q=analytics') .find('#botstuff') .set({'related': ['.card-section .brs_col p a']}) .data(function(data) { console.log(data); })<p>Вот, собственно говоря, и всё. Данный код извлечёт соответствующие ключевые слова с 1-й страницы результатов поиска. Потом он поместит слова в массив, после чего запишет их в лог в консоли. Логика тут следующая: - мы анализируем veb-страницу, используя инструменты разработчика; - мы проверяем блок, где находится слово (в нашем случае это div #botstuff) и выполняем его сохранение в массив посредством селектора .card-section .brs_col p a, который сможет найти на странице все соответствующие ключевые слова.</p>
16
<h2>Как увеличить число страниц при релевантном поиске?</h2>
16
<h2>Как увеличить число страниц при релевантном поиске?</h2>
17
<p>Тут придётся добавить цепочку вызовов (chaining method) и вычислить у тега anchor (<a>) атрибут<strong>href</strong>. Давайте ограничимся тремя страницами, чтобы Google не подумал, что мы бот. Если хотите выставлять время между парсингом соседних страниц, добавьте метод .delay(ms) после каждого .paginate().</p>
17
<p>Тут придётся добавить цепочку вызовов (chaining method) и вычислить у тега anchor (<a>) атрибут<strong>href</strong>. Давайте ограничимся тремя страницами, чтобы Google не подумал, что мы бот. Если хотите выставлять время между парсингом соседних страниц, добавьте метод .delay(ms) после каждого .paginate().</p>
18
<p>Что делаем:</p>
18
<p>Что делаем:</p>
19
osmosis .get('https://www.google.co.in/search?q=analytics') .paginate('#navcnt table tr > td a[href]', 3) .find('#botstuff') .set({'related': ['.card-section .brs_col p a']}) .data(console.log) .log(console.log) // включаем логи .error(console.error) // на случай ошибки<h2>Как парсить адреса эл. почты с Shopify?</h2>
19
osmosis .get('https://www.google.co.in/search?q=analytics') .paginate('#navcnt table tr > td a[href]', 3) .find('#botstuff') .set({'related': ['.card-section .brs_col p a']}) .data(console.log) .log(console.log) // включаем логи .error(console.error) // на случай ошибки<h2>Как парсить адреса эл. почты с Shopify?</h2>
20
<p>Теперь соберём email-адреса и названия приложений, перемещаясь последовательным образом посредством метода .follow. А потом помечаем нужные селекторы в консоли:</p>
20
<p>Теперь соберём email-адреса и названия приложений, перемещаясь последовательным образом посредством метода .follow. А потом помечаем нужные селекторы в консоли:</p>
21
osmosis .get('http://apps.shopify.com/categories/sales') .find('.resourcescontent ul.app-card-grid') .follow('li a[href]') .find('.resourcescontent') .set({ 'appname': '.app-header__details h1', 'email': '#AppInfo table tbody tr:nth-child(2) td > a' }) .log(console.log) // включить логи .data(console.log)<p>Вышеописанный код можем комбинировать с методом .paginate - это позволит полностью собрать весь контент (правда, вас могут и заблокировать).</p>
21
osmosis .get('http://apps.shopify.com/categories/sales') .find('.resourcescontent ul.app-card-grid') .follow('li a[href]') .find('.resourcescontent') .set({ 'appname': '.app-header__details h1', 'email': '#AppInfo table tbody tr:nth-child(2) td > a' }) .log(console.log) // включить логи .data(console.log)<p>Вышеописанный код можем комбинировать с методом .paginate - это позволит полностью собрать весь контент (правда, вас могут и заблокировать).</p>
22
<p>Итак, давайте сохраним данные в формате json:</p>
22
<p>Итак, давайте сохраним данные в формате json:</p>
23
const fs = require('fs'); let savedData = []; osmosis .get(..).find(..).follow(..).find(..) .set(..) .log(console.log) .data(function(data) { console.log(data); savedData.push(data); }) .done(function() { fs.writeFile('data.json', JSON.stringify( savedData, null, 4), function(err) { if(err) console.error(err); else console.log('Data Saved to data.json file'); }) });<p>На этом всё, вы же продолжайте экспериментировать. И оставляйте комментарии!</p>
23
const fs = require('fs'); let savedData = []; osmosis .get(..).find(..).follow(..).find(..) .set(..) .log(console.log) .data(function(data) { console.log(data); savedData.push(data); }) .done(function() { fs.writeFile('data.json', JSON.stringify( savedData, null, 4), function(err) { if(err) console.error(err); else console.log('Data Saved to data.json file'); }) });<p>На этом всё, вы же продолжайте экспериментировать. И оставляйте комментарии!</p>
24
<p>Источник -<a>"Web Scraping in Node.js with Multiple Examples"</a>.</p>
24
<p>Источник -<a>"Web Scraping in Node.js with Multiple Examples"</a>.</p>
25
25