Ваш секретный чек-лист по парсингу
Добрый день! В этой статье я поделюсь своим опытом парсинга большого количества сайтов.
Задание:
Получить текст с сайтов (порядка 70к), затем выполнить его последующую обработку, в соответствии с требованиями.
Что необходимо сделать перед началом парсинга:
- Убедиться в корректности ссылок сайтов: Корректно указанный протокол (исключаем протоколы: hhtp , hhtps , hhtps , hpp и прочие вариации )Отсутствие пробелов, точек и прочих спец символов в начале и конце ссылки (прим. ./http://www.____.ru/. )
- Проверить работоспособность сайтовМножество сайтов в датасете были недоступны по тем или иным причинам (прим. нерабочий сайт, ошибка 404, 403 и т.д.)
Для реализации обработки выбран Python, использованы библиотеки:
Если вы уверены в корректности своих ссылок, этот пункт можно пропустить.
Для первичной обработки пунктов 1 и 2 использовалась функция check_url() , которая принимает в себя ссылку , а возвращает её же исправленную, и код ответа с сайта :
Помимо нерабочих протоколов, я удалял и правильные, потому что попадались сайты, не загружаются по протоколу http, но на https все окей, и наоборот.
Далее предстояло определиться: необходимо ли долговременное хранение текста с сайтов, или будет достаточно обработки без дальнейшего сохранения данных.
Долговременное хранение потребует проработки архитектуры хранения сайтов, для последующей работы с ними. Также стоит учитывать вес загруженных текстов и, соответственно, место для хранения. Некоторых сайты с принятыми ограничениями указанными ниже весили до 7ГБ, 5000 сайтов весят в среднем ~ 50 ГБ в не заархивированном состоянии ( в архиве они же ~ 7 ГБ).
Для поставленной задачи, хранение данных было необходимо. Поэтому было принято решение хранить каждый сайт в отдельном json файле, где:
имя файла — id сайта в изначальной таблице
ключи внутри — ссылки страниц
И последнее при подготовке — это определиться, как вы будете хранить данные о кодах сайтов, данные обработки и т.д.Я использовал для этого таблицы .csv и .xlsx, а работу с ними в python производил с помощью библиотеки pandas.
Парсинг
Закончив с первичной обработкой, приступаем к парсингу рабочих сайтов.
Поставленная передо мною задача требовала обработки большого количества сайтов, при этом была достаточно ограничена по времени. Было принято решение ограничить парсинг загрузкой текста с главной страницы, а также со страниц, на которые можно перейти с главной, исключая тем самым некоторые переходы по внутренним ссылкам сайтов.Для этого я использовал функцию get_all_links(), которая принимает ссылку на сайт, и возвращает список всех ссылок, найденных на нем
И наконец можно приступить непосредственно к парсингу. Проходясь по готовому дата фрейму, очищенному от нерабочих сайтов, методично парсим сайты один за одним, и сохраняем каждый в папку.
Данный процесс можно ускорить, запустив несколько вкладок в Jupyter Notebook, обрабатывая разные части дата фрейма.
Заключение.
По итогу мы получаем файлы с текстом, готовые к обработке.
Важно отметить, что при парсинге обязательно необходим стабильный, желательно скоростной интернет. При прерывание соединения, парсинг не остановится, и будут загружаться пустые страницы, и будет проблематично отследить, когда случилась беда.Также важно не перегружать компьютер, в том числе оперативную память.
При обработке тяжелых сайтов ( ~4гб) может закончится озу, и загруженные данные обрезаются.
Сложно оценить скорость парсинга и последующей обработки, так как это зависит от производительности всего ПК, скорости интернета и размера каждого сайта, и времени отклика каждого из них.
P.S.Описанным здесь методом не получится загрузить сайты, защищенные от парсинга.
Комментарий недоступен