You are currently viewing Реализация веб-скребка на Python с помощью BeautifulSoup

Реализация веб-скребка на Python с помощью BeautifulSoup

Существует в основном два способа извлечения данных с веб — сайта:

  • Используйте API веб-сайта (если он существует). Например, у Facebook есть API Facebook Graph, который позволяет извлекать данные, размещенные на Facebook.
  • Получите доступ к HTML-коду веб-страницы и извлеките из нее полезную информацию/данные. Этот метод называется очисткой веб-страниц, сбором веб-данных или извлечением веб-данных.

В этой статье рассматриваются шаги, связанные с веб-очисткой, с использованием реализации фреймворка веб-очистки Python под названием Beautiful Soup.

Шаги, связанные с очисткой веб — страниц:

  1. Отправьте HTTP-запрос на URL-адрес веб-страницы, к которой вы хотите получить доступ. Сервер отвечает на запрос, возвращая HTML-содержимое веб-страницы. Для этой задачи мы будем использовать стороннюю HTTP-библиотеку для python-запросов.
  2. Как только мы получили доступ к содержимому HTML, перед нами остается задача анализа данных. Поскольку большая часть данных HTML вложена, мы не можем извлекать данные просто путем обработки строк. Нужен синтаксический анализатор, который может создавать вложенную/древовидную структуру HTML-данных. Существует множество доступных библиотек синтаксического анализа HTML, но самая продвинутая из них-html5lib.
  3. Теперь все, что нам нужно сделать, это перейти и выполнить поиск по дереву синтаксического анализа, которое мы создали, т. Е. Обойти дерево. Для этой задачи мы будем использовать другую стороннюю библиотеку python, Beautiful Soup. Это библиотека Python для извлечения данных из HTML-и XML-файлов.

Шаг 1. Установка необходимых сторонних библиотек

  • Самый простой способ установить внешние библиотеки в python-использовать pip. pip-это система управления пакетами, используемая для установки и управления программными пакетами, написанными на Python.
    Все, что вам нужно сделать, это:
pip install requests
pip install html5lib
pip install bs4
  • Другой способ-загрузить их вручную по этим ссылкам:

Шаг 2: Доступ к HTML-контенту с веб-страницы

import requests
URL = "https://www.programbox.org/data-structures/"
r = requests.get(URL)
print(r.content)

Давайте попробуем разобраться в этом фрагменте кода.

  • Прежде всего импортируйте библиотеку запросов.
  • Затем укажите URL-адрес веб-страницы, которую вы хотите очистить.
  • Отправьте HTTP-запрос по указанному URL-адресу и сохраните ответ с сервера в объекте ответа под названием r.
  • Теперь, как распечатать r.содержимое, чтобы получить необработанный HTML-контент веб-страницы. Он имеет тип » строка’.

Шаг 3: Анализ HTML-содержимого

#This will not run on online IDE
import requests
from bs4 import BeautifulSoup

URL = "http://www.values.com/inspirational-quotes"
r = requests.get(URL)

soup = BeautifulSoup(r.content, 'html5lib') # If this line causes an error, run 'pip install html5lib' or install html5lib
print(soup.prettify())

Действительно хорошая вещь в библиотеке BeautifulSoup заключается в том, что она построена на основе библиотек синтаксического анализа HTML, таких как html5lib, lxml, html.parser и т. д. Таким образом, объект BeautifulSoup и указание библиотеки синтаксического анализатора могут быть созданы одновременно.

В приведенном выше примере:

soup = BeautifulSoup(r.content, 'html5lib')

Мы создаем объект BeautifulSoup, передавая два аргумента:

  • r.content: Это необработанный HTML-контент.
  • html5lib: Указание синтаксического анализатора HTML, который мы хотим использовать.

Сейчас soup.prettify() печатается,это дает визуальное представление дерева синтаксического анализа, созданного из исходного HTML-содержимого.

Шаг 4: Поиск и навигация по дереву синтаксического анализа

Теперь мы хотели бы извлечь некоторые полезные данные из HTML-содержимого. Объект soup содержит все данные во вложенной структуре, которые могут быть извлечены программным способом. В нашем примере мы очищаем веб-страницу, состоящую из нескольких цитат. Итак, мы хотели бы создать программу для сохранения этих цитат (и всей соответствующей информации о них).

#Python program to scrape website
#and save quotes from website
import requests
from bs4 import BeautifulSoup
import csv

URL = "http://www.values.com/inspirational-quotes"
r = requests.get(URL)

soup = BeautifulSoup(r.content, 'html5lib')

quotes=[] # a list to store quotes

table = soup.find('div', attrs = {'id':'all_quotes'})

for row in table.findAll('div',
						attrs = {'class':'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'}):
	quote = {}
	quote['theme'] = row.h5.text
	quote['url'] = row.a['href']
	quote['img'] = row.img['src']
	quote['lines'] = row.img['alt'].split(" #")[0]
	quote['author'] = row.img['alt'].split(" #")[1]
	quotes.append(quote)

filename = 'inspirational_quotes.csv'
with open(filename, 'w', newline='') as f:
	w = csv.DictWriter(f,['theme','url','img','lines','author'])
	w.writeheader()
	for quote in quotes:
		w.writerow(quote)

Прежде чем двигаться дальше, мы рекомендуем вам просмотреть HTML-содержимое веб-страницы, которую мы напечатали с помощью метода soup.prettify (), и попытаться найти шаблон или способ перехода к цитатам.

  • Следует отметить, что все кавычки находятся внутри контейнера div, идентификатор которого «all_quotes». Итак, мы находим этот элемент div (называемый таблицей в приведенном выше коде), используя метод find():
table = soup.find('div', attrs = {'id':'all_quotes'}) 

Первый аргумент-это HTML-тег, который вы хотите найти, а второй аргумент-элемент типа словаря, чтобы указать дополнительные атрибуты, связанные с этим тегом. метод find() метод возвращает первый совпадающий элемент. Вы можете попробовать распечатать table.prettify(), чтобы получить представление о том, что делает этот фрагмент кода.

  • Теперь в элементе таблицы можно заметить, что каждая цитата находится внутри контейнера div, класс которого-quote. Итак, мы перебираем каждый контейнер div, класс которого является quote. Здесь мы используем метод findAll (), который аналогичен методу find с точки зрения аргументов, но возвращает список всех совпадающих элементов. Каждая цитата теперь повторяется с использованием переменной, называемой row.

Вот один пример HTML-содержимого строки для лучшего понимания:

Теперь рассмотрим этот фрагмент кода:

for row in table.find_all_next('div', attrs = {'class': 'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'}):
    quote = {}
    quote['theme'] = row.h5.text
    quote['url'] = row.a['href']
    quote['img'] = row.img['src']
    quote['lines'] = row.img['alt'].split(" #")[0]
    quote['author'] = row.img['alt'].split(" #")[1]
    quotes.append(quote)

Мы создаем словарь, чтобы сохранить всю информацию о цитате. К вложенной структуре можно получить доступ, используя точечную нотацию. Для доступа к тексту внутри HTML-элемента мы используем .text :

quote['theme'] = row.h5.text

Наконец, все цитаты добавляются в список под названием quotes.

  • Наконец, мы хотели бы сохранить все наши данные в каком-нибудь CSV-файле.
filename = 'inspirational_quotes.csv'
with open(filename, 'w', newline='') as f:
    w = csv.DictWriter(f,['theme','url','img','lines','author'])
    w.writeheader()
    for quote in quotes:
        w.writerow(quote)

Здесь мы создаем CSV-файл под названием inspirational_quotes.csv и сохраняем в нем все цитаты для дальнейшего использования.

Итак, это был простой пример того, как создать веб-скребок в Python. Отсюда вы можете попытаться удалить любой другой веб-сайт по вашему выбору.