Web-Scraping с применением библиотек BeautifulSoup4 + Asyncio
Для начала, что такое «Web-Scraping»? Это автоматизированный процесс извлечения данных с какой-либо веб-страницы. Когда не было возможности автоматизировано извлекать данные со страниц, извлекали данные вручную, что занимало достаточно большое количество времени. Сейчас же можно ускорить извлечение данных в разы при помощи различных языков программирования и специальных инструментов.
Информации в интернете становится все больше, как следствие, время на извлечение данных увеличивается. Возникает необходимость в решении данной задачи.
В данном случае рассмотрю способ с применением python библиотеки BeautifulSoup4 в связке с библиотекой asyncio.
Асинхронное программирование – это особенность современных языков программирования, которая позволяет выполнять операции, не дожидаясь их завершения. Библиотека asyncio предназначена как раз для этого.
Допустим, я буду извлекать данные из трёх страниц веб-сайта с применением привычных библиотек BeautifulSoup4 и Requests.
Сначала потребуется 10 секунд на извлечение данных с первой страницы, потом 8 со второй и 11 секунд с третьей страницы, что в итоге займет (10 + 8 + 11) 29 секунд.
При использовании библиотеки asyncio не надо дожидаться завершения извлечения данных с первой страницы, чтобы начать извлекать данные со второй. В итоге будет выиграно время.
Время на извлечение данных сокращается до максимального времени выполнения сбора данных с какой-либо из страниц. В данном случае максимальным временем является время, возложенное на третью страницу (11 секунд).
Ниже приведен пример разницы во времени, затраченного на извлечение данных при помощи библиотек BS4 + Requests в сравнении с BS4 + Asyncio.
Первый скрипт:
Время, отведенное на извлечение и обработку данных с веб-страницы при помощи BS4 + Requests, составило ~ 28 секунд.
Далее предлагаю переписать скрипт с применением библиотек BS4 + Asyncio.
Второй скрипт:
На извлечение и обработку одного и того же объёма данных в данном случае потребовалось всего 4 секунды, а не 28 секунд.
В заключении можно сказать, что применение такого сочетания библиотек, как BeautifulSoup4 и Asyncio, позволит сократить время на сбор и обработку данных при работе с большими данными до 7 раз.
Все верно. Происходит одновременно множество обращений с одного IP адреса на домен. Это лишь пример применения использования библиотеки для асинхронности или же как ускорить какую-либо задачу - в данном случае парсинг веб-страниц.
В качестве обхода ограничений можете использовать прокси, изменять свой юзер агент и тд, для каждого сайта нужен свой подход для обхода ограничений, если таковы имеются. В данном случае, автор показал неплохую базу для скрапинга, для некоторых это может служить отправной точкой для изучения этой темы
concurrent.futures дает возможность запускать асинхронные задачи в синхронном коде. Если нигде больше асинхронности не будет, то это даже предпочтительный вариант за счет большей гибкости. Но если есть задача делать код асинхронным с самого начала (или его нельзя будет выделить в отдельные задачи), то лучше все-таки изучить PEP492
Одновременное обращение с одного айпи к нескольким (десяткам, сотням...) документам домена?
Все верно. Происходит одновременно множество обращений с одного IP адреса на домен. Это лишь пример применения использования библиотеки для асинхронности или же как ускорить какую-либо задачу - в данном случае парсинг веб-страниц.
С одной стороны, как это для пациента — не больно?
С другой — такому парсингу, видимо, достаточно просто воспрепятствовать. Или я чего-то не понимаю?
В качестве обхода ограничений можете использовать прокси, изменять свой юзер агент и тд, для каждого сайта нужен свой подход для обхода ограничений, если таковы имеются. В данном случае, автор показал неплохую базу для скрапинга, для некоторых это может служить отправной точкой для изучения этой темы
Спасибо, полезно. Заныкаю в закладки на будущее.
Комментарий недоступен
А я юзал concurrent.futures, что бы распараллелить парсинг и запись файлов.
concurrent.futures дает возможность запускать асинхронные задачи в синхронном коде. Если нигде больше асинхронности не будет, то это даже предпочтительный вариант за счет большей гибкости. Но если есть задача делать код асинхронным с самого начала (или его нельзя будет выделить в отдельные задачи), то лучше все-таки изучить PEP492
Извините, последнее предложение не понял