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

Введение в веб-парсинг и Python

По сути, это метод или процесс, при котором большие объёмы данных с огромного количества веб-сайтов пропускаются через программное обеспечение для веб-парсинга, написанное на языке программирования, и в результате извлекаются структурированные данные, которые можно сохранить локально на наших устройствах, предпочтительно в таблицах Excel, JSON или электронных таблицах. Теперь нам не нужно вручную копировать и вставлять данные с веб-сайтов, поскольку парсер может выполнить эту задачу за пару секунд.

Это помогает программистам писать понятный, логичный код для небольших и масштабных проектов. Python в основном известен как лучший язык для веб-скрапинга. Он больше похож на универсальный инструмент и может легко справляться с большинством процессов, связанных с веб-сканированием. Scrapy и Beautiful Soup — одни из наиболее широко используемых фреймворков на основе Python, которые упрощают веб-скрапинг с помощью этого языка.

Краткий список библиотек Python, используемых для веб-парсинга

Давайте посмотрим библиотеки веб-парсинга на Python!

  • Requests (HTTP для людей) Библиотека для веб-парсинга — используется для создания различных типов HTTP-запросов, таких как GET, POST и т. д. Это самая простая, но в то же время самая важная из всех библиотек.
  • Библиотека lxml для веб-парсинга — библиотека lxml обеспечивает сверхбыстрый и высокопроизводительный синтаксический анализ HTML и XML контента с веб-сайтов. Если вы планируете собирать большие наборы данных, вам стоит выбрать именно её.
  • Библиотека Beautiful Soup для веб-парсинга — она работает путём создания дерева синтаксического разбора для анализа содержимого. Это идеальная стартовая библиотека для новичков, с которой очень легко работать.
  • Библиотека Selenium для веб-парсинга — изначально созданная для автоматизированного тестирования веб-приложений, эта библиотека решает проблему, с которой сталкиваются все вышеперечисленные библиотеки, а именно — извлечение контента с динамически заполняемых веб-сайтов. Это делает её более медленной и непригодной для проектов промышленного уровня.
  • Scrapy для веб-парсинга — лучшая из всех библиотек, целый фреймворк для веб-парсинга, который используется асинхронно. Это делает его невероятно быстрым и повышает эффективность.

Практическая реализация – Извлечение из Википедии

Шаг 1: Как использовать python для веб-парсинга?

  • Нам нужна среда разработки python IDE, и мы должны быть знакомы с ее использованием.
  • Virtualenv — это инструмент для создания изолированных сред Python. С помощью virtualenv мы можем создать папку, содержащую все необходимые исполняемые файлы для использования пакетов, которые требуются нашему проекту Python. Здесь мы можем добавлять и изменять модули Python, не затрагивая глобальную установку.
  • Нам нужно установить различные модули и библиотеки Python с помощью команды pip для наших целей. Но мы всегда должны помнить о том, является ли сайт, который мы парсим, легальным.

Требования:

  • Requests: Это эффективная HTTP-библиотека, используемая для доступа к веб-страницам.
  • Urlib3: используется для извлечения данных из URL-адресов.
  • Selenium: это набор инструментов для автоматизированного тестирования веб-приложений с открытым исходным кодом для различных браузеров и платформ.

Установка:

pip install virtualenv
python -m pip install selenium
python -m pip install requests
python -m pip install urllib3

Пример изображения при установке

Шаг 2: Введение в библиотеку запросов

  • Здесь мы изучим различные модули python для извлечения данных из Интернета.
  • Библиотека Python Requests используется для загрузки веб-страницы, которую мы пытаемся очистить от данных.

Требования:

  • Python IDE
  • Модули Python
  • Библиотека запросов
# import required modules
import requests

# get URL
page = requests.get("https://en.wikipedia.org/wiki/Main_Page")

# display status code
print(page.status_code)

# display scraped data
print(page.content)

Выход:

Первое, что мы должны делать, чтобы очистить веб-страницы, чтобы загрузить страницу. Мы можем загружать страницы, используя библиотеку запросов в Python. На просьбы библиотека сделает запрос GET на веб-сервер, который будет загружать содержимое HTML данной веб-страницы для нас. Существует несколько типов запросов, которые мы можем сделать, используя запросы, которые вам только одно. Адрес нашего образца сайте https://en.wikipedia.org/wiki/Main_Page. Задача в том, чтобы скачать его с помощью requests.get() метод. После выполнения нашей просьбы, мы получаем объект Response. Этот объект имеет status_code свойство, которое указывает, если страница была загружена успешно. И свойство content, которое дает HTML-содержимое веб-страницы в качестве выходных данных.

Шаг 3: Введение в Beautiful Soup для синтаксического анализа страниц

У нас есть множество модулей Python для извлечения данных. Для наших целей мы будем использовать BeautifulSoup.

  • BeautifulSoup — это библиотека Python для извлечения данных из HTML и XML файлов.
  • Для создания объекта-супа ему нужен ввод (документ или URL-адрес), поскольку он не может самостоятельно загрузить веб-страницу.
  • У нас есть и другие модули, такие как регулярные выражения, lxml, для тех же целей.
  • Затем мы обрабатываем данные в формате CSV, JSON или MySQL.

Требования:

  • PythonIDE
  • Модули Python
  • Beautiful Soup library
pip install bs4

Пошаговое руководство по коду:

# import required modules
from bs4 import BeautifulSoup
import requests

# get URL
page = requests.get("https://en.wikipedia.org/wiki/Main_Page")

# scrape webpage
soup = BeautifulSoup(page.content, 'html.parser')

# display scraped data
print(soup.prettify())

Вывод:

Как вы можете видеть выше, теперь мы загрузили HTML-документ. Мы можем использовать библиотеку BeautifulSoup для анализа этого документа и извлечения текста. Сначала нам нужно импортировать библиотеку и создать экземпляр класса BeautifulSoup для анализа нашего документа. Теперь мы можем вывести HTML-содержимое страницы в удобном формате с помощью метода prettify объекта BeautifulSoup. Поскольку все теги вложены друг в друга, мы можем перемещаться по структуре по одному уровню за раз. Сначала мы можем выбрать все элементы на верхнем уровне страницы с помощью свойства children в объекте soup. Обратите внимание, что свойство children возвращает генератор списка, поэтому нам нужно вызвать функцию list.

Шаг 4: Углубляемся в Beautiful Soup дальше

Три функции, которые делают Beautiful Soup таким мощным:

  • Beautiful Soup предоставляет несколько простых методов  Python для навигации, поиска и изменения дерева синтаксического разбора: набор инструментов для анализа документа и извлечения нужной информации. Для написания приложения не требуется много кода
  • Beautiful Soup автоматически преобразует входящие документы в Unicode, а исходящие — в UTF-8. Вам не нужно беспокоиться о кодировках, если только в документе не указана кодировка и Beautiful Soup не может её определить. В этом случае вам просто нужно указать исходную кодировку.
  • Beautiful Soup работает поверх популярных парсеров Python, таких как lxml и html5lib, позволяя вам опробовать различные стратегии парсинга или пожертвовать скоростью ради гибкости. Затем нам нужно просто обработать наши данные в подходящем формате, например CSV, JSON или MySQL.

Требования:

  • PythonIDE
  • Python Modules
  • Beautiful Soup library

Пошаговое руководство по коду:

# import required modules
from bs4 import BeautifulSoup
import requests

# get URL
page = requests.get("https://en.wikipedia.org/wiki/Main_Page")

# scrape webpage
soup = BeautifulSoup(page.content, 'html.parser')

list(soup.children)

# find all occurrence of p in HTML
# includes HTML tags
print(soup.find_all('p'))

print('\n\n')

# return only text
# does not include HTML tags
print(soup.find_all('p')[0].get_text())

Вывод:

То, что мы сделали выше, было полезно для того, чтобы понять, как перемещаться по странице, но для выполнения довольно простой задачи потребовалось много команд. Если мы хотим извлечь один тег, мы можем использовать метод find_all(), который найдёт все экземпляры тега на странице. Обратите внимание, что find_all() возвращает список, поэтому для извлечения текста нам придётся перебирать его или использовать индексацию списка. Если вы хотите найти только первый экземпляр тега, вы можете использовать метод find, который вернёт один объект BeautifulSoup.

Шаг 5: Изучение структуры страницы с помощью инструментов разработки Chrome и извлечение информации

Первое, что нам нужно сделать, — это проверить страницу с помощью инструментов разработчика Chrome. Если вы используете другой браузер, в Firefox и Safari есть аналоги. Однако рекомендуется использовать Chrome.

Вы можете запустить инструменты разработчика в Chrome, нажав «Вид» -> «Разработчик» -> «Инструменты разработчика». В нижней части браузера появится панель, похожая на ту, что вы видите ниже. Убедитесь, что панель «Элементы» выделена. На панели «Элементы» отображаются все HTML-теги на странице, и вы можете перемещаться по ним. Это очень удобная функция! Щёлкнув правой кнопкой мыши по странице в том месте, где написано Расширенный прогноз, а затем нажав Проверить, мы откроем тег, содержащий текст Расширенный прогноз, на панели элементов.

Анализ с помощью Chrome Dev tools

Пошаговое руководство по коду:

# import required modules
from bs4 import BeautifulSoup
import requests

# get URL
page = requests.get("https://en.wikipedia.org/wiki/Main_Page")

# scrape webpage
soup = BeautifulSoup(page.content, 'html.parser')

# create object
object = soup.find(id="mp-left")

# find tags
items = object.find_all(class_="mp-h2")
result = items[0]

# display tags
print(result.prettify())

Вывод:

Здесь нам нужно выбрать элемент, у которого есть идентификатор и который содержит дочерние элементы с тем же классом. Например, элемент с идентификатором mp-left является родительским элементом, а его вложенные дочерние элементы имеют класс mp-h2. Поэтому мы выведем информацию о первом вложенном дочернем элементе и оформим её с помощью функции prettify().

Заключение и более глубокое изучение веб-парсинга

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

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