Python: основы скрапинга и парсинга
Парсинг — это распространенный способ получения данных из интернета для разного типа приложений. Практически бесконечное количество информации в сети объясняет факт существования разнообразных инструментов для ее сбора.
В процессе скрапинга компьютер отправляет запрос, в ответ на который получает HTML-документ. После этого начинается этап парсинга. Здесь уже можно сосредоточиться только на тех данных, которые нужны.
В этом материале используем такие библиотеки, как Beautiful Soup, Ixml и Requests. Разберем их.
Чтобы двигаться дальше, сначала выполните эти команды в терминале. Также рекомендуется использовать виртуальную среду, чтобы система «оставалась чистой».
pip install lxml
pip install requests
pip install beautifulsoup4
Для знакомства с процессом скрапинга можно воспользоваться сайтом https://quotes.toscrape.com/, который, похоже, был создан для этих целей.
Из него можно было бы создать, например, хранилище имен авторов, тегов или самих цитат. Но как это сделать? Сперва нужно изучить исходный код страницы. Это те данные, которые возвращаются в ответ на запрос. В современных браузерах этот код можно посмотреть, кликнув правой кнопкой на странице и нажав «Просмотр кода страницы».
На экране будет выведена сырая HTML-разметка страница. Например, такая:
….
На этом примере можно увидеть, что разметка включает массу на первый взгляд перемешенных данных. Задача веб-скрапинга — получение доступа к тем частям страницы, которые нужны. Многие разработчики используют регулярные выражения для этого, но библиотека Beautiful Soup в Python — более дружелюбный способ извлечения необходимой информации.
В PyCharm (или другой IDE) добавим новый файл для кода, который будет отвечать за парсинг.
Отрывок выше — это лишь начало кода. В первую очередь в верхней части файла выполняется импорт библиотек requests и Beautiful Soup. Затем в переменной url сохраняется адрес страницы, с которой будет поступать информация.
Эта переменная затем передается функции requests.get(). Результат присваивается переменной response. Дальше используем конструктор BeautifulSoup(), чтобы поместить текст ответа в переменную soup. В качестве формата выберем lxml. Наконец, выведем переменную.
Результат должен выглядеть приблизительно вот так.
Вот что происходит: ПО заходит на сайт, считывает данные, получает исходный код — все по аналогии с ручным подходом. Единственное отличие в том, что в этот раз достаточно лишь одного клика.
HTML — это HyperText Markup Language («язык гипертекстовой разметки»), который работает за счет распространения элементов документа со специальными тегами. В HTML есть много разнообразных тегов, но стандартный шаблон включает три основных: html, head и body. Они организовывают весь документ. В случае со скрапингом интерес представляет только тег body.
Написанный скрипт уже получает данные о разметке из указанного адреса. Дальше нужно сосредоточиться на конкретных интересующих данных.
Если в браузере воспользоваться инструментом «Inspect» (CTRL+SHIFT+I), то можно достаточно просто увидеть, какая из частей разметки отвечает за тот или иной элемент страницы. Достаточно навести мышью на определенный тег span, как он подсветит соответствующую информацию на странице. Можно увидеть, что каждая цитата относится к тегу span с классом text.
Таким образом и происходит дешифровка данных, которые требуется получить. Сперва нужно найти некий шаблон на странице, а после этого — создать код, который бы работал для него. Можете поводить мышью и увидеть, что это работает для всех элементов. Можно увидеть соотношение любой цитаты на странице с соответствующим тегом в коде.
Скрапинг же позволяет извлекать все похожие разделы HTML-документа. И это все, что нужно знать об HTML для скрапинга.
В HTML-документе хранится много информации, но благодаря Beautiful Soup проще находить нужные данные. Порой для этого требуется всего одна строка кода. Пойдем дальше и попробуем найти все теги span с классом text. Это, в свою очередь, вернет все теги. Когда нужно найти несколько одинаковых тегов, стоит использовать функцию find_all().
Копировать Скопировано Use a different Browser# scraper.py
import requests
from bs4 import BeautifulSoup
url = 'https://quotes.toscrape.com/'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
quotes = soup.find_all('span', class_='text')
print(quotes)
Этот код сработает, а переменной quotes будет присвоен список элементов span с классом text из HTML-документа. Вывод этой переменной даст следующий результат.
Возвращаемая разметка — это не совсем то, что нужно. Для получения только данных — цитат в этом случае — можно использовать свойство .text из библиотеки Beautiful Soup. Обратите внимание на код, где происходит перебор всех полученных данных с выводом только нужного содержимого.
Копировать Скопировано Use a different Browser# scraper.py
import requests
from bs4 import BeautifulSoup
url = 'https://quotes.toscrape.com/'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
quotes = soup.find_all('span', class_='text')
for quote in quotes:
print(quote.text)
Это и дает вывод, который требовался с самого начала.
Для поиска и вывода всех авторов можно использовать следующий код. Работаем по тому же принципу — сперва нужно вручную изучить страницу. Можно обратить внимание на то, что каждый автор заключен в тег с классом author. Дальше используем функцию find_all() и сохраняем результат в переменной authors. Также стоит поменять цикл, чтобы перебирать сразу и цитаты, и авторов.
Копировать Скопировано Use a different Browser# scraper.py
import requests
from bs4 import BeautifulSoup
url = 'https://quotes.toscrape.com/'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
quotes = soup.find_all('span', class_='text')
for quote in quotes:
print(quote.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
….
Наконец, добавим код получения всех тегов для каждой цитаты. Здесь уже немного сложнее, потому что сперва нужно получить каждый внешний блок каждой коллекции тегов. Если этот первый шаг не выполнить, то теги можно будет получить, но ассоциировать их с конкретной цитатой — нет.
Когда блок получен, можно опускаться ниже с помощью функции find_all для полученного подмножества. А уже дальше потребуется добавить внутренний цикл для завершения процесса.
Копировать Скопировано Use a different Browser# scraper.py
import requests
from bs4 import BeautifulSoup
url = 'https://quotes.toscrape.com/'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
quotes = soup.find_all('span', class_='text')
authors = soup.find_all('small', class_='author')
tags = soup.find_all('div', class_='tags')
for i in range(0, len(quotes)):
print(quotes[i].text)
print('—' + authors[i].text)
tagsforquote = tags[i].find_all('a', class_='tag')
for tagforquote in tagsforquote:
print(tagforquote.text)
print('
')
Этот код даст такой результат. Круто, не так ли?
“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”
—Albert Einstein
change
deep-thoughts
thinking
world
“It is our choices, Harry, that show what we truly are, far more than our abilities.”
—J.K. Rowling
abilities
choices
….
Еще один хороший ресурс для изучения скрапинга — scrapingclub.com. Там есть множество руководств по использованию инструмента Scrapy. Также имеется несколько страниц, на которых можно попрактиковаться. Начнем с этой https://scrapingclub.com/exercise/list_basic/?page=1.
Нужно просто извлечь название элемента и его цену, отобразив данные в виде списка. Шаг первый — изучить исходный код для определения HTML. Судя по всему, здесь использовался Bootstrap.
После этого должен получиться следующий код.
Копировать Скопировано Use a different Browser# shop_scraper.py
import requests
from bs4 import BeautifulSoup
url = 'https://scrapingclub.com/exercise/list_basic/?page=1'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
items = soup.find_all('div', class_='col-lg-4 col-md-6 mb-4')
for n, i in enumerate(items, start=1):
itemName = i.find('h4', class_='card-title').text.strip()
itemPrice = i.find('h5').text
print(f'{n}: {itemPrice} за {itemName}')1: $24.99 за Short Dress
2: $29.99 за Patterned Slacks
3: $49.99 за Short Chiffon Dress
4: $59.99 за Off-the-shoulder Dress
….
Ссылка выше ведет на одну страницу коллекции, включающей на самом деле несколько страниц. На это указывает page=1 в адресе. Скрипт Beautiful Soup можно настроить и так, чтобы скрапинг происходил на нескольких страницах. Вот код, который будет извлекать данные со всех связанных страниц. Когда все URL захвачены, скрипт может выполнять запросы к каждой из них и парсить результаты.
Копировать Скопировано Use a different Browser# shop_scraper.py
# версия для понимания процессов
import requests
from bs4 import BeautifulSoup
url = 'https://scrapingclub.com/exercise/list_basic/?page=1'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
items = soup.find_all('div', class_='col-lg-4 col-md-6 mb-4')
for n, i in enumerate(items, start=1):
itemName = i.find('h4', class_='card-title').text.strip()
itemPrice = i.find('h5').text
print(f'{n}: {itemPrice} за {itemName}')
pages = soup.find('ul', class_='pagination')
urls = []
links = pages.find_all('a', class_='page-link')
for link in links:
pageNum = int(link.text) if link.text.isdigit() else None
if pageNum != None:
hrefval = link.get('href')
urls.append(hrefval)
for slug in urls:
newUrl = url.replace('?page=1', slug)
response = requests.get(newUrl)
soup = BeautifulSoup(response.text, 'lxml')
items = soup.find_all('div', class_='col-lg-4 col-md-6 mb-4')
for n, i in enumerate(items, start=n):
itemName = i.find('h4', class_='card-title').text.strip()
itemPrice = i.find('h5').text
print(f'{n}: {itemPrice} за {itemName}')
Результат будет выглядеть следующим образом.
1: $24.99 за Short Dress
2: $29.99 за Patterned Slacks
3: $49.99 за Short Chiffon Dress
…
52: $6.99 за T-shirt
53: $6.99 за T-shirt
54: $49.99 за Blazer
Этот код можно оптимизировать для более продвинутых читателей:
Копировать Скопировано Use a different Browserimport requests
from bs4 import BeautifulSoup url = 'https://scrapingclub.com/exercise/list_basic/'
params = {'page': 1}
# задаем число больше номера первой страницы, для старта цикла
pages = 2
n = 1
while params['page'] for n, i in enumerate(items, start=n): itemName = i.find('h4', class_='card-title').text.strip() itemPrice = i.find('h5').
text print(f'{n}: {itemPrice} за {itemName}') # [-2] предпоследнее значение, потому что последнее «Next» last_page_num = int(soup.find_all('a', class_='page-link')[-2].
text) pages = last_page_num if pages < last_page_num else pages params['page'] += 1
Beautiful Soup — одна из немногих библиотек для скрапинга в Python. С ней очень просто начать работать. Скрипты можно использовать для сбора и компиляции данных из интернета, а результат — как для анализа данных, так и для других сценариев.
Подробно про веб парсинг в Python с примерами
Парсинг в Python – это метод извлечения большого количества данных с нескольких веб-сайтов. Термин «парсинг» относится к получению информации из другого источника (веб-страницы) и сохранению ее в локальном файле.
Например: предположим, что вы работаете над проектом под названием «Веб-сайт сравнения телефонов», где вам требуются цены на мобильные телефоны, рейтинги и названия моделей для сравнения различных мобильных телефонов.
Если вы собираете эти данные вручную, проверяя различные сайты, это займет много времени. В этом случае важную роль играет парсинг веб-страниц, когда, написав несколько строк кода, вы можете получить желаемые результаты.
Web Scrapping извлекает данные с веб-сайтов в неструктурированном формате. Это помогает собрать эти неструктурированные данные и преобразовать их в структурированную форму.
Законен ли веб-скрапинг?
Здесь возникает вопрос, является ли веб-скрапинг законным или нет. Ответ в том, что некоторые сайты разрешают это при легальном использовании. Веб-парсинг – это просто инструмент, который вы можете использовать правильно или неправильно.
Непубличные данные доступны не всем; если вы попытаетесь извлечь такие данные, это будет нарушением закона.
Есть несколько инструментов для парсинга данных с веб-сайтов, например:
- Scrapping-bot
- Scrapper API
- Octoparse
- Import.io
- Webhose.io
- Dexi.io
- Outwit
- Diffbot
- Content Grabber
- Mozenda
- Web Scrapper Chrome Extension
Почему и зачем использовать веб-парсинг?
Необработанные данные можно использовать в различных областях. Давайте посмотрим на использование веб-скрапинга:
- Динамический мониторинг цен
Широко используется для сбора данных с нескольких интернет-магазинов, сравнения цен на товары и принятия выгодных ценовых решений. Мониторинг цен с использованием данных, переданных через Интернет, дает компаниям возможность узнать о состоянии рынка и способствует динамическому ценообразованию. Это гарантирует компаниям, что они всегда превосходят других.
Web Scrapping идеально подходит для анализа рыночных тенденций. Это понимание конкретного рынка. Крупной организации требуется большой объем данных, и сбор данных обеспечивает данные с гарантированным уровнем надежности и точности.
Многие компании используют личные данные электронной почты для электронного маркетинга. Они могут ориентироваться на конкретную аудиторию для своего маркетинга.
- Новости и мониторинг контента
Один новостной цикл может создать выдающийся эффект или создать реальную угрозу для вашего бизнеса. Если ваша компания зависит от анализа новостей организации, он часто появляется в новостях.
Таким образом, парсинг веб-страниц обеспечивает оптимальное решение для мониторинга и анализа наиболее важных историй.
Новостные статьи и платформа социальных сетей могут напрямую влиять на фондовый рынок.
- Тренды в социальных сетях
Что такое веб-скрапинг и как его использовать в Python
Изучите основы веб-скрапинга и примеры его использования в Python с помощью популярных библиотек BeautifulSoup и Scrapy.
Веб-скрапинг — это процесс извлечения данных из веб-страниц путем скачивания и анализа их содержимого. В Python для этого используются различные библиотеки, такие как BeautifulSoup и Scrapy. В этой статье мы рассмотрим основы веб-скрапинга и примеры его использования на языке Python.
Зачем нужен веб-скрапинг?
Веб-скрапинг может использоваться для различных целей, таких как:
- сбор данных для анализа (например, статистика посещаемости сайтов)
- мониторинг цен на товары и услуги
- создание баз данных контента для исследований
- автоматизация рутинных задач, связанных с работой в интернете
Python-разработчик: новая работа через 9 месяцев
Получится, даже если у вас нет опыта в IT
Получить программу
Основные библиотеки для веб-скрапинга в Python
- BeautifulSoup: удобная библиотека для парсинга HTML и XML документов. Позволяет извлекать данные из веб-страницы с помощью селекторов, таких как CSS и XPath.
- Scrapy: мощный фреймворк для веб-скрапинга, который позволяет создавать и настраивать «пауков» (специальные программы для автоматического обхода и скачивания веб-страниц).
Пример веб-скрапинга с использованием BeautifulSoup
Допустим, мы хотим извлечь заголовки статей с главной страницы сайта с новостями. Вот как это может выглядеть с использованием BeautifulSoup:
import requests
from bs4 import BeautifulSoup
url = 'https://example.com/'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
for article in soup.find_all('article'):
title = article.find('h2')
print(title.text)
В этом примере мы используем requests для скачивания HTML-кода страницы, затем передаем его в BeautifulSoup для парсинга. После этого мы находим все элементы и извлекаем из них текст заголовка (элемент
).
???? Не забывайте, что структура веб-страниц может меняться, поэтому регулярно проверяйте и обновляйте свои скрипты.
Заключение
Веб-скрапинг — это мощный инструмент для работы с данными в интернете. Python предлагает множество библиотек для упрощения этого процесса, таких как BeautifulSoup и Scrapy. Начните с изучения основ и постепенно переходите к более сложным задачам, чтобы стать опытным веб-скрапером.
Парсинг сайта вместе с Python и библиотекой Beautiful Soup: простая инструкция в три шага
HTTP (HyperText Transfer Protocol, протокол передачи гипертекста) — протокол для передачи произвольных данных между клиентом и сервером. Он называется так, потому что изначально использовался для обмена гипертекстовыми документами в формате HTML.
Для того чтобы понять, как работает HTTP, надо помнить, что это клиент-серверная структура передачи данных․ Клиент, например ваш браузер, формирует запрос (request) и отправляет на сервер; на сервере запрос обрабатывается, формируется ответ (response) и передаётся обратно клиенту. В нашем примере клиент — это браузер.
Запрос состоит из трёх частей:
- Строка запроса (request line): указывается метод передачи, версия HTTP и сам URL, к которому обращается сервер.
- Заголовок (message header): само сообщение, передаваемое серверу, его параметры и дополнительная информация).
- Тело сообщения (entity body): данные, передаваемые в запросе. Это необязательная часть.
Посмотрим на простой HTTP-запрос, которым мы воспользуемся для получения прогноза погоды:
_GET /https://yandex.com.am/weather/ HTTP/1.1_
В этом запросе можно выделить три части:
- _GET — метод запроса. Метод GET позволяет получить данные с ресурса, не изменяя их.
- /https://yandex.com.am/weather/ — URL сайта, к которому мы обращаемся.
- HTTP/1.1_ — указание на версию HTTP.
Ответ на запрос также имеет три части: _HTTP/1.1 200 OK_. В начале указывается версия HTTP, цифровой код ответа и текстовое пояснение. Существующих ответов несколько десятков. Учить их не обязательно — можно воспользоваться документацией с пояснениями.
Сам HTTP-запрос может быть написан в разных форматах. Рассмотрим два самых популярных: XML и JSON.
JSON (англ. JavaScript Object Notation) — простой формат для обмена данными, созданный на основе JavaScript. При этом используется человекочитаемый текст, что делает его лёгким для понимания и написания:
({ «firstName» : «Антон», «lastName» : «Яценко»
});
Для того чтобы получить информацию в формате JSON, необходимо подготовить правильный HTTP-запрос:
var requestURL = 'test.json'; var request = new XMLHttpRequest(); request.open('GET', requestURL); request.responseType = 'json';
request.send();
В его структуре можно выделить пять логических частей:
- var requestURL — переменная с указанием на URL-адреса с необходимой информацией;
- var request = new XMLHttpRequest () — создание нового экземпляра объекта запроса из конструктора XMLHttpRequest с помощью ключевого слова new;
- request.open ('GET', requestURL) — открытие нового запроса с использованием метода GET. Обязательно указываем нашу переменную с URL-адресом;
- request.responseType = 'json' — явно обозначаем получаемый формат данных как JSON;
- request.send () — отправляем запрос на получение информации.
XML — язык разметки, который определяет набор правил для кодирования документов, записанных в текстовом формате. От JSON отличается большей сложностью — проще всего увидеть это на примере:
Антон Яценко
Чтобы получить информацию, хранящуюся на сервере как XML или HTML, потребуется воспользоваться той же библиотекой, как и в случае с JSON, но в качестве responseType следует указать Document.
var requestURL = 'test.txt'; var request = new XMLHttpRequest(); request.open('GET', requestURL); request.responseType = 'document';
request.send();
Какой из форматов лучше выбрать? Кажется, что JSON легче для восприятия. Но выбор между определённым форматом HTTP-запроса зависит и от решаемой задачи. Подробно обсудим это в будущих материалах.
А сегодня разберёмся с основами веб-скрейпинга — используем стандартные библиотеки Python и научимся работать с различными полезными инструментами.
WEB Парсинг на Python
- Писать автолайкеры, автокликеры, авточекеры, авторегеры;
- Работать с библиотекой BeautifulSoup;
- Решать и понимать как работают различные капчи;
- Собирать и обрабатывать огромное количество данных, находящихся на веб-сайтах;
- Парсить данные с динамических сайтов;
- Собирать данные с Telegram чатов, групп и публикаций;
- Собирать данные об участниках Telegram чатов, групп и публикаций;
- Производить синтаксический анализ HTML-дерева;
- В практике поработаете на тренажере по парсингу;
- У вас сформируется понимание того, как писать парсеры на Python;
- У вас будет доступ к большому количеству кода парсеров, написанных учениками курса. Это значит, что вы всегда сможете иметь под рукой шпаргалку с кодом, который поможет лучше ориентироваться;
- В модуле Selenium научитесь автоматизировать любые действия браузера;
- Узнаете, как работает асинхронность, и напишите свой асинхронный парсер.
Под скрапингом, или, как говорят в Рунете, парсингом данных, подразумевается автоматический сбор информации с последующим сохранением, обработкой и анализом.
С помощью парсеров мы можем извлекать гигабайты данных за секунды, круглосуточно и в автоматическом режиме. Овладев навыками парсинга, мы можем собирать информацию с бирж, парсить различные ресурсы, статьи и на их основе писать алгоритмы для обучения торговых ботов.
Ваши фотографии, адреса аккаунтов в социальных сетях, телефоны и другие контактные данные, при неосторожном размещении на сайтах, всегда будут подвержены угрозе парсинга.
На фриланс-биржах львиную долю заказов составляют именно предложения о написании парсеров. Освоив только на первый взгляд кажущуюся сложной профессию, вы легко сможете зарабатывать пару сотен зеленых. Согласитесь, это приятная прибавка к основной работе.
Собирая, обрабатывая и классифицируя информацию, нейронные сети учатся принимать решения за нас.
Компании могут анализировать товары, цены, наличие скидок у конкурентов и постоянно бороться за внимание покупателей получая информацию о новинках у друг друга.
Parsing — это далеко не всегда темная сторона печеньки. В моей практике часто встречаются вполне безобидные заказы, например, на парсинг отзывов или комментариев. Просто человек, который создал сайт, не желает наполнять его вручную, потому что это долго и муторно. Проще заплатить 100 долларов за готовую базу и снять с себя монотонную и рутинную работу.
Парсинг данных абсолютно законный. Возможности этого инструмента, вместе с анализом и классификацией полученных данных, по сути, просто безграничны. Спарсить можно все, нужно только знать, как. Перед вами откроется увлекательный мир информации, больших данных, глубокого обучения и нейронных сетей. Главное — не останавливаться, изучать что-то новое, постоянно двигаться вперед.
Цель этого курса:
- Познакомить вас с базовыми инструментами, которые используются для парсинга/скрапинга;
- Научить применять эти инструменты на практике;
- Показать вам функции, которые помогут спарсить любую информацию с веб-сайта;
- Во время прохождения курса у вас будет доступ к общему чату, где вы можете задать вопрос, если что-то станет непонятным;
- И многое другое.
Этот курс для людей, которые собираются изучать парсинг/скрапинг информации с веб-сайтов. Отлично подойдет людям, которые только начали изучать Python, и для тех, кто уже имеет какой-то опыт.
Парсинг отлично подходит для заработка на фриланс биржах. Быстрый анализ любой фриланс биржи покажет, что заказов хватает для всех.
Потребуются базовые знания Python, и понимание простых алогоритмов.
В курс входят лекции, тесты, решения практических задач, рецензирования задач других студентов.
Вам предстоит решить множество задач на нашем сайте тренажёре, тем самым закрепить все теоретические знания мощной практикой
Введение в веб-парсинг на Python
Сслыка на статью
Веб-скарпинг — это автоматизированный процесс сбора данных с сайта.
Интернет – является центром всей информации на Земле, к сожалению, многая информация не является правдивой. Множество дисциплин, таких как : data science, business intelligence стараются искать истинную информацию и получать из неё пользу для бизнеса.
В данном гайде мы научимся:
- — Парсить веб-сайт используя string методы и обычные выражения
- — Парсить используя HTML parser
- — Взаимодействовать с формами и другими компонентами сайта
Сбор информации с веб-сайта
Повторим ещё раз, веб-скрапинг — это автоматизированный сбор данных с сайтов. Но некоторые сайты запрещают парсить их данные при помощи того инструмента, который мы разработаем с вами в нынешнем гайде. Сайты могут запрещать парсить свои данные по след. Причинам:
- Количество запросов. Сайт может просто не справиться и затормозить.
- Важная информация.
Ваш первый Web scraper
Первый пакет, который мы используем, называется urlib. Он поможет нам работать с url. Данный модуль содержит urlopen() его нужно импортировать.
from urllib.request import urlopen
Далее присваиваем переменной url адрес в формате String.
url = «http://olympus.realpython.org/profiles/aphrodite»
Для того чтобы открыть данный сайт в python:
page = urlopen(url)
urlopen() возвращает нам объект типа HTTPResponse
>>> page
Для того чтобы прочитать объект HTTPResponse нужно воспользоваться методом .read() далее декодировать файл при помощи .decode():
>>> html_bytes = page.read()
>>> html = html_bytes.decode(«utf-8»)
Теперь вы можете вывести данные переменной, чтобы увидеть контент сайта.
print(html)
Name: Aphrodite
Favorite animal: Dove
Favorite color: Red
Hometown: Mount Olympus
И когда у вас есть HTML как текст, вы можете извлечь информацию из него разными способами.
Извлекаем файлы из HTML методами String объекта
Одним из методов извлечения информации HTML файла могут быть string методы. Например, .find() для поиска через текст .
.fing() возвращает индекс первого входа нужного нам символа/тега. Покажем на примере «» методом .find().
>>> title_index = html.find(«»)
>>> title_index
14
Для того чтобы найти начало заголовка нам нужно к индексу добавить длину тега «».
>>> start_index = title_index + len(«»)
>>> start_index
21
Также можем найти место где заканчивается «»:
>>> end_index = html.find(«»)
>>> end_index
39
Наконец, мы можем извлечь всё что находится в «», зная первый и последний индекс:
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
На самом деле, HTML файл может быть намного менее предсказуемым, чем на Aphrodite странице. Поэтому далее мы вам покажем другой способ, который может решить эту задачу.
Регулярные выражения
Регулярные выражения — это паттерны, которые используются для поиска внутри текста типа string. Для этого нам нужна библиотека re.
Мы импортируем модуль re.
>>> import re
Регулярные выражения используют специальные метасимволы для определения разных паттернов. Например символ «*» разрешает вводить любые символы после себя.
Покажем на примере .findall() мы будем искать все совпадения с требуемым для нас выражением (первый элемент — то что мы ищем, второй — в каком тексте).
>>> re.findall(«ab*c», «ac»)
['ac']
Используя параметр re.IGNORECASE позволяет методу не учитывать регистр.
>>> re.findall(«ab*c», «ABC»)
[]
>>> re.findall(«ab*c», «ABC», re.IGNORECASE)
['ABC']
Метод .replace() — заменяет все символы в тексте на требуемые нам символы.
Метод .sub() — «» для замены всего что находится между < и >.
Давайте взглянем ближе на регулярные выражения:
- — отмечает открытие тега «title»
- *? — отмечает весь текст после открытие тега «»
- — отмечает элемент, который закрывает тег.
HTML парсер на Python
Ладно, хватит играться и развлекаться пора использовать серьёзные вещи для парсинг. К нашему счастью, в библиотеках Python есть множество инструментов, которые созданы для разных задач. Для парсинга нам подойдет Beautiful soup.
Скачиваем Beautiful soup
Воспользуемся терминалом:
$ python3 -m pip install beautifulsoup4
Теперь, вернёмся в едитор.
Создание объекта типа BeautifulSoup
from bs4 import BeautifulSoup
from urllib.request import urlopen
url = «http://olympus.realpython.org/profiles/dionysus»
page = urlopen(url)
html = page.read().decode(«utf-8»)
soup = BeautifulSoup(html, «html.parser»)
Наша программа совершит 3 действия:
- Откроет URL
- Прочитает элементы и переведёт их в String
- Присвоит это объекту типа BeautifulSoup
При создании переменной «soup» мы передаём два аргумента, первый это сайт, который мы парсим, второй — какой парсер использовать.
Использование объекта BeautifulSoup. Методы:
.get_text()
>>> print(soup.get_text())
Profile: Dionysus
Name: Dionysus
Hometown: Mount Olympus
Favorite animal: Leopard
Favorite Color: Wine
Как можно заметить, есть много пустых строк, это результат появления символов новой строки в тексте HTML. Их можно убрать используя метод .replace() .
.find()
Если вам нужно что то найти, используйте .find()
>>> soup.find_all(«img»)
[, ]
Данная команда возвращает все теги .
Tag
Каждый объект становится тегом, поэтому можно использовать методы.
.name
>>> image1.name
'img'
- Даст нам имя переменной
- [«src»]
- Этот метод даст нам путь к файлу, например:
>>> image1[«src»]
'/static/dionysus.jpg'
>>> image2[«src»]
'/static/grapes.png'
.title
Можем увидеть что находится в заголовке
>>> soup.title
Profile: Dionysus
.string
Этот метод убирает теги, покажем на примере title:
>>> soup.title.string
'Profile: Dionysus'
Взаимодействие с HTML формами
Библиотека urllib идеально подходит для сбора информации с сайта, но иногда нам приходится взаимодействовать с сайтом, заполнять формы, нажать на кнопку. В этом нам поможет модуль MechanicalSoup.
Устанавливаем модуль
$ python3 -m pip install MechanicalSoup
Создаём объект типа Browser
>>> import mechanicalsoup
>>> browser = mechanicalsoup.Browser()
Можем запросить url
>>> url = «http://olympus.realpython.org/login»
>>> page = browser.get(url)
Если мы проверим «page» , то нам вернётся 200 — это значит что с сайтом всё в порядке. Если вернётся 404 или 500, то есть ошибка со стороны сайта/сервера.
.soup
Показывает нам структуру HTML
>>> page.soup
Please log in to access Mount Olympus:
Username:
Password:
Взаимодействие с сайтом в реальном времени
Иногда, нужно получать информацию с сайта в реальном времени. К примеру, нажимать кнопку «Обновить», что не было самым приятным, но теперь всё изменилось.
Теперь мы можем использовать .get() объекта Browser.
Во-первых, нужно определить какой элемент требует обновления, скорее всего нужно просто найти id.
4
Давайте на примере разберёмся.
import mechanicalsoup
browser = mechanicalsoup.Browser()
page = browser.get(«http://olympus.realpython.org/dice»)
tag = page.soup.select(«#result»)[0]
result = tag.text
print(f»The result of your dice roll is: {result}»)
В этом примере, метод .select() ищет элемент с id=result(#result) .
Прежде всего, советуем установить промежуток, чтобы сайт успевал перезагружаться. Используйте time.sleep(5) — 5 секунд.
Полный вариант:
import time
import mechanicalsoup
browser = mechanicalsoup.Browser()
for i in range(4):
page = browser.get(«http://olympus.realpython.org/dice»)
tag = page.soup.select(«#result»)[0]
result = tag.text
print(f»The result of your dice roll is: {result}»)
time.sleep(10)
Когда вы запустите программу, вы сразу увидите первый результат, который будет выведен на консоль. Далее будет перерыв в 10 секунд и всё повторится.
После 4 циклов программа остановится.
Используя такую технику, вы сможете собирать данные сайта в реальном времени, но будьте осторожны, слишком частые запросы буду подозрительны для сайта. Иначе ваш ip будет заблокирован и не будет возможности зайти на него.
Так же возможно сломать сервер, на котором хостится сайт, поэтому советуем читать «Правила пользования» (Terms of use)
Заключение
Python уникальный инструмент для множества задач. В данном уроке мы научились собирать информацию с сайта и переводить его в текст.
Только не забывайте, не все хотят делиться информацией в интернете. Всегда читайте Правила пользования, уважайте других контент-мейкеров.