Извлечение данных сайта и создание API с помощью WrapAPI
Сегодня почти все сервисы, которые мы используем, имеют своего рода API. Некоторые веб-приложения даже создаются только из точек API и передаются в какое-то интерфейсное представление. Если вы являетесь пользователем службы, предоставляющей API, вам иногда понадобятся дополнительные функции или ограничения, которые может предложить API. В этой статье мы расскажем о сервисе, который полезен как пользователям, так и создателям API.
Я всегда говорю, что если есть веб-интерфейс, вы можете создать собственный API. WrapAPI пытается сделать этот процесс проще. Если вы знакомы с процессом очистки / сканирования (или извлечения данных с веб-сайтов), вы увидите магию WrapAPI.
WrapAPI предлагает сервис, который позволяет легко извлекать информацию с веб-сайтов и создавать API-интерфейсы из данных. Он предоставляет простой, интерактивный способ выбора того, какую информацию вы хотите получить. Всего несколькими щелчками мыши вы можете подключить свой API онлайн.
Чтобы следовать этому руководству, я рекомендую вам перейти на wrapapi.com и создать учетную запись.
Как обойти WrapAPI
На сайте WrapAPI вы увидите, что можете приступить к созданию своего проекта сразу, хотя, если вы не создадите учетную запись, ваша работа не будет сохранена.
После того, как вы зарегистрировались, нажмите кнопку Построить API .
Вы будете представлены интерфейсом, похожим на браузер. В верхней части сайта мы представляем адресную строку. В качестве примера WrapAPI использует Hacker News ( https://news.ycombinator.com/ Если щелкнуть URL-адрес, чтобы изменить его на что-то другое, вы увидите больше параметров, связанных с запросом, который вы хотите сделать. Мы будем использовать параметры по умолчанию и изменим только URL-адрес на https://www.sitepoint.com/javascript/ Мы рассматриваем только метод GET , поскольку мы хотим получить данные только в этом примере.
Под строкой URL-адреса расположены четыре кнопки, которые предоставляют различную информацию о просматриваемом сайте. Вид браузера отображает сайт так же, как вы заходите на него из браузера. Представление «Код» отображает исходный код сайта. Заголовки показывают ответ, который вы получаете от сервера. Это полезно, если вы хотите посмотреть, какой ответ вы получите от сервера: он предоставляет вам такую информацию, как коды состояния HTTP (200, 404, 400 и т. Д.), Типы контента, веб-серверы и так далее. Вы также можете просмотреть куки-файлы запроса непосредственно от застройщика.
Получение данных
Теперь вы должны видеть SitePoint внутри фрейма просмотра браузера .

Давайте создадим очень простой API, который показывает нам последние заголовки сообщений канала JavaScript. Если вы наводите курсор на заголовки, изображения или любой другой элемент на сайте, вы заметите выделение цвета, покрывающее его. Давайте прокрутим немного вниз, до самой последней статьи. Наведите указатель мыши на заголовок одной из статей и нажмите на него. Вы заметите, что он не переключается на ту ссылку, на которую мы нажали. Мы видим, что каждый заголовок в этом разделе выделен. WrapAPI догадался, что это все названия, которые мы хотим. Иногда он также может выбирать части сайтов, которые нам не нужны. Это обычно тот случай, когда селекторы класса CSS не определены или не используются другими элементами сайта.
Помимо селекторов CSS, WrapAPI поддерживает регулярные выражения, селекторы JSON, заголовки, файлы cookie, выходные данные форм и множество других опций. Вы можете использовать их все вместе и извлекать именно то, к чему вы стремитесь. В этом примере мы будем использовать только селекторы CSS.

В правой части интерфейса вы увидите три вкладки. Давайте посмотрим на текущую вкладку Build . Результаты покажут нам селекторы (в нашем случае селекторы CSS), и вы получите более подробную информацию о том, что вы хотели бы выбрать. Мы заинтересованы только в извлечении заголовка, который является текстом. Есть и другие варианты очистки результатов, но мы не будем вдаваться в эти детали. Если вы хотите создать другой селектор, чтобы выбрать описание, автора, дату и т. Д., Просто нажмите Создать новую коллекцию / вывод . Называние ваших селекторов также важно, так как это облегчит использование нескольких селекторов на сайте. Нажав на значок карандаша, вы можете редактировать ваши селекторы.

На вкладке « Предварительный просмотр » будет показано представление наших данных в формате JSON, и вы, вероятно, получите представление о том, как будет выглядеть API. Если вы довольны результатами, вы можете нажать кнопку Сохранить , чтобы сохранить версию API.

Вам нужно будет ввести репозиторий и имя конечной точки API. Это помогает вам управлять и организовывать свои API. Это также будет частью имени вашего API в конце. После ввода информации вы вернетесь к застройщику. Наш API сохранен, но теперь нам нужно протестировать и опубликовать его.
Советы
- Если на сайте есть нумерация страниц (предыдущая / следующая страница), вы можете использовать параметры строки запроса. (Подробнее об этом здесь .)
- Назовите ваши селекторы правильно, так как они будут частью вывода JSON.
Расширение WrapAPI Chrome
Расширение WrapAPI chrome – это еще одно средство для создания API. Это позволяет вам захватывать запросы, сделанные с помощью Chrome. Полезно для сайтов, использующих JavaScript (Ajax) для вызова данных, также отлично подходит для сайтов, которые находятся за логинами. Вы можете установить его из интернет- магазина Chrome.
На этот раз давайте воспользуемся Hacker News. Посетите сайт, с которого вы хотите получить данные, а затем выполните следующие действия:
Откройте Chrome DevTools и перейдите на вкладку WrapAPI на самой правой вкладке.
Разблокируйте его в отдельном окне.

Войдите с вашими учетными данными WrapAPI.

Когда вы будете готовы, нажмите кнопку Запустить захват запросов .
Обновите главную вкладку, где вы используете.

Выберите запрос, который вы хотите сделать в API (используя GET
Нажмите кнопку Сохранить в конечную точку API и сохраните ее в хранилище.
Наконец, щелкните ссылку: нажмите здесь, чтобы использовать ее для определения входов и выходов конечной точки API…
Вы будете перенаправлены к строителю, чтобы извлечь данные. Преимущество использования этого метода заключается в том, что вы можете обходить страницы входа и использовать уже назначенные файлы cookie.
Публикация API
Перед публикацией нашего API мы должны заморозить его. Выбор номера выпуска, такого как 0.0.1, работает нормально. Обратите внимание, что любые изменения, которые вы вносите в API, вам придется заморозить как новую версию, также увеличив номер версии. Предоставьте простое описание того, что представляет собой ваш API, или, если это обновление, какие изменения оно содержит. Наконец, нажмите Опубликовать .
Последний шаг перед публикацией – это генерация ключа. Нажмите Создать ключ API .

Все зеленые? это должно означать, что мы успешно выполнили шаги, необходимые для публикации нашего API, и это почти правильно. Последний шаг – нажать кнопку « Опубликовать» вверху после строки URL. Вы уже можете видеть различные языки программирования, которые вы можете использовать для тестирования API. Я буду использовать свой браузер с расширением для лучшего представления JSON.
И вот наш последний API:

Вывод
В течение минуты мы смогли создать API из простого веб-интерфейса.
Есть некоторые вещи, которые вы должны рассмотреть. Очистка / извлечение данных с веб-сайтов может иногда иметь юридические последствия для содержимого, найденного на веб-сайте. Если вам случается использовать веб-сайт в качестве службы для вашего API, рассмотрите вопрос о разрешении использовать этот контент, особенно при распространении его в виде API.
WrapAPI предоставляет некоторые действительно замечательные и простые в использовании функции, но они не обходятся без цены. Бесплатные учетные записи и учетные записи сообщества предоставляются бесплатно, но вы можете создавать только открытые API, и существует ограничение в 30 000 вызовов API в месяц. Есть несколько тарифных планов . Вы всегда можете создать свои собственные API и скребки, но если вам не хватает навыков или у вас нет времени, то, возможно, вы захотите попробовать WrapAPI.
Поиск открытого API сайта или Ускоряем парсинг в 10 раз

Цель статьи — описать алгоритм действий поиска открытого API сайта.
Целевая аудитория статьи — программисты, которым интересен парсинг и анализ уязвимостей сайтов.
В статье рассмотрим пример поиска API сайта edadeal.ru, познакомимся с протоколом google protobuf и сравним скорость различных подходов парсинга
1. Введение
Парсинг (в контексте статьи) — это автоматизированный процесс извлечение данных из Интернета.
Существует 2 подхода к извлечению данных со страниц сайта
Извлекать данные из HTML-кода страницы сайта
Плюсы — этот способ прост и работает всегда, так как код страницы всегда доступен пользователю
Минусы — этот способ может работать долго (несколько секунд), если часть данных генерирует java script (например, данные появляются только после прокручивания страницы или нажатия кнопки)
Использовать API сайта
Плюсы — быстрее первого способа и не зависит от изменений структуры html-страницы
Минус — не у всех сайтов есть открытое API
В статье рассмотрим пример поиска API сайта edadeal.ru, познакомимся с протоколом google protobuf и сравним скорость двух подходов парсинга
2. Постановка задачи
Задача — извлечь данные о продуктах с сайта Едадил (название продукта, цена, размер скидки, магазин, город и т.д)
3. Решение
1 Делаем запрос к странице, которую мы хотим парсить.
2 Перебираем все запросы, которые делает сайт. Для этого используем DevTools браузера 
3 Анализируем запросы
Из названия запроса понимаем, что нам нужен запрос
https://squark.edadeal.ru/web/search/offers?count=30&locality=moskva&page=1&retailer=5ka
В ответ на запрос получаем файл (назовем его binary_file.bin). Как узнать кодировку этого файла?
Формат файла из пункта 3 нам подсказывает строка-хедер content-type: application/x-protobuf
4 Определим структуру данных (.proto файл)
с помощью утилиты protoc (http://google.github.io/proto-lens/installing-protoc.html) преобразуем закодированный файл в понятный человеку формат
protoc —decode_raw < binary_file.bin
Получаем список словарей:
5 Формируем .proto файл
Используем номера из предыдущего пункта, по контенту из предыдущего пункта нужно догадаться, какие поля, что означают (например 3 — это ссылка на изображение продукта)
Методом проб и ошибок получаем следующую структуру:
4 Переходим к написанию кода
Создаем питоновский файл с описанием структуры из .proto файла
protoc —proto_path=proto_files —python_out=proto_structs offers.proto
proto_files — имя директории с .proto файлами
proto_structs — в этой директории сохраняются результаты (_pb2.py файлы)
Код работает следующим образом:
- Делает запрос к API сайта
- Преобразует ответ сайта в json
- Выводит результат
Результат работы программы — список продуктов с описанием
5 Сравним результаты
Время выполнения кода из предыдущего пункта 0.3 — 0.4 секунды
Альтернативный вариант парсинга — загрузка всего html-кода страницы и извлечения нужной информации из этого кода
Время полной загрузки страницы 5 — 6 секунд.
6 Выводы
Лучше использовать API сайта для извлечения данных, если есть такая возможность
Использование API сайта позволяет не зависеть от изменений в html-коде страниы
Лучшие инструменты для самостоятельного парсинга веб-сайтов — исчерпывающий список
Меня зовут Максим Кульгин и моя компания xmldatafeed занимается парсингом сайтов в России порядка четырех лет. Ежедневно мы парсим более 500 крупнейших интернет-магазинов в России и на выходе мы отдаем данные в формате Excel/CSV и делаем готовую аналитику для маркетплейсов.
Но если вы планируете сами заняться парсингом и ищите инструменты для его реализации, то ниже мы подобрали лучшие решения, в том числе ориентированные на пользователей, которые не занимаются программированием.
Хотя вы можете разработать собственный инструмент для парсинга интересующих вас веб-сайтов, знающие люди говорят, что, ввязавшись в такое мероприятие, вы не только потратите свое время, но и другие необходимые ресурсы, если только у вас нет для этого весомых причин. Вместо того чтобы идти таким путем, вам нужно исследовать рынок уже существующих программных решений, чтобы найти подходящее вам и воспользоваться им. Когда дело касается инструментов для парсинга веб-сайтов, вам нужно знать, что на рынке много таких инструментов.
Однако не все из них похожи друг на друга. Некоторые лучше зарекомендовали себя, другие популярнее остальных. При этом у каждого из инструментов своя сложность и продолжительность изучения. Схожее разнообразие наблюдается и в специализации инструментов, а также в поддержке платформ и языков программирования. Тем не менее мы всё еще можем прийти к согласию относительно лучших на рынке инструментов для парсинга веб-сайтов и каждый из них будет рассмотрен ниже. Список состоит из инструментов, предназначенных как для тех, у кого есть навыки программирования, так и для тех, у кого таких навыков нет.
Парсинг веб-сайтов изначально был задачей программистов, поскольку нужно написать программные коды, перед тем как веб-сайт можно будет парсить, поэтому на рынке представлено много инструментов, созданных специально для программистов. Инструменты для парсинга веб-сайтов, предназначенные для программистов, реализованы в виде библиотек и фреймворков, которые разработчик будет использовать в своем коде для реализации необходимого поведения своего парсера.
Python — самый популярный язык программирования для разработки парсеров благодаря простому синтаксису, быстрому обучению и множеству доступных библиотек, которые облегчают работу разработчиков. Ниже рассматриваются некоторые из библиотек и фреймворков для парсинга, доступных разработчикам на Python.
Scrapy — фреймворк для реализации обхода (сканирования) и парсинга веб-сайтов, написанный на Python для разработчиков, работающих с этим языком программирования. Scrapy считается полноценным фреймворком, поэтому в нем по умолчанию присутствует всё необходимое для парсинга веб-сайтов, включая модуль для отправки HTTP-запросов и извлечения данных из загруженной HTML-страницы.
Им можно пользоваться бесплатно, и у него открытый исходный код. Кроме того, при парсинге есть возможность сохранения данных. Однако Scrapy не выполняет JavaScript-код — необходимо обратиться за помощью к другой библиотеке. Вы можете воспользоваться Splash или Selenium — популярным инструментом для автоматизации браузера.
PySpider — еще один инструмент для парсинга веб-сайтов, который вы можете использовать для разработки сценариев (скриптов) на Python. В отличие от Scrapy данный инструмент может выполнять JavaScript-код, поэтому не требуется использовать Selenium. Однако PySpider по сравнению со Scrapy выглядит менее завершенным программным решением, поскольку Scrapy развивается с 2008 года, а также обладает более качественной документацией и более крупным сообществом пользователей. Но эти факты не делают PySpider каким-то ущербным. Напротив, PySpider включает в себя несколько уникальных возможностей, например веб-интерфейс с редактором сценариев.
Requests — HTTP-библиотека, облегчающая отправку HTTP-запросов. Она создана на основе библиотеки urllib. Это надежный инструмент, который позволяет вам создавать более надежные парсеры. Он удобен в использовании и сокращает объем кода.
Очень важно, что он позволяет управлять файлами cookie и сессиями, а также, помимо всего прочего, аутентификацией и автоматической организацией пула соединений. Библиотека requests бесплатна, и разработчики на Python могут использовать ее для скачивания веб-страниц, перед тем как применять парсер для выборки необходимых им данных.
BeautifulSoup упрощает процесс извлечения данных из веб-страниц. Эта библиотека использует анализатор кода HTML и XML, предоставляя вам характерные для Python способы осуществления доступа к данным. BeautifulSoup стал одним из наиболее важных инструментов для парсинга веб-сайтов на рынке благодаря легкости парсинга, которую он обеспечивает.
Фактически в большинстве обучающих материалов на тему парсинга веб-сайтов используется BeautifulSoup с целью показать новичкам как писать парсеры. При использовании этой библиотеки одновременно с библиотекой Requests для отправки HTTP-запросов разрабатывать парсеры становится гораздо проще, чем при использовании Scrapy или PySpider.
Scrapy, Requests и BeautifulSoup не помогут вам, если целевой веб-сайт использует подход AJAX, то есть если он зависит от асинхронных запросов, предназначенных для загрузки определенных фрагментов веб-страницы при помощи JavaScript. Если вы обращаетесь к такой веб-странице, вам нужно использовать Selenium — инструмент автоматизации браузера. Его можно применять для автоматизации браузеров с поддержкой headless-режима, например Chrome и Firefox. Более ранние версие могут автоматизировать PhantomJS.
Node.js тоже становится популярной платформой для создания парсеров благодаря популярности JavaScript. У Node.js есть множество инструментов для парсинга веб-сайтов, но не настолько много по сравнению с Python. Два самых популярных инструмента для среды выполнения Node.js рассмотрены ниже.
Cheerio для Node.js — это как BeautifulSoup для Python. Это библиотека анализа данных, которая предоставляет API для сканирования содержимого веб-страницы и управления им. У нее нет возможности выполнения JavaScript-кода, поэтому для этой цели вам нужен браузер в headless-режиме. Единственная задача Cheerio — предоставить вам доступ к jQuery, который используется в качестве API для извлечения данных из веб-страницы. Cheerio — гибкая, быстрая и довольно удобная библиотека.
Puppeteer — один из лучших инструментов для парсинга веб-сайтов, который могут использовать разработчики на JavaScript. Это инструмент автоматизации браузера, предоставляющий высокоуровневый API для управления браузером Chrome. Puppeteer был разработан компанией Google и предназначен для использования только с браузером Chrome и другими браузерами на основе Chromium. В отличие от кроссплатформенного Selenium, Puppeteer можно использовать только в среде Node.js.
Программисты, не обладающие опытом использования прокси-серверов для парсинга веб-сайтов с серьезной защитой от парсинга или не желающие беспокоиться об управлении прокси-серверами и о решении капч, могут воспользоваться API для парсинга, который позволяет извлекать данные из веб-сайтов или скачивать веб-страницы целиком, чтобы затем вытаскивать из них нужные данные. Ниже рассматриваются лучшие прикладные интерфейсы для парсинга веб-сайтов.
- Размер пула прокси-серверов: не разглашается.
- Поддержка геотаргетинга: присутствует ограниченная поддержка.
- Стоимость: $60 за 100 000 запросов.
- Бесплатное пробное использование: 10 000 запросов за 14 дней.
- Особые функции: извлечение необходимых данных из веб-сайтов.
AutoExtract API — один из лучших API для парсинга веб-сайтов, который вы можете найти на рынке. Он был разработан компанией Scrapinghub, создателем Crawlera — API для работы с прокси-серверами. Scrapinghub выполняет львиную долю работы по сопровождению Scrapy — популярного фреймворка для создания парсеров, ориентированного на Python-программистов.
AutoExtract API — основанный на API инструмент извлечения данных, который позволит вам собирать данные с веб-сайтов без необходимости предварительного изучения их внутренней структуры, то есть вам не потребуется код, написанный специально для какого-либо веб-сайта. AutoExtract API поддерживает извлечение данных из новостных веб-сайтов и блогов, товаров на сайтах электронной коммерции, вакансий, данных о транспортных средствах и прочих данных.
- Размер пула прокси-серверов: не разглашается.
- Поддержка геотаргетинга: присутствует.
- Стоимость: начинается с $29 за 250 000 единиц доступа («кредитов») к API.
- Бесплатное пробное использование: 1 000 обращений к API.
- Особые функции: управление браузером в headless-режиме для исполнения JavaScript-кода.
ScrapingBee — API для парсинга веб-сайтов, позволяющий скачивать веб-страницы. Благодаря ScrapingBee вы сможете думать не о блоках, а о самом извлечении данных из загруженной веб-страницы, которую ScrapingBee возвращает вам в качестве ответа.
ScrapingBee удобен в использовании и для этого требуется всего лишь делать запросы к API. ScrapingBee задействует большой пул IP-адресов, используемых для отправки ваших запросов, что защищает вас от блокировки на тех веб-сайтах, данные из которых вы собираете. Кроме того, ScrapingBee помогает вам управлять браузером Chrome в headless-режиме, что непросто, особенно при масштабировании кластера серверов (Selenium Grid), на которых функционируют браузеры Chrome в headless-режиме.
- Размер пула прокси-серверов: более 40 миллионов.
- Поддержка геотаргетинга: зависит от выбранного тарифного плана.
- Стоимость: начинается с $29 за 250 000 обращений к API.
- Бесплатное пробное использование: 1 000 обращений к API.
- Особые функции: решение капч и работа с браузерами в headless-режиме.
Обрабатывая каждый месяц более пяти миллиардов запросов к API, Scraper API — сила, с которой нужно считаться на рынке прикладных интерфейсов для парсинга веб-сайтов. Это довольно функциональная система, которая позволяет вам управлять множеством задач, включая ротацию IP-адресов с использованием их собственного пула прокси-серверов, включающего в себя более 40 миллионов IP-адресов.
Помимо ротации IP-адресов Scraper API также управляет браузерами в headless-режиме и избавит вас от необходимости работы непосредственно с капчами. Это быстрый и надежный API для парсинга веб-сайтов. Среди его пользователей, которые перечислены на сайте разработчиков, можно найти множество компаний из списка Fortune 500. При этом цены находятся на приемлемом уровне.
- Размер пула прокси-серверов: более 30 миллионов.
- Поддержка геотаргетинга: присутствует ограниченная поддержка.
- Стоимость: начинается с $8,99 за 50 000 запросов.
- Бесплатное пробное использование: 1 000 запросов.
- Особые функции: управление браузерами Chrome в headless-режиме.
Zenscrape позволит вам без проблем извлекать данные из веб-сайтов по доступной цене — у них, как и у аналогов, даже есть тарифный план с бесплатным пробным использованием, чтобы вы могли протестировать их сервис, перед тем как тратить деньги.
Zenscrape скачает вам веб-страницу в том виде, в котором она отображается обычным пользователям, а также может работать с основанным на геотаргетинге контентом в зависимости от выбранного вами тарифного плана. Очень важно, что Zenscrape отлично справляется с выполнением кода на JavaScript, поскольку все запросы осуществляются с помощью Chrome в headless-режиме. Zenscrape даже поддерживает популярные JavaScript-фреймворки.
- Размер пула прокси-серверов: не разглашается.
- Поддержка геотаргетинга: присутствует.
- Стоимость: начинается с $9 за 5 000 запросов.
- Бесплатное пробное использование: присутствует.
- Особые функции: решение капч и выполнение кода на JavaScript.
Парсинг веб-сайтов с безжалостными системами противодействия спаму — сложная задача, поскольку вам приходится иметь дело со множеством препятствий. ScrapingAnt может помочь вам преодолеть все препятствия и легко получить все необходимые данные.
ScrapingAnt позволяет выполнять JavaScript-код, используя Chrome в headless-режиме, работает с прокси-серверами и помогает вам избегать капч. ScrapingAnt также управляет пользовательскими файлами cookie и первичной обработкой выходных данных. Цены можно назвать лояльными, поскольку вы можете начать пользоваться этим API для парсинга веб-сайтов всего за $9.
Раньше для парсинга веб-сайтов вам нужно было писать программный код. Теперь это уже не так, ведь появились инструменты парсинга, предназначенные специально для людей, не обладающих навыками программирования. Благодаря этим инструментам не нужно писать программные коды для парсинга необходимых данных из Всемирной паутины. Эти инструменты могут быть реализованы в виде устанавливаемого на компьютер программного обеспечения (ПО), облачного решения или расширения для браузера.
На рынке есть много ПО, которое можно использовать для парсинга всевозможных данных из Всемирной паутины без необходимости уметь программировать. Ниже представлена пятерка лучших на данный момент представителей такого ПО.
- Стоимость: начинается с $75 в месяц.
- Бесплатное пробное использование: 14 дней с ограничениями.
- Формат вывода данных: CSV, Excel, JSON, MySQL и SQLServer.
- Поддержка операционных систем: Windows.
Octoparse делает парсинг веб-сайтов простым для любого пользователя. Благодаря Octoparse вы можете быстро превратить весь веб-сайт в структурированную электронную таблицу всего за несколько кликов. Octoparse не требует наличия навыков программирования, так как всё, что от вас требуется для получения нужных данных, — всего лишь перемещать курсор мыши и щелкать ею. Octoparse может собирать данные с любых веб-сайтов, включая веб-сайты, на которых используется AJAX и применяются серьезные меры противодействия парсингу. Это ПО использует ротацию IP-адресов, чтобы «заметать следы» вашего IP-адреса. Помимо ПО для компьютеров, разработчики предлагают облачное решение и даже 14-дневный период бесплатного использования.
- Стоимость: разовая оплата — от $99 с доступом к основным обновлениям в течение трех месяцев.
- Бесплатное пробное использование: 10 дней без ограничений по функционалу.
- Формат вывода данных: CSV и Excel.
- Поддержка операционных систем: Windows.
Helium Scraper — другое ПО, которое можно использовать для парсинга веб-сайтов при отсутствии навыков программирования. Вы можете собирать сложные данные, определяя свои собственные действия, выполняемые при парсинге. Кроме того, если вы разработчик, то можете запускать на выполнение свои файлы с JavaScript-кодом. Благодаря несложной организации работы, Helium Scraper не только удобен в использовании, но и позволяет быстро выполнять нужные операции благодаря простому и логичному интерфейсу. Кроме того, Helium Scraper — ПО для парсинга, предоставляющее множество функций, включая планирование парсинга, ротацию прокси-серверов, управление текстом, вызовы API и прочее.
- Стоимость: версия для настольных компьютеров бесплатна.
- Формат вывода данных: JSON и Excel.
- Поддержка операционных систем: Windows, Mac и Linux.
ParseHub предлагается в двух версиях: приложение для настольных компьютеров, которое можно использовать бесплатно, и платное облачное решение для парсинга, включающее в себя дополнительные возможности и не требующее установки. ParseHub в виде приложения для настольных компьютеров облегчает парсинг любого интересующего вас веб-сайта, даже если у вас нет навыков программирования. Всё потому, что данное ПО предоставляет интерфейс point-and-click, то есть в котором доступ к функциям осуществляется через наведение курсора мыши на соответствующие графические элементы и щелчки кнопкой мыши. Этот интерфейс предназначен для того, чтобы подготовить ParseHub к извлечению необходимых вам данных. ParseHub прекрасно работает с современными веб-сайтами и позволяет вам скачивать извлеченные данные в популярных файловых форматах.
- Стоимость: начинается с $49,99 в месяц.
- Бесплатное пробное использование: есть бесплатный тарифный план — Starter, но в нем присутствуют ограничения.
- Форматы вывода данных: TXT, CSV, Excel, JSON, MySQL, Google Таблицы и так далее.
- Поддержка операционных систем: Windows, Mac и Linux.
ScrapeStorm отличается от других приложений для настольных компьютеров, представленных выше, поскольку здесь интерфейс point-and-click используется только тогда, когда ScrapeStorm не может обнаружить требуемые данные. ScrapeStorm применяет искусственный интеллект для обнаружения определенных фрагментов данных на веб-страницах. ScrapeStorm быстр, надежен и удобен в использовании. Что касается поддержки операционных систем, то ScrapeStorm работает на Windows, Mac и Linux. Данное ПО поддерживает множественный экспорт данных и позволяет осуществлять парсинг в масштабе предприятия. Интересен тот факт, что ScrapeStorm создан бывшими разработчиками поисковых роботов Google.
- Стоимость: разовая оплата — от $139 за однопользовательскую лицензию.
- Бесплатное пробное использование: 14 дней с ограничениями.
- Формат вывода данных: CSV, Excel, XML, JSON и MySQL.
- Поддержка операционных систем: Windows.
WebHarvy — очередное ПО для парсинга веб-сайтов и извлечения данных с веб-страниц, которое вы можете установить на свой компьютер. Это ПО позволяет вам осуществлять парсинг посредством ввода одной единственной строки кода и выбирать место сохранения собранных данных: в файле или в системе управления базами данных. Оно представляет собой наглядный инструмент, который можно применять для парсинга любых данных из веб-страниц, например адресов электронной почты, ссылок, изображений и даже целых HTML-файлов. WebHarvy включает в себя средство для обнаружения структурированных данных и сканирует сразу несколько веб-страниц.
Среда браузера становится популярным «местом обитания» парсеров, и есть много инструментов парсинга веб-сайтов, которые вы можете установить для своего браузера в качестве расширений и дополнительных модулей, чтобы облегчить себе задачу сбора данных с веб-сайтов. Некоторые из них рассмотрены ниже.
- Стоимость: бесплатно.
- Бесплатное пробное использование: версия для Chrome предоставляется абсолютно бесплатно.
- Формат вывода данных: CSV.
Webscraper.io — расширение для браузеров Chrome и Firefox, представляющее собой один из лучших инструментов для парсинга веб-сайтов, который вы можете использовать, чтобы с легкостью извлекать данные с веб-страниц. Более 250 000 тысяч пользователей установили его и сочли чрезвычайно полезным. Подобные расширения для браузеров не требуют от вас навыков программирования, поскольку в них используется графический интерфейс (point-and-click). Интересно, что расширение «Web Scraper» можно применять для парсинга даже самых продвинутых и современных веб-сайтов, на которых есть много возможностей, реализованных с помощью JavaScript.
- Стоимость: начинается с $19,99 в месяц.
- Бесплатное пробное использование: 500 веб-страниц в месяц.
- Формат вывода данных: CSV и Excel.
Расширение «Data Miner» доступно только для браузеров Google Chrome и Microsoft Edge. Оно позволяет собирать данные с веб-страниц и сохранять их в CSV или электронную таблицу Excel. В отличие от расширения от Webscraper.io, которое предлагается бесплатно, расширение «Data Miner» будет бесплатным только в случае, если вы будете парсить не более 500 веб-страниц за один месяц. В противном случае вам нужно будет оформить подписку на платный тарифный план. Благодаря этому расширению вы можете парсить любую веб-страницу, не задумываясь о блоках, а конфиденциальность ваших данных будет под защитой.
- Стоимость: полностью бесплатное расширение.
- Бесплатное пробное использование: присутствует.
- Формат вывода данных: CSV, Excel и TXT.
Scraper — расширение для Chrome, которое, по всей видимости, разработано и поддерживается одним разработчиком — у Scraper даже нет своего веб-сайта, как у вышеупомянутых инструментов. Scraper не такой продвинутый по сравнению с рассмотренными выше расширениями, но он полностью бесплатный. Основная проблема со Scraper состоит в том, что пользователям необходимо знать XPath, поскольку в Scraper применяется именно этот язык запросов. В связи с этим Scraper нельзя назвать благосклонным к начинающим пользователям.
- Стоимость: бесплатно.
- Бесплатное пробное использование: версия для Chrome предоставляется абсолютно бесплатно.
- Формат вывода данных: JSON.
SimpleScraper — другой парсер в виде расширения для браузера Chrome. Установив это расширение в свой Chrome, парсинг веб-сайтов станет удобным и бесплатным, поскольку вы сможете превратить любой веб-сайт в API. Расширение позволит очень быстро извлекать с веб-страниц структурированные данные. При этом оно работает на всех веб-сайтах, включая те из них, на которых используется много кода на языке JavaScript. Если вам нужен более гибкий вариант данного инструмента, то можете обратить внимание на облачное решение от тех же разработчиков, но оно платное.
- Стоимость: бесплатно.
- Бесплатное пробное использование: 14-дневный бесплатный пробный период с сотней «кредитов», которые можно потратить на парсинг веб-страниц.
- Формат вывода данных: электронные таблицы Google, CSV и Excel.
- Услуга ротации IP-адресов.
С помощью Agenty Scraping Agent вы можете начать собирать данные с веб-страниц, не думая о блоках. Это платный инструмент, но разработчики предлагают и бесплатную пробную версию. Agenty Scraping Agent разработан для современной Всемирной паутины и поэтому может без проблем собирать данные с веб-сайтов, активно использующих JavaScript. Интересно, что инструмент при этом довольно хорошо работает на старых веб-сайтах.
Прокси-серверы действительно необходимы, если только вы не используете API для парсинга, который обычно считается затратным решением. Когда речь идет о прокси-серверах для парсинга веб-сайтов, пользователям советуют обратиться к поставщикам прокси-серверов с резидентными сменными IP-адресами, которые уберегут их от сложностей управления прокси-серверами. Ниже представлены три лучших доступных на рынке сервиса для ротации IP-адресов.
- Размер пула прокси-серверов: более 72 миллионов.
- Расположение прокси-серверов: все страны мира.
- Возможность параллельной работы: без ограничений.
- Допустимая пропускная способность: от 40 ГБ.
- Стоимость: начинается с $500 в месяц за 40 ГБ.
Luminati, пожалуй, — лучший поставщик прокси-серверов на рынке. Он обладает крупнейшей в мире сетью прокси-серверов с более 72 миллионов резидентных IP-адресов в своем пуле прокси-серверов. Он остается одним из самых безопасных, надежных и быстрых решений. Интересно, что Luminati совместим с большинством популярных веб-сайтов, существующих сегодня во Всемирной паутине. У Luminati есть лучшая система управления сессиями, поскольку она позволяет вам определять сроки хранения сессий. Также Luminati обладает прокси-серверами со скоростной ротацией IP-адресов, которые меняют IP-адрес после каждого запроса. Однако у Luminati высокая стоимость.
- Размер пула прокси-серверов: более 10 миллионов.
- Расположение прокси-серверов: 195 географических пунктов по всему миру.
- Возможность параллельной работы: без ограничений.
- Допустимая пропускная способность: от 5 ГБ.
- Стоимость: начинается с $75 в месяц за 5 ГБ.
Smartproxy обладает пулом резидентных прокси-серверов, в который входят более 10 миллионов IP-адресов. Прокси-серверы Smartproxy довольно неплохо показывают себя при парсинге веб-сайтов благодаря системе управления сессиями. У Smartproxy есть прокси-серверы, которые могут хранить сессию и один и тот же IP-адрес в течение десяти минут, что идеально для парсинга веб-сайтов, основанных на авторизации пользователей. Для обычных веб-сайтов вы можете использовать прокси-серверы со скоростной ротацией, которые меняют IP-адрес после каждого запроса. Прокси-серверы Smartproxy располагаются приблизительно в 195 странах и в восьми крупных городах по всему миру.
- Размер пула IP-адресов: точное количество не разглашается, но, вероятно, десятки тысяч.
- Расположение прокси-серверов: не отличается большим количеством пунктов размещения.
- Допустимая пропускная способность: без ограничений.
- Стоимость: начинается с $99 за 200 000 запросов.
Crawlera позволяет вам фокусироваться на самих данных, помогая присматривать за прокси-серверами. Crawlera выглядит ущербно по сравнению с Luminati, если говорить о количестве имеющихся в системе IP-адресов.
Но в отличие от Luminati, при использовании которого вы можете наткнуться на капчи, Crawlera применяет некоторые приемы, гарантирующие получение запрашиваемых вами веб-страниц. Однако у Crawlera нет прокси-серверов, размещенных во всех странах и разных городах по всему миру, как у Luminati. Их цены зависят от количества запросов, а не от потребляемого трафика.
Бывает, что вам даже не хотелось бы заниматься парсингом нужных данных, а хочется просто получить их. Если прямо сейчас вы находитесь в таком положении, то сервисы для парсинга веб-сайтов — это беспроигрышный вариант.
ScrapingHub заслужили авторитет в сфере парсинга веб-сайтов благодаря наличию как бесплатных, так и платных инструментов, предназначенных для разработчиков парсеров. Помимо этих инструментов, у ScrapingHub также есть сервис предоставления данных, в котором нужно всего лишь описать необходимые вам данные, и вам отправят стоимость их извлечения. Более 2 000 компаний воспользовались данным сервисом для обеспечения своей работы.
ScrapeHero — еще один сервис парсинга веб-сайтов, к которому можно обратиться, чтобы собрать нужные вам данные в том случае, если вы не хотите испытать на себе все сложности самостоятельного парсинга данных. ScrapeHero — гораздо более молодая компания по сравнению со Scrapinghub, но довольно востребованная среди предпринимателей. С помощью ScrapeHero вы можете получить данные о рынке недвижимости, данные из прессы, данные из социальных медиа и прочие данные. Чтобы узнать расценки сервиса, вам нужно связаться с разработчиками.
Octoparse известны тем, что предоставляют не только приложение для настольных компьютеров для парсинга веб-сайтов, но и облачное решение. Кроме того, у них есть сервис для парсинга, в рамках которого они с гордостью предлагают предпринимателям услуги парсинга данных. С помощью этого сервиса вы можете получать данные из социальных медиа, данные из веб-сайтов электронной коммерции, данные о розничной торговле, вакансии и другие данные, которые можно найти во Всемирной паутине.
Если вы не хотите усложнять себе жизнь парсерами, прокси-серверами, серверами, инструментами для решения капч и прикладными интерфейсами для парсинга веб-сайтов, то PromptCloud — ваш выбор. Для использовании PromptCloud вам нужно всего лишь отправить свои требования к данным и ожидать их довольно оперативной доставки в нужном вам формате. Благодаря PromptCloud вы получаете очищенные данные с веб-страниц без каких-либо технических трудностей. Это полностью управляемый пользователем сервис с прекрасной службой поддержки.
FindDataLab — поставщик услуг по парсингу веб-сайтов, который позволяет вам извлекать данные из Всемирной паутины, а также отслеживать цены и управлять репутацией. С помощью данного сервиса любой веб-сайт можно превратить в данные нужного формата. От вас требуется только охарактеризовать необходимые вам данные, после чего с вами свяжутся и сообщат стоимость их извлечения.
Глядя на этот список инструментов для парсинга веб-сайтов, в котором сначала приводятся инструменты для разработчиков, а затем инструменты для людей без навыков программирования, вы согласитесь, что парсинг веб-сайтов стал проще.
И благодаря множеству доступных инструментов, у вас настолько широкий выбор, что если какие-то инструменты вам не подойдут, то другие будут в самый раз. У вас больше нет причин отказываться от анализа данных, потому что парсеры помогут вам вытаскивать их из веб-страниц.
Как вытащить api с сайта
Many APIs are publicly available. All APIs on the RapidAPI platform are publicly available. But there are also so-called internal APIs, which are created and used by developers that need APIs for private applications.
When it comes to web and mobile applications, there is a process to follow in order to determine what API the website uses. In some cases, you can also use the internal API without interacting with the website (i.e. programmatically, by issuing requests directly from the code). In this tutorial, we will demonstrate how to find an API of a website.
How websites use APIs
There are two main ways in which websites use APIs. For the sake of keeping things simple, we’ll call them the backend-tied method and frontend-tied method.
The backend-tied approach is the method where the application makes requests to the API on the server’s side. The pipeline looks like this:
- The user wants to visit a page of the website. He/she uses a browser to send an HTTP request to the server where the site is hosted.
- To provide a response to the user, the server needs to use an API.
- The server sends the request(s) to the API and processes the response of the API. The response to the user is prepared using the response of the API.
- The server sends the prepared response (most often it is the HTML page) to the user.
- The user’s browser renders the response and shows the result to the user.
The key peculiarity of this method is that the user’s browser knows nothing about what is going on on the server’s side (how the response was prepared). This means that we (as users) cannot detect whether any API was used by this site. The exception comes in when the information about used APIs are available on the website, or when t is obvious that the website uses an API (for example, when the website displays information about flight tickets from the Skyscanner).
A vivid example of the backend-tied approach of API usage can be found in our How To Build a Sentiment Analysis App tutorial. The Django web application there sends requests to the API on the server’s side.
Another method is the frontend-tied approach .
Most modern web frameworks use client-side rendering. They send a blank HTML file to the browser along with JavaScript that fills it with data. In this case, it takes data from the internal API. And this is handy for us because if it is done with our browser we can find it. Let’s explore how this works in more detail.
How to see whether a website uses an API
Let’s create a little sandbox to demonstrate how it works. We can use Flask to make a simple internal API which will send only one string of text data. The ‘Access-Control-Allow-Origin’ header is added so we can simply open the HTML file in the browser and make this request from it.
Then we will write an HTML page that will request this string and view it.
If we open this page in the browser and view the page source code we will not see the data and this is typical for a frontend-tied approach using the API. If it was not a test page, we wouldn’t see the script either.
Let’s go back to our page in the browser and open the Developer Tools.
Now we need to open the Network tab and choose the XHR filter. XHR refers to the XMLHttpRequest which is the JavaScript object that is used to retrieve data from a server. (We actually use the fetch() request but it’s almost the same.) In some cases, we’ll need to repeat an action or refresh the page to see requests here. With real sites, there could also be a lot of requests. We need to choose the ones that look similar to what we expect to find.

If we click on a request we’ll see the full URL, the HTTP method, and any other necessary information. With our page, we see the “http://127.0.0.1:5000/test_data” address and the GET method.

Now we can open the Response tab and suppose that the data is what we are looking for.

All that we still need to do is to simply make a similar request programmatically and check if we get the same answer.
Test your hypothesis from Python code
Python has a Requests library that is ideal for this purpose. For our example, the code will look pretty simple.
Here is what the code above returns:
But Requests itself has a lot more options. Any other HTTP method can be used with requests the same way as the GET method. We may also add data to the request body.
In most cases, we’ll get our response in JSON or XML format, so we’ll need to make some transformations or parsing.
Conclusion
There are two ways in which websites can use APIs. If we can see the data on the page but can’t find it in the page source, that’s okay. Finding an API with browser tools is not that complicated. Working with it may be easier than writing parsers for the HTML.
But if we can’t see requests from the browser it does not mean that the site doesn’t use API. If it sends server-side requests we may have trouble finding out which API a website uses.
Извлечение данных сайта и создание API с помощью WrapAPI
Сегодня почти все сервисы, которые мы используем, имеют своего рода API. Некоторые веб-приложения даже создаются только из точек API и передаются в какое-то интерфейсное представление. Если вы являетесь пользователем службы, предоставляющей API, вам иногда понадобятся дополнительные функции или ограничения, которые может предложить API. В этой статье мы расскажем о сервисе, который полезен как пользователям, так и создателям API.
Я всегда говорю, что если есть веб-интерфейс, вы можете создать собственный API. WrapAPI пытается сделать этот процесс проще. Если вы знакомы с процессом очистки / сканирования (или извлечения данных с веб-сайтов), вы увидите магию WrapAPI.
WrapAPI предлагает сервис, который позволяет легко извлекать информацию с веб-сайтов и создавать API-интерфейсы из данных. Он предоставляет простой, интерактивный способ выбора того, какую информацию вы хотите получить. Всего несколькими щелчками мыши вы можете подключить свой API онлайн.
Чтобы следовать этому руководству, я рекомендую вам перейти на wrapapi.com и создать учетную запись.
Как обойти WrapAPI
На сайте WrapAPI вы увидите, что можете приступить к созданию своего проекта сразу, хотя, если вы не создадите учетную запись, ваша работа не будет сохранена.
После того, как вы зарегистрировались, нажмите кнопку Построить API .

Вы будете представлены интерфейсом, похожим на браузер. В верхней части сайта мы представляем адресную строку. В качестве примера WrapAPI использует Hacker News ( https://news.ycombinator.com/ Если щелкнуть URL-адрес, чтобы изменить его на что-то другое, вы увидите больше параметров, связанных с запросом, который вы хотите сделать. Мы будем использовать параметры по умолчанию и изменим только URL-адрес на https://www.sitepoint.com/javascript/ Мы рассматриваем только метод GET , поскольку мы хотим получить данные только в этом примере.
Под строкой URL-адреса расположены четыре кнопки, которые предоставляют различную информацию о просматриваемом сайте. Вид браузера отображает сайт так же, как вы заходите на него из браузера. Представление «Код» отображает исходный код сайта. Заголовки показывают ответ, который вы получаете от сервера. Это полезно, если вы хотите посмотреть, какой ответ вы получите от сервера: он предоставляет вам такую информацию, как коды состояния HTTP (200, 404, 400 и т. Д.), Типы контента, веб-серверы и так далее. Вы также можете просмотреть куки-файлы запроса непосредственно от застройщика.
Получение данных
Теперь вы должны видеть SitePoint внутри фрейма просмотра браузера .

Давайте создадим очень простой API, который показывает нам последние заголовки сообщений канала JavaScript. Если вы наводите курсор на заголовки, изображения или любой другой элемент на сайте, вы заметите выделение цвета, покрывающее его. Давайте прокрутим немного вниз, до самой последней статьи. Наведите указатель мыши на заголовок одной из статей и нажмите на него. Вы заметите, что он не переключается на ту ссылку, на которую мы нажали. Мы видим, что каждый заголовок в этом разделе выделен. WrapAPI догадался, что это все названия, которые мы хотим. Иногда он также может выбирать части сайтов, которые нам не нужны. Это обычно тот случай, когда селекторы класса CSS не определены или не используются другими элементами сайта.
Помимо селекторов CSS, WrapAPI поддерживает регулярные выражения, селекторы JSON, заголовки, файлы cookie, выходные данные форм и множество других опций. Вы можете использовать их все вместе и извлекать именно то, к чему вы стремитесь. В этом примере мы будем использовать только селекторы CSS.

В правой части интерфейса вы увидите три вкладки. Давайте посмотрим на текущую вкладку Build . Результаты покажут нам селекторы (в нашем случае селекторы CSS), и вы получите более подробную информацию о том, что вы хотели бы выбрать. Мы заинтересованы только в извлечении заголовка, который является текстом. Есть и другие варианты очистки результатов, но мы не будем вдаваться в эти детали. Если вы хотите создать другой селектор, чтобы выбрать описание, автора, дату и т. Д., Просто нажмите Создать новую коллекцию / вывод . Называние ваших селекторов также важно, так как это облегчит использование нескольких селекторов на сайте. Нажав на значок карандаша, вы можете редактировать ваши селекторы.

На вкладке « Предварительный просмотр » будет показано представление наших данных в формате JSON, и вы, вероятно, получите представление о том, как будет выглядеть API. Если вы довольны результатами, вы можете нажать кнопку Сохранить , чтобы сохранить версию API.

Вам нужно будет ввести репозиторий и имя конечной точки API. Это помогает вам управлять и организовывать свои API. Это также будет частью имени вашего API в конце. После ввода информации вы вернетесь к застройщику. Наш API сохранен, но теперь нам нужно протестировать и опубликовать его.
Советы
- Если на сайте есть нумерация страниц (предыдущая / следующая страница), вы можете использовать параметры строки запроса. (Подробнее об этом здесь .)
- Назовите ваши селекторы правильно, так как они будут частью вывода JSON.
Расширение WrapAPI Chrome
Расширение WrapAPI chrome – это еще одно средство для создания API. Это позволяет вам захватывать запросы, сделанные с помощью Chrome. Полезно для сайтов, использующих JavaScript (Ajax) для вызова данных, также отлично подходит для сайтов, которые находятся за логинами. Вы можете установить его из интернет- магазина Chrome.
На этот раз давайте воспользуемся Hacker News. Посетите сайт, с которого вы хотите получить данные, а затем выполните следующие действия:
Откройте Chrome DevTools и перейдите на вкладку WrapAPI на самой правой вкладке.
Разблокируйте его в отдельном окне.

Войдите с вашими учетными данными WrapAPI.

Когда вы будете готовы, нажмите кнопку Запустить захват запросов .
Обновите главную вкладку, где вы используете.

Выберите запрос, который вы хотите сделать в API (используя GET
Нажмите кнопку Сохранить в конечную точку API и сохраните ее в хранилище.
Наконец, щелкните ссылку: нажмите здесь, чтобы использовать ее для определения входов и выходов конечной точки API…
Вы будете перенаправлены к строителю, чтобы извлечь данные. Преимущество использования этого метода заключается в том, что вы можете обходить страницы входа и использовать уже назначенные файлы cookie.
Публикация API
Перед публикацией нашего API мы должны заморозить его. Выбор номера выпуска, такого как 0.0.1, работает нормально. Обратите внимание, что любые изменения, которые вы вносите в API, вам придется заморозить как новую версию, также увеличив номер версии. Предоставьте простое описание того, что представляет собой ваш API, или, если это обновление, какие изменения оно содержит. Наконец, нажмите Опубликовать .
Последний шаг перед публикацией – это генерация ключа. Нажмите Создать ключ API .

Все зеленые? это должно означать, что мы успешно выполнили шаги, необходимые для публикации нашего API, и это почти правильно. Последний шаг – нажать кнопку « Опубликовать» вверху после строки URL. Вы уже можете видеть различные языки программирования, которые вы можете использовать для тестирования API. Я буду использовать свой браузер с расширением для лучшего представления JSON.
И вот наш последний API:

Вывод
В течение минуты мы смогли создать API из простого веб-интерфейса.
Есть некоторые вещи, которые вы должны рассмотреть. Очистка / извлечение данных с веб-сайтов может иногда иметь юридические последствия для содержимого, найденного на веб-сайте. Если вам случается использовать веб-сайт в качестве службы для вашего API, рассмотрите вопрос о разрешении использовать этот контент, особенно при распространении его в виде API.
WrapAPI предоставляет некоторые действительно замечательные и простые в использовании функции, но они не обходятся без цены. Бесплатные учетные записи и учетные записи сообщества предоставляются бесплатно, но вы можете создавать только открытые API, и существует ограничение в 30 000 вызовов API в месяц. Есть несколько тарифных планов . Вы всегда можете создать свои собственные API и скребки, но если вам не хватает навыков или у вас нет времени, то, возможно, вы захотите попробовать WrapAPI.
Безопасный веб-скрейпинг: как извлекать данные с сайтов, чтобы вас не заблокировали
Чтобы получить данные с сайтов, используется готовый API, однако он не всегда доступен. Тогда приходится использовать «парсер» веб-страницы — в автоматическом или полуавтоматическом режиме распознавать код и получать данные из необходимых полей. Обходом множества страниц и сайтов занимается ПО, которое обычно называется «краулер».
Процесс сбора данных с сайтов краулером называется веб-скрейпингом.
Большинство популярных сайтов активно защищают свои ресурсы от скрейпинга используя распознавание IP-адреса, проверку заголовков HTTP-запросов, CAPTCHA и другие способы. Но скрейперы не отстают от них и придумывают новые стратегии обхода. Вот несколько советов, как скрейпить без блокировок.
Задайте случайные интервалы между запросами
Ни один реальный человек не станет отправлять запросы на сайт каждую секунду в течение 24 часов — такой сбор информации очень легко обнаружить. Используйте случайные задержки (например около 2–10 секунд), чтобы избежать блокировки. И не отправляйте запросы слишком часто, иначе сканирование сайта будет походить на сетевую атаку.
Особо щепетильным стоит проверить файл robots.txt (как правило, находится на http://<адрес сайта>/robots.txt). Иногда там можно найти параметр Crawl-delay, который говорит, сколько секунд нужно подождать между запросами, чтобы не вредить работе сервера.

Установите адекватный User Agent
User Agent — HTTP-заголовок, который сообщает посещаемому веб-сайту информацию о вашем браузере. Если не настроить User Agent, вашего краулера будет очень легко обнаружить. Кроме того, сайты иногда блокируют запросы пользовательских агентов от неизвестных браузеров. Поэтому не забудьте установить один из популярных пользовательских агентов (например из этого списка).
Опытные скрейперы могут попробовать установить свой агент на Googlebot User Agent — поисковый робот Google. Большинство веб-сайтов, очевидно, хотят попасть в выдачу Google и пропускают Googlebot.
Хорошей практикой будет также чередование разных User Agent.
Используйте прокси
Вряд ли настоящий пользователь сможет запрашивать 20 страниц в секунду на одном и том же сайте. Чтобы «обмануть» веб-сервер, заставьте его думать, что все эти запросы приходят из разных мест. Другими словами, используйте прокси.
Тут есть множество вариантов, например сервисы SmartProxy, Luminati Network, Blazing SEO. Бесплатные прокси не всегда подойдут для таких целей: они часто медленные и ненадёжные. Также можно создать свою прокси-сеть на сервере, например с помощью Scrapoxy — API с открытым исходным кодом.
Добавьте referer
Referer — заголовок HTTP-запроса, который даёт понять, с какого сайта вы пришли. Неплохой вариант — сделать так, чтобы он показывал, будто вы перешли из Google:
Стоит менять referer для веб-сайтов в разных странах: например для России использовать https://www.google.ru/, а не https://www.google.com/. Вместо Google можно подставить адреса соцсетей: Youtube, Facebook, ВКонтакте. Referer поможет сделать так, чтобы запросы выглядели как трафик с того сайта, откуда обычно приходит больше всего посетителей.
Используйте headless-браузер
Особо хитроумные сайты могут отслеживать веб-шрифты, расширения, файлы cookie, цифровые отпечатки (фингерпринты). Иногда они даже встраивают JavaScript-код, открывающий страницу только после его запуска — так зачастую можно определить, поступает ли запрос из браузера. Для обхода таких ресурсов вам потребуется headless-браузер. Он эмулирует поведение настоящего браузера и поддерживает программное управление. Чаще всего для этих целей выбирают Chrome Headless.
Если ресурс отслеживает цифровой отпечаток браузера, то даже многократная смена IP и очистка cookie не всегда помогают, так как вас всё равно могут узнать по фингерпринту. За частую смену IP при одном и том же отпечатке вполне могут заблокировать, и одна из задач Chrome Headless — не допустить этого.
Самый простой способ работать с Chrome Headless — использовать фреймворк, который объединяет все его функции в удобный API. Наиболее известные решения можно найти тут. Но некоторые веб-ресурсы пытаются отслеживать и их: идёт постоянная гонка между сайтами, пытающимися обнаружить headless-браузеры, и headless-браузерами, которые выдают себя за настоящие.
Подключите программу для решения CAPTCHA
Существуют веб-сайты, которые систематически просят вас подтвердить, что вы не робот, с помощью капч. Обычно капчи отображаются только для подозрительных IP-адресов, и с этим помогут прокси. В остальных же случаях используйте автоматический решатель CAPTCHA — скажем, 2Captcha или AntiCaptcha.

Распознаватели чаще всего платные, потому что капчи вручную решают реальные люди. Поэтому стоит понять, оправдают ли затраты поставленную цель.
Избегайте honeypot-ловушек
«Honeypot» — это фальшивая ссылка, которая невидима для обычного пользователя, но присутствует в HTML-коде. Как только вы начнёте анализировать сайт, honeypot может перенаправить вас на пустые и бесполезные страницы-приманки. Поэтому всегда проверяйте, установлены ли для ссылки CSS-свойства «display: none», «visibility: hidden» или «color: #fff;» (в последнем случае нужно учитывать цвет фона сайта).
Если вы последуете хотя бы одному совету из этой статьи, ваши шансы быть заблокированным уменьшатся во много раз. Но для верности лучше комбинировать несколько приёмов и всегда следить, чтобы краулер не слишком нагружал чужие веб-серверы.
API для всех и каждого: создаем мощный парсер веб-сайтов без единой строки кода

Часто возникает задача периодически парсить какой-нибудь сайт на наличие новой информации. Например, если ты пишешь агрегатор контента с новостного сайта или форума, в котором нет поддержки RSS. Проще всего написать скрепер на Питоне и разобрать полученный HTML через beautifulsoup или регулярками. Однако есть более элегантный способ — самому сделать недостающие API для сайта и получать ответы в привычном JSON, как будто бы у сайта есть нативный API.
Не будем далеко ходить за примером и напишем парсер контента с «Хакера». Как ты знаешь, сайт нашего журнала сейчас не предоставляет никакого API для программного получения статей, кроме RSS. Однако RSS не всегда удобен, да и выдает далеко не всю нужную информацию. Исправим это!
Постановка задачи
Итак, наша задача: сделать API вида GET /posts , который бы отдавал десять последних статей с «Хакера» в JSON. Также нам нужно иметь возможность задавать сдвиг, то есть раз за разом получать следующие десять постов.
Ответ должен быть таким:
Также нужно иметь возможность получать следующие десять постов — со второй страницы, третьей и так далее. Это делается через GET-параметр вида GET /posts?page=2 . Если page в запросе не указан, считаем его равным 1 и отдаем посты с первой страницы «Хакера». В общем, задача ясна, переходим к решению.
Фреймворк для веба
WrapAPI — это довольно новый (пара месяцев от роду) сервис для построения мощных кастомных парсеров веба и предоставления к ним доступа по API. Не пугайся, если ничего не понял, сейчас поясню на пальцах. Работает так:
- Указываешь WrapAPI страницу, которую нужно парсить (в нашем случае главную «Хакера» — https://xakep.ru/).
- Говоришь, с какими параметрами обращаться к серверу, каким HTTP-методом (GET или POST), какие query-параметры передавать, какие POST-параметры в body, куки, хедеры. Короче, все, что нужно, чтобы сервер вернул тебе нормальную страничку и ничего не заподозрил.
- Указываешь WrapAPI, где на полученной странице ценный контент, который надо вытащить, в каком виде его представлять.
- Получаешь готовый URL для API вида GET /posts , который вернет тебе все выдранные с главной «Хакера» посты в удобном JSON!
Немного о приватности запросов
Ты наверняка уже задумался о том, насколько безопасно использовать чужой сервис и передавать ему параметры своих запросов с приватными данными. Тем более что по умолчанию для каждого нового API-проекта будет создаваться публичный репозиторий и запускать API из него сможет любой желающий. Не все так плохо:
- Каждый API-репозиторий (а соответственно, и все API-запросы в нем) можно сделать приватным. Они не будут показываться в общем списке уже созданных API на платформе WrapAPI. Просто выбери достаточно сложное имя репозитория, и шанс, что на него кто-то забредет случайно, сведется к минимуму.
- Любой запрос к WrapAPI требует специального токена, который нужно получить в своей учетке WrapAPI. То есть просто так узнать URL к твоему репозиторию и таскать через него данные не получится. Токены подразделяются на два типа: серверные и клиентские, для использования прямо на веб-страничке через JavaScript. Для последних нужно указать домен, с которого будут поступать запросы.
- Ну и наконец, в скором времени разработчик обещает выпустить self-hosted версию WrapAPI, которую ты сможешь поставить на свой сервер и забыть о проблеме утечек данных (конечно, при условии, что в коде WrapAPI не будет бэкдоров).
Приготовления
Несколько простых шагов перед началом.
- Идем на сайт WrapAPI, создаем новую учетку и логинимся в нее.
- Устанавливаем расширение для Chrome (подойдет любой Chromium-based браузер), открываем консоль разработчика и видим новую вкладку WrapAPI .
- Переходим на нее и логинимся.
Это расширение нам понадобится для того, чтобы перехватывать запросы, которые мы собираемся эмулировать, и быстро направлять их в WrapAPI для дальнейшей работы. По логике работы это расширение очень похоже на связку Burp Proxy + Burp Intruder.

Для работы с WrapAPI нужно повторно авторизоваться еще и в расширении в консоли разработчика Chrome
Другие статьи в выпуске: 
Xakep #210. Краткий экскурс в Ethereum
Отлавливаем запросы
Теперь нужно указать WrapAPI, какой HTTP-запрос мы будем использовать для построения нашего API. Идем на сайт «Хакера» и открываем консоль разработчика, переключившись на вкладку WrapAPI.
Для получения постов я предлагаю использовать запрос пагинации, он доступен без авторизации и может отдавать по десять постов для любой страницы «Хакера», возвращая HTML в объекте JSON (см. ниже).

Запросы, которые генерятся по нажатию на ссылки пагинатора, будем использовать как образец
Чтобы WrapAPI начал перехватывать запросы, нажми Start capturing requests и после этого выполни целевой запрос (на пагинацию). Плагин поймает POST-запрос к странице https://xakep.ru/wp-admin/admin-ajax.php с кучей form/urlencoded-параметров в теле, в том числе и номером страницы. Ответом на запрос будет JSON-объект с параметром content , содержащий закешированный HTML-код с новыми постами. Собственно, этот блок и нужно парсить WrapAPI.

Запрос пойман, сохраняем его на сервер WrapAPI
Конфигурируем WrapAPI
После того как ты выбрал нужное имя для твоего репозитория (я взял test001 и endpoint posts ) и сохранил его на сервер WrapAPI через расширение для Chrome, иди на сайт WrapAPI и открывай репозиторий. Самое время настраивать наш API.

Обзор нашего будущего API
Переходи на вкладку Inputs and request. Здесь нам понадобится указать, с какими параметрами WrapAPI должен парсить запрашиваемую страницу, чтобы сервер отдал ему валидный ответ.

Конфигурируем входные параметры запроса
Аккуратно перебей все параметры из пойманной WrapAPI полезной нагрузки (POST body payload) в поле слева. Для всех параметров, кроме paginated , выставь тип Constant . Это означает, что в запросы к серверу будут поставляться предопределенные значения, управлять которыми мы не сможем (нам это и не нужно). А вот для paginated выставляй Variable API , указав имя page . Это позволит нам потом обращаться к нашему API по URL вида GET /posts?page=5 (с query-параметром page ), а на сервер уже будет уходить полноценный POST со всеми перечисленными параметрами.
Заголовки запроса ниже можно не трогать, я использовал стандартные из Chromium. Если парсишь не «Хакер», а данные с какого-нибудь закрытого сервера, можешь подставить туда нужные куки, хедеры, basic-auth и все, что нужно. Одним словом, ты сможешь настроить свой запрос так, чтобы сервер безо всяких подозрений отдал тебе контент.

Выставляем необходимые POST-параметры в формате form/urlencoded, чтобы наш запрос отработал правильно
Учим WrapAPI недостающим фичам
Теперь нужно указать WrapAPI, как обрабатывать полученный результат и в каком виде его представлять. Переходи на следующую вкладку — Outputs and response.

Шаг настройки постпроцессоров полученного контента
- Output — фильтр-постпроцессор контента, который принимает на входе сырой ответ сервера, а возвращает уже модифицированный по заданным правилам. Они бывают нескольких типов. Самые часто используемые:
- JSON выбирает содержимое указанного атрибута, который подан на вход JSON-объекта, и возвращает его значение как строку;
- CSS выбирает элементы DOM по указанному CSS-селектору (например, ID или классу) и возвращает их значение, атрибут или весь HTML-тег целиком. Может вернуть как одну строку, так и массив найденных вхождений;
- Regular expression выбирает вхождения по регулярному выражению, в остальном то же, что и предыдущий output;
- HTTP Header выбирает значение HTTP-заголовка ответа сервера и возвращает его строкой;
- Cookie выбирает значение Cookie, полученной в ответе от сервера, и возвращает его строкой.
Создай новый test case, сохрани его под именем page1 . Теперь посмотри, что вернул сервер. Это должен быть объект JSON, одно из полей которого содержит кусок HTTP-разметки с перечислением запрошенных постов.

Тестовый кейс page1, ответ сервера
JSON output
Первым делом нужно вытащить из объекта JSON значение атрибута content. Создавай новый output типа JSON и в появившемся модальном окне указывай имя параметра content . Сразу же под текстовым полем WrapAPI подсветит найденное значение выходной строки. То, что нам нужно. Сохраняем output и идем дальше.

JSON output для получения значения атрибута content на выход
CSS output
Следующий шаг — вытащить нужные нам поля постов из полученной с сервера верстки, а именно title , excerpt , image , date и id .
Во WrapAPI можно создавать дочерние аутпуты. Нажав на + около существующего output, ты создашь дочерний output, который будет принимать на выход значение предыдущего. Не перепутай! Если просто выбрать пункт Add new output, то будет создан новый root-селектор, который на вход получит голый ответ сервера.

Создаем дочерний CSS output
В появившемся окне вводим название класса заголовка .title-text . Внимание: обязательно отметь опцию Select all into an array , иначе будет выбран только первый заголовок, а нам нужно получить все десять по количеству постов в одном ответе сервера.

Задаем параметры получения данных из HTML-верстки
На выходе в ключе titles у нас окажется массив заголовков, которые вернул CSS output. Согласись, уже неплохо, и все это — без единой строки кода!

Полученные заголовки новостей
Как получить остальные параметры
Как ты помнишь, кроме title , для каждого поста нам нужно получить еще excerpt , image , date и id . Тут все не так здорово: WrapAPI имеет два ограничения:
- он не позволяет создавать цепочки из более чем одного уровня вложенности дочерних outputs;
- он не позволяет задавать несколько селекторов для CSS output’a. То есть CSS output может вытащить только title , только date и так далее.
Признаться, мне пришлось немного поломать голову, чтобы обойти эти ограничения. Я сделал много дочерних по отношению к JSON аутпутов CSS — по одному на каждый из параметров. Они выводят мне в итоговый результат несколько массивов: один с заголовками, один с превью статьи, один с датами и так далее.

Массив дочерних аутпутов, каждый из которых выбирает свой атрибут постов
В итоге у меня получился вот такой массив данных:
Стоит отметить, что для backgroundImages нужно указать получение не текста HTML-тега, а значения атрибута style , так как URL картинки задан в свойстве inline-CSS, а не в атрибуте src тега img .
Приводим все в порядок
Сейчас наш API уже выглядит вполне читаемым, осталось решить две проблемы:
- все компоненты поста — заголовок, дата, превью — находятся в разных массивах;
- в backgroundImages попал кусок CSS, а не чистый URL.
Решить эти проблемы нам поможет следующая вкладка — Post-processing script. Она позволяет написать небольшой синхронный скрипт на JavaScript, который может сделать что-то с нашим контентом перед тем, как он отправится на выход.
Скрипт должен содержать функцию postProcess() , которая принимает один аргумент — текущие результаты парсинга. То, что она вернет, и будет конечным ответом нашего API.
Я набросал небольшой скрипт, который быстро собрал все компоненты в единый массив постов, а также почистил URL картинки. Останавливаться на этом подробнее смысла нет, все, я думаю, и так предельно ясно.

Пишем скрипт для постпроцессинга данных
Тестируем результат
Переходим в очередную вкладку — View and use API element. Здесь нет ничего интересного, кроме стандартных вопросов перед публикацией. Скорее всего, менять ничего не придется, поэтому выбери версию API и публикуй. Мне выдали URL вида https://wrapapi.com/use/f1nn/test001/posts/1.0.0 .
Перед тем как пробовать наш запрос, нужно получить API-ключ. Ключи WrapAPI бывают двух типов:
- приватные, для использования на сервере, не имеют ограничений;
- публичные, для использования на клиенте. Они имеют ограничение по домену, с которого происходит запрос.
Для теста получи новый приватный ключ и попробуй сделать запрос к своему API, поставив свой ключ в query-параметр wrapAPIKey .

Получение ключей доступа к API
У меня вышел вот такой запрос:
Ответ сервера показан на скриншоте. Победа!

Десять постов с 256-й страницы «Хакера» (?page=256)
Выводы
Как видишь, WrapAPI — это мощный и очень эффективный способ построения парсеров веб-контента, который помогает обойтись без программирования или почти без него. Поначалу он кажется слишком перегруженным и нелогичным, но со временем ты убедишься, что он содержит ровно столько опций, сколько действительно нужно для эффективного скрэпинга веба. Сервис имеет гибкие параметры конфигурирования запросов, а постпроцессинг полученных ответов позволяет преобразовать практически любой HTTP response в красивый API. Дерзай, строй свои парсеры!