CoderCastrov logo
CoderCastrov
Технология

Парсинг от 0 до героя (Часть 2/5)

Парсинг от 0 до героя (Часть 2/5)
просмотров
5 мин чтение
#Технология

Основной парсинг

Основная концепция парсинга очень проста. Создайте простой скрипт парсинга с помощью scrapy для получения данных с Wikipedia.org (см. также их Условия использования).

После выполнения 2 простых команд для создания проекта и его настройки, вы можете начать писать код. Команды:

_> scrapy startproject simple_project> cd simple_project> scrapy genspider wikipedia wikipedia.org_

После выполнения этих команд вы можете открыть PyCharm и начать разработку.

https://gitlab.com/fparareda/scrapy_simple_project/-/blob/master/simple_project/spiders/wikipedia.py

Другая часть парсера очень проста:

  • Функция init: настраивает начальные функции и свойства. Я всегда предпочитаю устанавливать URL для начала парсинга в конструкторе (init функция). Это позволяет мне добавлять больше вещей через командную строку, а также позволяет мне, если я хочу, немного обрабатывать URL перед началом парсинга.
  • Функция parse: извлекает элементы, которые вы хотите получить с веб-страницы (такие как заголовок, текст-отрывок).

Другая папка проекта (https://gitlab.com/fparareda/scrapy_simple_project) содержит настройки:

  • Структура парсера, settings.py** **где все определено (конкурентные запросы, задержка в каждом запросе, User Agents, использование robots.txt и т. д.)
  • Элемент парсера, где информация хранится итеративно во время всего процесса парсинга. Элемент определен в items.py
  • Пайплайны, которые используются после получения информации: pipelines.py

Получение данных

В конкретном парсере (в проекте он называется wikipedia.py) вы можете указать, как получить информацию. Для этого вы можете использовать 2 метода (как определено в документации Scrapy):

  • XPath - это язык для выбора узлов в XML-документах, который также может использоваться с HTML (лучший способ научиться использовать XPath - это практика + StackOverflow)
  • CSS - это язык, используемый для применения стилей к HTML-документам. Он определяет селекторы для применения этих стилей к определенным элементам HTML (точно так же, как старая библиотека JQuery в JavaScript - я чувствую себя таким старым, что называю ее так).

Вход

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

Если вы хотите сделать это на Python (с помощью Scrapy), вы можете следовать моему примеру.

После успешного входа вы сможете наслаждаться всей информацией!

Противодействие (повторные попытки, задержки и многопоточность)

Очень часто используются противодействия, чтобы избежать блокировки защитными правилами, установленными веб-мастерами. Они используют предустановленные пакеты в своих конфигурациях, чтобы избежать автоматического получения информации. Вот почему нам нужно принять меры несколькими способами. Я рассмотрю наиболее распространенные из них:

  • Отсутствие заголовков (в частности, User Agents): если вы хотите быть идентифицированным как человек, когда вы пытаетесь получить информацию, вам нужно добавить в запрос параметр, указывающий, что вы посещаете веб-сайт с определенного компьютера, операционной системы и версии браузера. Для этого в Scrapy вы можете жестко закодировать эти параметры в settings.py или использовать это промежуточное программное обеспечение или это. Также вы можете настроить такие вещи, как файлы cookie или даже другие заголовки HTTP, имитируя перенаправление от Google или другого поискового движка.
  • Множественные повторные попытки в короткое время на одном и том же веб-сайте: по умолчанию Scrapy не выполняет повторные попытки, если запрос не удался. Вы можете изменить это в settings.py, чтобы повторить хотя бы 2 раза.
  • Параллелизация запросов или многопоточность: один сервер Scrapy может выполнять несколько запросов в секунду. Это означает, что вы можете одновременно выполнять запросы без задержки между ними. Самый распространенный и нормальный способ - указать задержку между запросами. Это делается для имитации поведения посетителя, так как ему невозможно одновременно посетить два веб-сайта с одного компьютера. Рекомендуется установить среднюю скорость (иногда в файле robots.txt веб-сайта может быть указана) или, по крайней мере, случайный выбор между 2 числами (например, 0,25 и 5 секунд).
  • Шаблонное поведение в запросах, выполненных с одного IP: крупные компании (Amazon, LinkedIn, Twitter и т. д.) используют искусственный интеллект (AI), чтобы определить, указывает ли поведение запросов, что они исходят из одного источника (даже если IP и заголовки разные).

Шаблонное поведение может быть выполнено путем анализа поведения:

  • Каждый день в одно и то же время кто-то парсит те же страницы.
  • Если они получают, внезапно, много запросов, приходящих с разных IP-адресов со всего мира, когда веб-сайт доступен только на одном языке.
  • Скорость и страницы, к которым группа IP-адресов пытается получить доступ, коррелируют (например, когда на веб-сайте много пагинации и обнаруживается, что китайский IP запрашивает страницу номер 34, а российский IP запрашивает - в короткий период времени и впервые - страницу 35).

Такое поведение помещает эти IP-адреса в карантин для дальнейшего анализа и предоставления информации им в качестве предосторожности.

Минимальная структура парсера

Когда вы готовы настроить свой первый парсер, вы должны помнить, что вам нужно выполнить парсер на одном компьютере. Есть 2 возможности: локальная и внешняя/облачная.

Локальная

При выполнении парсера локально это довольно просто и удобно контролировать. Все проблемы легко решаются, потому что это ручной процесс. Кроме того, у вас есть контроль над вашим IP-адресом, в случае, если вам, например, нужно использовать локальную базу данных.

Цена составляет 0 и настройка довольно проста. Вы можете следовать простому руководству о том, как создать фиктивный парсер в Scrapy здесь.

Облачные серверы

Когда вам нужно масштабироваться, лучшим решением является использование облачного сервиса. Когда я говорю об облачном сервисе, я имею в виду Amazon Web Services (AWS), Google Cloud, Microsoft Azure, OVH или другие.

В зависимости от ваших потребностей, они отличаются:

  • Ценой,
  • Масштабируемостью,
  • Сочетанием различных сервисов.

По моему мнению, одно из лучших решений (если у вас есть достаточные знания о том, как настроить сложный сервер) - это арендовать сервер в Hetzner.

Самый простой способ настроить сервер с помощью Scrapy - установить его в локальной среде. Когда локальный сервер Scrapy способен парсить десятки веб-сайтов, вы можете переключиться на облачное хранилище (SQL, NoSQL, диск или даже S3), также вы можете развернуть локальный парсер на том же сервере или другом облачном сервисе провайдера.

Продолжение следует...

Эта статья является частью списка статей о Парсинге с нуля до героя:

Если у вас есть вопросы, вы можете оставить комментарий ниже или связаться со мной через Twitter или LinkedIn.