CoderCastrov logo
CoderCastrov
Питон

Парсинг веб-страниц на Python

Парсинг веб-страниц на Python
просмотров
3 мин чтение
#Питон

Мотивация — На момент написания этого поста на Upwork было размещено 1 314 проектов по парсингу веб-страниц. Когда я связался с несколькими из них и изучил их требования, стало очевидно, что их потребности несложны, но весьма обширны.

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


Реализация

Основные шаги парсинга следующие:

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

**Запрос страницы — библиотека requests, **selenium

Использование библиотеки requests - самый простой способ. Пример:

import requests

response = requests.get('https://www.example.com')

Попробуйте использовать это со страницей, которая динамически загружает данные, и вы быстро увидите проблему. Он запрашивает страницу "как есть", не позволяя выполнять JavaScript на странице. Решение? Используйте selenium.

Код теперь выглядит так:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.example.com')

[необязательно] Проверка загрузки данных — пользовательский скрипт

Для проверки загрузки данных достаточно простой проверки наличия определенных тегов или текста. Например, рассмотрим случай результатов поиска вакансий Google Careers, где результаты загружаются динамически. Пример:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://careers.google.com/jobs#t=sq&q=j&li=20&l=false&jlo=en-US&jl=52.52000659999999%3A13.404953999999975%3ABerlin%2C+Germany%3ADE%3A%3A18.39444871486873%3ALOCALITY%3A%3A%3A%3A%3A%3A&jld=20&j=Python&')

assert 'Search Results' in driver.page_source

**Парсинг HTML — **библиотека BeautifulSoup

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

Для парсинга HTML в Python есть библиотека BeautifulSoup, которая одновременно проста в использовании и довольно мощна. Для парсинга HTML достаточно одной строки кода. Пример:

from bs4 import BeautifulSoup

html = '''
<html>
<body>
<h1>Example Page</h1>
<p>This is an example paragraph.</p>
</body>
</html>
'''

soup = BeautifulSoup(html, 'html.parser')

**Получение необходимых данных — **библиотека BeautifulSoup

Получение данных прямолинейно с использованием функции find() из BeautifulSoup. Пример:

from bs4 import BeautifulSoup

html = '''
<html>
<body>
<h1>Example Page</h1>
<p>This is an example paragraph.</p>
</body>
</html>
'''

soup = BeautifulSoup(html, 'html.parser')
title = soup.find('h1').text
paragraph = soup.find('p').text

Сборка всего вместе

Если вы добрались до этого момента, вы понимаете, что создание собственного парсера на Python - довольно простая задача, сложность возникает, когда вы хотите объединить все вместе, чтобы получить универсальный парсер, который можно использовать снова и снова, чтобы заканчивать парсинг в десятые доли времени. Именно это я и сделал, однако, рассматривать все детали реализации здесь было бы излишне, а также дублированием документации парсера (который я создал).

Вы можете найти универсальный парсер со всей его документацией в этом репозитории на Github.

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


Заключение

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