CoderCastrov logo
CoderCastrov
Парсер

Асинхронный парсинг веб-страниц 101: Получение нескольких URL с использованием Arsenic

Асинхронный парсинг веб-страниц 101: Получение нескольких URL с использованием Arsenic
просмотров
6 мин чтение
#Парсер

С увеличением объема доступных данных в Интернете требования к сервисам парсинга веб-страниц находятся на историческом максимуме. Многие бизнесы полагаются на методологии, основанные на данных, для достижения своих организационных целей. С помощью синхронного парсинга веб-страниц можно удовлетворить большинство типичных запросов на получение данных, которые обычно связаны с небольшими наборами данных. Однако, несмотря на то, что предыдущий раздел работал нормально, парсинг веб-страниц все еще страдает от плохих времен выполнения в случае обработки большого объема данных.

Что такое парсинг веб-страниц

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

Проблемы при парсинге веб-страниц

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

Синхронное vs. Асинхронное выполнение

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

Аналогия синхронного и асинхронного выполнения

Аналогией для синхронных и асинхронных программ может служить случай, когда я планирую общаться со своим хорошим другом Джастином. Звонок Джастину по телефону является синхронным, в то время как общение по электронной почте является асинхронным. По телефону я сначала набираю номер Джастина и жду, пока он поднимет трубку. Как только он поднимает трубку, я говорю что-то и жду его ответа. Если рассматривать меня как программу, я жду, пока сервер (в данном случае Джастин) не вернет ответ, прежде чем выполнить следующую команду (сказать что-то). Так работает типичная синхронная программа. Если я выбираю общение по электронной почте, то после того, как я написал и отправил письмо, вместо ожидания ответа я продолжаю свою работу. Это пример асинхронной программы, где программа продолжает выполнять другие задачи, вместо ожидания ответа.

Синхронное и асинхронное программирование в Python

В этом разделе мы рассмотрим разницу между синхронным и асинхронным программированием в Python и время выполнения.

Это заняло 10 секунд

В Python есть несколько пакетов для асинхронного программирования. Один из таких пакетов - asyncio, который является стандартной библиотекой, добавленной в Python 3.4. Под капотом asyncio использует циклы событий, корутины и задачи для минимизации простоя.

Это заняло 5.88893e-05 секунд

Из сравнения времени выполнения, сгенерированного двумя кодами, можно сделать вывод, что асинхронный метод будет более эффективным, когда мы используем его для парсинга данных с веб-сайтов. Особенно когда нам нужно парсить несколько URL-адресов, это сэкономит много времени, верно?


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

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

То, что я хочу спарсить, это отзывы о Universal Studios, которые находятся в трех филиалах. Я возьму компоненты с веб-сайта, такие как имя рецензента, дата отзыва, заголовок отзыва и текст отзыва. На одном филиале Universal Studio есть около 10 000++ страниц отзывов. Поэтому здесь я сравню парсинг нескольких URL-адресов с использованием синхронных и асинхронных методов.

Синхронный метод веб-парсинга с использованием Selenium и Chromedriver

В синхронном методе я использую библиотеки Selenium и Chromedriver. При парсинге веб-сайта TripAdvisor возникают некоторые проблемы.

Кнопка "Показать еще"

Как показано на скриншоте ниже, TripAdvisor загружает только часть отзыва и ожидает, пока пользователь не нажмет кнопку Показать еще, чтобы загрузить остальное.

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

<div class="DrjyGw-P _1l3JzGX1">Показать еще</span> == $0

В результате использование библиотеки парсинга, такой как Beautiful Soup, недостаточно, и нам нужно запустить браузер и управлять им с помощью Selenium, чтобы имитировать нажатие кнопки Показать еще и выполнение JavaScript-кода.

Вот код для парсинга веб-сайта с использованием Python и Selenium для сбора всех отзывов о парке Universal Studio. Необходимо спарсить отзывы со всех страниц и сохранить их в csv-файл.

С использованием кода выше это займет очень много времени. В среднем на одну страницу уходит около 10 секунд. Представьте, сколько времени потребуется для парсинга 30 000 страниц.

Асинхронный метод веб-парсинга с использованием Arsenic и Chromedriver

В этом разделе я покажу вам процедуру реализации асинхронной программы на Python и рассмотрю преимущества, которые асинхронное программирование предоставляет для парсинга веб-сайтов.

Предположим, у нас есть список из 30 000 URL-адресов, и мы хотим загрузить HTML-страницу для каждого URL-адреса, выполнить некоторую постобработку и извлечь данные.

У нас есть функция run, которая будет собирать данные из 30 000 ранее упомянутых URL-адресов.

Если бы мы делали это синхронно, это заняло бы 100 умножить на среднее время для получения запроса (предполагая, что время постобработки незначительно). Но вместо этого, если мы разделим 100 URL-адресов на 4 отдельных потока/процесса, то время, необходимое для выполнения, будет составлять 1/4 от исходного времени, по крайней мере, теоретически.

Далее мы создадим асинхронную функцию для открытия браузера с помощью Chromedriver. Это автоматически откроет страницу, и мы сможем непосредственно получить доступ к элементу, из которого хотим извлечь информацию.

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

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

В конце мы можем взять нужные элементы, используя этот код

Использование асинхронного кода значительно сократит время выполнения. Для 1 страницы нам нужно всего около 1 секунды, чтобы получить данные, которые мы хотим извлечь. Это очень экономит время по сравнению с использованием синхронного метода.

Датасет отзывов о филиалах Universal Studios

Датасет, полученный путем парсинга, можно скачать на Kaggle. Датасет включает более 50 000 отзывов о 3 филиалах Universal Studios (Флорида, Сингапур, Япония), оставленных посетителями на сайте Trip Advisor.


Полный исходный код вы можете найти на моем GitHub

dwiknrd/scraping-tripadvisor

Отзывы о Universal Studio на TripAdvisor. Внесите свой вклад в dwiknrd/scraping-tripadvisor, создав учетную запись на...

github.com