Парсинг веб-страниц с использованием Python: пошаговое руководство

Парсинг веб-страниц с использованием Python: пошаговое руководство

Веб-скрапинг — это идея извлечения информации с веб-сайта и использования ее для определенного варианта использования.

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

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

Зачем использовать Python для парсинга веб-страниц?

Python — это первый выбор для многих разработчиков при создании парсеров. Есть много причин, по которым Python является первым выбором, но в этой статье мы рассмотрим три основные причины, по которым Python используется для очистки данных.

Библиотека и поддержка сообщества. Существует несколько замечательных библиотек, таких как BeautifulSoup, Scrapi, Selenium и т. д., которые предоставляют отличные функции для эффективного парсинга веб-страниц. Он создал отличную экосистему для просмотра веб-страниц, а также, поскольку многие разработчики по всему миру уже используют Python, вы можете быстро получить помощь, если застряли.

Автоматизация: Python известен своими возможностями автоматизации. Если вы пытаетесь создать сложный инструмент, основанный на парсинге, вам потребуется нечто большее, чем веб-скрапинг. Например, если вы хотите создать инструмент, который отслеживает цены на товары в интернет-магазине, вам нужно добавить некоторые возможности автоматизации, чтобы он мог ежедневно отслеживать цены и добавлять их в свою базу данных. Python дает вам возможность легко автоматизировать такие процессы.

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

Библиотеки для парсинга веб-страниц в Python

В Python доступно несколько библиотек для упрощения парсинга веб-страниц. Давайте обсудим здесь три самые популярные библиотеки.

№1. КрасивыйСуп

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

№ 2. Лоскутный

Еще один популярный фреймворк для извлечения данных. Scrapy имеет более 43000 звезд на GitHub. Его также можно использовать для извлечения данных из API. Он также имеет интересную встроенную поддержку, например, отправку электронных писем.

№3. Селен

Selenium не является в первую очередь библиотекой веб-скрейпинга. Вместо этого это пакет автоматизации поисковой системы. Но мы можем легко расширить его функциональность для парсинга веб-страниц. Он использует протокол WebDriver для управления различными браузерами. Selenium присутствует на рынке почти 20 лет. Но с помощью Selenium вы можете легко автоматизировать сбор данных с веб-страниц.

Проблемы с парсингом веб-страниц Python

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

Но вы можете эффективно обойти проблемы, следуя некоторым способам. Например, в большинстве случаев веб-адрес блокируется веб-сайтом, когда за определенный интервал времени отправляется более определенного количества запросов. Чтобы избежать блокировки IP-адресов, вам нужно запрограммировать парсер так, чтобы он остывал после отправки запроса.

Разработчики также склонны устанавливать ловушки для очистки горшков. Эти ловушки обычно невидимы невооруженным человеческим глазом, но их можно проползти скребком. Если вы парсите веб-сайт, который устанавливает такую ​​ловушку, вам нужно соответствующим образом запрограммировать парсер.

Captcha — еще одна серьезная проблема парсеров. Сегодня большинство веб-сайтов используют капчу для защиты доступа ботов к своим страницам. В этом случае вам может понадобиться использовать решатель капчи.

Создание веб-сайта с помощью Python

Как мы уже говорили, мы будем использовать BeautifulSoup для удаления веб-сайта. В этом руководстве мы соберем исторические данные Ethereum из Coingecko и сохраним данные таблицы в виде файла JSON. Приступаем к созданию скребка.

Первый шаг — установить BeautifulSoup и Requests. В этом уроке я буду использовать Pipenv. Pipenv — это менеджер виртуальной среды для Python. Вы также можете использовать Venv, если хотите, но я предпочитаю Pipenv. Обсуждение Pipenv выходит за рамки этого руководства. Но если вы хотите узнать, как можно использовать Pipenv, следуйте этому руководству. Или, если вы хотите понять виртуальные среды Python, следуйте этому руководству.

Запустите оболочку Pipenv в каталоге вашего проекта, выполнив команду оболочки pipenv. Он запустит подоболочку в вашей виртуальной среде. Теперь, чтобы установить BeautifulSoup, выполните следующую команду:

pipenv install beautifulsoup4

И, чтобы установить требования, выполните команду, аналогичную приведенной выше:

pipenv install requests

После завершения установки импортируйте необходимые пакеты в основной файл. Создайте файл с именем main.pi и импортируйте пакеты, как показано ниже:

from bs4 import BeautifulSoup
import requests
import json

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

r = requests.get('https://www.coingecko.com/en/coins/ethereum/historical_data#panel')

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

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

Оригинальная часть очистки начинается сейчас. Во-первых, вам нужно правильно идентифицировать таблицу в DOM. Если вы откроете эту страницу и проверите ее с помощью инструментов разработчика, доступных в вашем браузере, вы увидите, что в таблице есть эти таблицы классов table-striped text-sm text-lg-normal.

Таблица исторических данных Coingecko Ethereum

Чтобы правильно настроить таргетинг на эту таблицу, вы можете использовать метод find.

table = soup.find('table', attrs={'class': 'table table-striped text-sm text-lg-normal'})

table_data = table.find_all('tr')

table_headings = []

for th in table_data[0].find_all('th'):
    table_headings.append(th.text)

В вышеприведенном коде сначала выполняется поиск таблицы с помощью метода soap.find, затем с помощью метода find_all выполняется поиск всех элементов tr внутри таблицы. Эти элементы tr хранятся в переменной с именем table_data. В таблице есть несколько элементов для заголовка. Новая переменная с именем table_headings инициализируется для хранения заголовков в списке.

Затем запускается цикл for для первой строки таблицы. В этой строке ищутся все элементы с th, и их текстовое значение добавляется в список table_headings. Текст извлекается с помощью текстового метода. Если вы сейчас напечатаете переменную table_headings, вы сможете увидеть следующий вывод:

['Date', 'Market Cap', 'Volume', 'Open', 'Close']

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

for tr in table_data:
    th = tr.find_all('th')
    td = tr.find_all('td')

    data = {}

    for i in range(len(td)):
        data.update({table_headings[0]: th[0].text})
        data.update({table_headings[i+1]: td[i].text.replace('n', '')})

    if data.__len__() > 0:
        table_details.append(data)

Это неотъемлемая часть кода. Для каждого tr в переменной table_data в первую очередь ищутся элементы th. элементы — это дата, отображаемая в таблице. Эти элементы хранятся внутри переменной th. Точно так же все элементы td хранятся в переменной td.

Инициализируется пустой словарь данных. После инициализации мы перебираем диапазон элементов td. Для каждой строки мы сначала обновляем первое поле словаря первым элементом th. Код table_headings[0]: число[0].text присваивает пару ключ-значение дате и первому элементу.

После инициализации первого элемента остальные элементы назначаются с помощью data.update({table_headings[i+1]: тд[i].tekt.replace(‘n’, «»)}). Здесь текст элементов td сначала извлекается с помощью метода text, а затем все n заменяются с помощью метода replace. Затем значение присваивается i+1. к элементу списка table_headings, поскольку i-й элемент уже назначен.

Затем, если длина словаря данных больше нуля, мы добавляем словарь в список table_details. Вы можете распечатать список table_details для проверки. Но мы запишем значения в файл JSON. Давайте посмотрим на код для этого,

with open('table.json', 'w') as f:
    json.dump(table_details, f, indent=2)
    print('Data saved to json file...')

Здесь мы используем метод json.dump для записи значений в файл JSON с именем table.json. Когда запись завершена, мы выводим данные, хранящиеся в файле json… на консоль.

Теперь запустите файл с помощью следующей команды:

python run main.py

Через некоторое время вы сможете увидеть данные, хранящиеся в файле JSON… текст в консоли. Вы также увидите новый файл с именем table.json в каталоге рабочих файлов. Файл будет похож на следующий файл JSON:

[
  {
    "Date": "2022-11-27",
    "Market Cap": "$145,222,050,633",
    "Volume": "$5,271,100,860",
    "Open": "$1,205.66",
    "Close": "N/A"
  },
  {
    "Date": "2022-11-26",
    "Market Cap": "$144,810,246,845",
    "Volume": "$5,823,202,533",
    "Open": "$1,198.98",
    "Close": "$1,205.66"
  },
  {
    "Date": "2022-11-25",
    "Market Cap": "$145,091,739,838",
    "Volume": "$6,955,523,718",
    "Open": "$1,204.21",
    "Close": "$1,198.98"
  },
// ...
// ... 
]

Вы успешно реализовали парсер веб-страниц с помощью Python. Чтобы увидеть полный код, вы можете посетить этот репозиторий GitHub.

Заключение

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

Вы также можете проверить эти фреймворки для парсинга веб-страниц.

Поделиться в соцсетях