• Главная
  • Блог
  • Парсер с помощью python примеры scraping html страницы используя requests и selenium.

Парсер с помощью python примеры scraping html страницы используя requests и selenium.

Веб-парсинг – важный метод, который часто используется в самых разных контекстах. Python в значительной степени считается языком для веб-парсинга. С помощью Python вы можете создать простой скрипт парсинга примерно за 15 минут и менее чем за 100 строк кода. Таким образом, вне зависимости от использования, web-scraping – это навык, которым должен владеть каждый программист Python.

Прежде чем приступить к практическому применению, нам нужно сделать шаг назад и подумать, что такое веб-скрапинг, когда его следует использовать, а когда следует избегать.

Как вы уже знаете, веб-парсинг – это метод, используемый для автоматического извлечения данных с веб-сайтов. Важно понимать, что это довольно грубый метод извлечения данных из различных источников, обычно веб-страниц. Если разработчики веб-сайта достаточно щедры, чтобы предоставить API для извлечения данных, это был бы гораздо более стабильный и надежный способ доступа к данным.

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

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

Мы можем понимать веб-парсинг как конвейер, содержащий 3 компонента:
Загрузка: загрузка веб-страницы в формате HTML.
Разбор: разбор HTML и получение интересующих нас данных.
Хранение: сохранение полученных данных на нашем локальном компьютере в определенном формате.
Скачивание HTML

Это кажется логичным, что для извлечения каких-либо данных с веб-страницы мы сначала должны их загрузить. Есть два способа сделать это:

1. Использование библиотек автоматизации браузера.

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

Однако у этого метода есть огромный недостаток – он значительно медленнее. Причина в накладных расходах на запуск браузера и рендеринг HTML в браузере. Этот метод следует использовать только в исключительных случаях – когда контент, который мы хотим очистить, использует код JavaScript в браузере или требует, чтобы мы нажимали кнопки и ссылки для доступа к данным, что Selenium может сделать за нас.

2. Использование HTTP-библиотек.

Библиотеки HTTP, такие как модуль запросов или Urllib, позволяют отправлять HTTP-запросы, минуя необходимость открывать любой браузер, в отличие от первого метода. Всегда следует отдавать предпочтение этому методу, так как он намного быстрее, чем Selenium.

Теперь позвольте мне показать вам, как мы можем достичь этого компонента конвейера с помощью библиотек Selenium и Requests.
Использование requests

Установите модуль requests со следующим:
$ pip install requests

И теперь вы можете использовать это в своем коде, например:
import requests
result = requests.get('quotes.toscrape/')
page = result.text

Здесь выполняется HTTP-запрос GET на URL-адрес, который почти синонимичен загрузке веб-страницы. Затем мы можем получить исходный HTML-код страницы, обратившись к объекту результата, возвращаемому методом requests.get().
Использование selenium

Вы можете установить модуль selenium через pip:
$ pip install selenium
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('quotes.toscrape/')
page = driver.page_source

Здесь мы сначала начнем с создания объекта webdriver, который представляет браузер. Это откроет браузер Chrome на компьютере, на котором запущен код. Затем, вызвав метод get объекта webdriver, мы можем открыть наш URL. И, наконец, мы получаем исходный код, обращаясь к свойству page_source объекта webdriver.

В обоих случаях HTML-источник URL-адреса сохраняется в переменной страницы в виде строки.
Анализ HTML и извлечение данных

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

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

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

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

Для этого в Chrome откройте веб-страницу, затем щелкните правой кнопкой мыши данные, которые вы хотите очистить, и выберите «Проверить». В Firefox эта опция называется «Исследовать» или Inspect.

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

Как вы можете понять после небольшого изучения, каждая цитата содержится в div с атрибутом class = «quote». Внутри этого div текст цитаты находится в диапазоне с class = «text», а имя автора находится в небольшом теге с class = «author». Эта информация потребуется, когда мы фактически приступим к синтаксическому анализу HTML и извлечению наших данных.

Теперь приступим к синтаксическому анализу HTML-страницы с помощью BeautifulSoup. Но сначала мы должны его установить:
$ pip install beautifulsoup4

После установки вы можете вызвать его в своем коде следующим образом:
from bs4 import BeautifulSoup
soup = BeautifulSoup(page, 'html.parser')

Прежде всего, мы создаем проанализированную версию страницы, передав ее конструктору класса BeautifulSoup. Как видите, мы также передаем конструктору второй аргумент, html.parser. Это имя парсера, который Beautiful Soup будет использовать для анализа строки, которую вы ему передали. Вы также могли использовать синтаксический анализатор lxml, о котором мы ранее говорили, учитывая, что у вас установлена библиотека Lxml.
quotes = soup.find_all('div', class_='quote')

Затем мы извлекаем все теги div на странице, содержащие class = «quote», поскольку мы знаем, что это div, содержащие кавычки. Для этого Beautiful Soup 4 предлагает функцию find_all. Мы передали имя тега и имя класса функции find_all, и она вернула все теги, удовлетворяющие условиям, то есть теги, содержащие наши кавычки.

Здесь важно отметить, что мы работаем с древовидной структурой. Переменная soup, а также каждый элемент кавычек. В некотором смысле элементы кавычек являются частями более крупного дерева.
scraped = []
for quote in quotes:
text = quote.find('span', class_='text').text
author = quote.find('small', class_='author').text
scraped.append([text, author])

Мы знаем, что текст цитаты находится в теге span с class = «text», а автор находится в небольшом теге с class = «author». Чтобы извлечь их из элементов цитаты, мы снова используем аналогичную функцию find.  Она принимает те же аргументы, что и функция find_all. Единственное отличие состоит в том, что она возвращает первый тег, удовлетворяющий условиям, тогда как find_all вернет список тегов. Кроме того, мы хотим получить доступ к свойству text возвращаемого объекта, которое содержит текст, заключенный в этот тег.

Итак, как вы можете видеть в коде, мы перебираем все элементы цитат списка и извлекаем текст цитаты и имя автора, сохраняя их в виде списка списков с извлеченным именем. Полученный список при печати на консоли выглядит следующим образом:
[['“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”',
'Albert Einstein'],
['“It is our choices, Harry, that show what we truly are, far more than our abilities.”',
'J.K. Rowling'],
['“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”',
'Albert Einstein'],
['“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”',
'Jane Austen'],
[""“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”"",
'Marilyn Monroe'],
['“Try not to become a man of success. Rather become a man of value.”',
'Albert Einstein'],
['“It is better to be hated for what you are than to be loved for what you are not.”',
'André Gide'],
[""“I have not failed. I've just found 10,000 ways that won't work.”"",
'Thomas A. Edison'],
[""“A woman is like a tea bag; you never know how strong it is until it's in hot water.”"",
'Eleanor Roosevelt'],
['“A day without sunshine is like, you know, night.”',
'Steve Martin']]
Хранение полученных данных

Как только мы получили данные, мы можем сохранить их в любом желаемом формате, например, в файле CSV, базе данных SQL или базе данных NoSQL.

Я бы сказал, что наиболее популярным способом хранения очищенных данных является их хранение в виде таблиц CSV, поэтому я очень кратко покажу вам, как это сделать. Я не буду вдаваться в подробности, для этого вам следует обратиться к официальной документации Python. Итак, без лишних слов, давайте перейдем к коду.
import csv
with open('quotes.csv', 'w') as csv_file:
writer = csv.writer(csv_file, delimiter=',')
for quote in scraped:
writer.writerow(quote)

Как мы видим, код довольно понятен. Мы создаем объект записи CSV из открытого файла quotes.csv, а затем записываем кавычки одну за другой с помощью функции writerow. Очевидно, что функция принимает список в качестве входных данных и затем записывает его в CSV в виде строки.

Читайте также
Получение списка файлов в каталоге и подкаталогах в Python
Замена одного или нескольких значений в столбце в DataFrame Pandas
Как отсортировать список в Python

Оставить комментарий Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *


Имя *

Email *

Сохранить моё имя, email и адрес сайта в этом браузере для последующих моих комментариев.


Нужен парсинг данных?

Собираем открытые данные с любых веб-сайтов: цены, названия, артикулы, описания, свойства, категории, фото, отзывы, ссылки, тел.номера, e-mail и многое другое.

Написать
img