Парсинг — это процесс анализа и разбора структуры данных, представленных в виде текста или другого формата, для извлечения из них необходимой информации.
В контексте программирования парсинг обычно используется для обработки данных, поступающих из внешних источников, таких как файлы, сети или пользовательский ввод. Парсинг позволяет программе извлечь из этих данных необходимую информацию и представить её в удобной для дальнейшей обработки форме.
В Python для парсинга используются различные библиотеки и модули, такие как:
- re (regular expressions) — для работы с регулярными выражениями, которые позволяют описывать шаблоны в тексте.
- xml.etree.ElementTree — для парсинга XML-файлов.
- json — для парсинга JSON-файлов.
- BeautifulSoup — для парсинга HTML- и XML-документов.
- pandas — для парсинга и обработки табличных данных.
Процесс парсинга обычно включает следующие шаги:
- Чтение данных: чтение данных из источника (файла, сети, пользовательского ввода).
- Анализ структуры: анализ структуры данных для определения их формата и содержания.
- Разбор данных: разбор данных на составные части (например, строки, числа, объекты).
- Извлечение информации: извлечение необходимой информации из разобранных данных.
- Преобразование данных: преобразование извлеченной информации в удобную для дальнейшей обработки форму.
Примеры использования парсинга в Python:
- Извлечение информации из веб-страниц с помощью BeautifulSoup.
- Чтение и обработка CSV-файлов с помощью pandas.
- Разбор JSON-файлов для извлечения данных.
- Анализ лог-файлов для извлечения информации о системных событиях.
Какие инструменты нужны для Webscraping'а или же парсинга с вебсайтов?
- Браузер или его драйвер (Для Selenium)
С кратким вводом закончили, теперь хотелось бы объяснить почему это полезно не только для программистам, но и другим людям.
К вам подходит ваш начальник, и просит вас с сайта, с которым вы сотрудничаете, записать в excel все клавиатуры которые у них есть, цены и характеристики. Для дальнейшего отбора нужных позиций и заказа.
В качестве такого сайта, для примера будет использовать Ситилинк. Заходим а раздел клавиатур, и видим 346 товаров и огромный список характеристик для каждой...
Теперь вы осознаете сколько времени потратите, если начнете делать это руками, возможно и целый день, с возможностью внести ряд ошибок из за рутиной работы.
Но мы то с вами не станем тратить столько времени в пустую, а за нас это сделает программа, которую мы сейчас и сделаем. Первое, что не обходимо понять, как получить все ссылки на товар, и в каком формате сайт отдает нам информацию.
Заходим через любой браузер на страницу, нажимаем F12. Что откроет нам DevTools
Это инструменты разработчика в браузерах, которые помогают в создании, тестировании, оптимизации сайтов или веб-приложений.
Нам нужна вкладка Сеть(Network). Обновляем страницу и вписываем название первого товара в поиск. Если поиска нет нажмите сочетание CTRL + F в открытых инструментах разработчика.
В нашем случаем мы видим, что страница не имеет товаров в статичном виде, то есть они динамические и загружаются в процессе загрузки. Технология которая используется это GraphQL, что не сильно затруднит получение данных, но может поставить новичка в тупик.
GraphQL — это язык запросов для API (Application Programming Interface), который позволяет клиентам запрашивать только те данные, которые им необходимы, и получать ответ в виде структурированных данных.
Подобные запросы содержат кучу информации в теле запроса, давайте просто скопируем его, правый клик на запрос Копировать - Как cURL (bash).
Переходим в Postman нажимаем кнопку Import и вставляем содержимое буфера обмена, в который мы только что, скопировали запрос
После запрос будет сконвертирован в удобный вид, нас интересует вкладка Body, что бы понять какие данные передаются на получение.
Как видим полезной информации не так много и она понятна - Категория, Страница и Количество. Последнее лучше не менять, так как сайт может просто ничего не отдать. Переходим к магии Postman, нажмите на значок </> и вам откроется меню выбора языка, нас интересует Python - Requests.
Переходим в нашу IDE, создаем новый проект, назовем его dzen, и добавляем python файл с названием citilink, после скачиваем библиотеку Requests
- pip install requests
Переходим на любой товар, и самостоятельно повторяем поиск выше, взяв в качестве строки поиска к примеру размер товара.
Видим что это все тот же уже знакомый нам GraphQL, так же импортируем его в Postman и смотрим какой параметр нужен для получения, а это ID
Вывод из этого следующий - нам необходимо пройтись по всем страницам, и получить все ID(уникальные идентификаторы) товаров. Копируем код с первого импорта в нашу программу, удаляем ненужные Заголовки.
Заголовки HTTP (англ. HTTP Headers) — это строки в HTTP-сообщении, содержащие разделённую двоеточием пару имя-значение. Формат заголовков соответствует общему формату заголовков текстовых сетевых сообщений ARPA (см. RFC 822).
Какие заголовки нужны, вы поймете с опытом, для примера вы можете использоваться все, не удаляя ничего
Переменные url и headers неизменные, мы можем вынести их вверх, и обернуть вставленный код в функцию, которая пройдется по всем страницам и соберет нужные нам идентификаторы и вернет список. Страниц на момент написания 8.
Делаем цикл
- for page in range(1, 9):
Который отдаст нам значения начиная с 1 до 8. В payload вносим нашу переменную для изменения следующей страницы запроса
- ...."pagination\":{\"page\":" + str(page) +",\"perPage\":48}....
Ответ приходит в формате Json, так что работать с ним нам будет удобно, изучаем его строение и приходим к следующему, нужен цикл и некоторый список в который будет складировать значения
for product in response.json()['data']['productsFilter']['record']['products']:
product_ids.append(product['id'])
После возвращает product_ids.
Переходим ко второму импортированному запросу, из него нам нужна строка payload, копируем ее. Создаем новую функцию def get_product_info(product_id: int) -> dict и вставляем туда payload
Айди продукта мы будем передавать непосредственно в функцию, поэтому меняем конец запроса на
- .....{\"filter\":{\"id\":\""+ str(product_id) +"\"}}}"
Аналогичным образом изучаем Json и приходим к понимаю как реализовать цикл для получения
Но где же цена и название? Все верно, в первом запросе при получении ID, можно было их получить. Я не акцентировал на этом внимание, что бы показать процесс работы над ошибками, нам предстоит переделать функцию get_product_ids() c новыми условиями, а так же переименовываем для понимания, что происходит внутри. Что бы избежать блокировки, я добавлю таймер сна на 30 секунд. Для этого понадобиться импортировать библиотеку, она стандартная и подключается следующим образом - import time. Этого можно не делать, если имеем запас прокси или можем динамически использовать разные айпи адреса. Так же изменю цикл на While, так как если страницы не существует, список продуктов будет пустым. Это избавит нас от захода на сайт и проверки.
Теперь нам осталось установить библиотеки для работы с excel, командой
- pip install pandas openpyxl
Подключаем библиотеку в начале кода
- import pandas as pd
Осталось лишь циклом пройтись по полученным ID, и результат уже у нас.
Конечный код выглядит следующим образом
Идем выпить чашку кофе или чая, и по возвращению получаем готовый excel файл, который отдаем нашему начальнику.
Вот так просто мы сэкономили несколько часов нудной работы, сайт безусловно не самый простой для разбора, но взял первый попавшийся, динамический контент куда сложнее в получении. Но с опытом, подобное вы будите делать за считанные минуты, надеюсь статья была полезная, если остались вопросы, с радостью на них отвечу.