Мой друг, ты хочешь открыть для себя мир данных в Интернете? Вы хотите извлекать и анализировать данные с веб-сайтов для своих исследований, бизнеса или побочных проектов?
Если да, то позвольте мне познакомить вас с волшебным миром соскоб – автоматическое извлечение информации с веб-сайтов.
Парсинг веб-страниц может показаться сложным, но для этого не обязательно использовать правильные инструменты. В этом подробном руководстве я предоставлю вам все знания, которые помогут вам стать профессиональным парсером веб-страниц, используя две самые мощные библиотеки Python для парсинга веб-страниц — Красивый суп и Запросы.
Вот что я расскажу:
- Почему парсинг веб-страниц так чертовски полезен
- Как на самом деле работает парсинг веб-страниц
- Установка и отправка запросов с помощью Python Requests
- Парсинг HTML-страниц с помощью Beautiful Soup
- Создание полноценного парсера шаг за шагом
- Советы, рекомендации и рекомендации
- Этические соображения относительно ответственного парсинга веб-страниц
Давайте поскребём!
Почему парсинг веб-страниц чертовски полезен
По Аналитическая компания Gartner, к 75 году более 2024% всех организаций внедрит какое-либо решение для интеграции данных, такое как парсинг веб-страниц. Почему парсинг веб-страниц стал таким популярным?
Вот некоторые из ключевых случаев использования:
Мониторинг цен – Отслеживайте цены на продукты, акции и т. д. на сайтах электронной торговли. Полезно для финансового анализа.
Лидогенерация – Создавайте базы данных деловых контактов из каталогов и списков сайтов. Отлично подходит для отделов продаж и маркетинга.
В исследовании – Сбор данных с информационных сайтов и страниц. Помогает исследователям, журналистам и аналитикам автоматизировать сбор данных.
мониторинг – Проверяйте веб-сайты и страницы на предмет изменений с течением времени. Полезно для SEO и мониторинга безопасности.
Машинное обучение – Собирать и извлекать большие наборы обучающих данных для моделей машинного обучения.
Веб-скрапинг позволяет собирать бесконечные объемы общедоступных данных из Интернета, которые затем можно структурировать, анализировать и вводить в модели или приложения. Это дает вам возможность создавать крутые вещи!
По Стацита, более 50% всех собранных данных используется для бизнес-аналитики, 15% — для привлечения потенциальных клиентов и 10% — для исследований по мониторингу цен. Приложения бесконечны.
Теперь, когда вы знаете, почему парсинг веб-страниц так полезен в разных отраслях, давайте посмотрим, как он на самом деле работает.
Вот как на самом деле работает парсинг веб-страниц
Вкратце, вот обычные шаги для проекта парсинга веб-страниц:
Определите свою цель – Какие веб-сайты вы хотите парсить и какие данные необходимо извлечь?
Проанализируйте структуру – Просмотрите страницы, чтобы определить, как извлечь необходимые данные.
Напишите парсер – Скрипт для запроса страниц и анализа HTML для извлечения данных.
Хранить данные – Сохраните очищенные данные в базе данных или файле для последующего использования.
Повторяйте и уточняйте – Улучшите парсер для обработки большего количества страниц, ошибок и крайних случаев.
Веб-скраперы автоматизируют процесс извлечения данных. Но как они работают под капотом? Вот что происходит:
Скребок отправляет HTTP-запросы на целевой веб-сайт для загрузки веб-страниц.
Веб-сайт отвечает HTML страницы, содержащие данные.
Скребок анализирует HTML используя парсер, такой как Beautiful Soup.
It извлекает необходимые данные использование селекторов CSS, регулярных выражений и т. д.
Наконец, данные структурировано и хранится в базе данных, JSON, CSV и т. д.
Теперь давайте посмотрим на две самые популярные и мощные библиотеки Python, которые упрощают реализацию надежных веб-скраперов — Requests и Beautiful Soup.
Знакомьтесь с запросами Python — самый простой способ создания HTTP-запросов
Запросы — это элегантная библиотека Python, которая устраняет всю сложность создания HTTP-запросов для взаимодействия с веб-серверами.
Он абстрагирует все мельчайшие детали обработки:
- URL-адреса
- HTTP-методы (GET, POST, PUT, DELETE и т. д.)
- Параметры кодирования
- Обработка содержимого ответа
- Cookie
- Аутентификация
- И многое другое!
Использование запросов невероятно просто. Чтобы получить веб-страницу, просто import requests
а также:
response = requests.get(‘http://example.com‘)
print(response.text) # Print response content
Он может отправлять POST-запросы так же легко:
data = {‘key‘: ‘value‘}
response = requests.post(‘http://example.com‘, data=data)
Некоторые ключевые особенности, которые делают запросы бесценными:
Поддерживает все методы HTTP: GET, POST, PUT, DELETE, HEAD и т. д.
Автоматическое кодирование параметров и URL-адресов
Встроенный пул соединений и TCP Keep-Alive.
Поддерживает HTTP, SOCKS, SSL-прокси
Автоматический анализ заголовков ответов
Настройки тайм-аута и автоматические повторные попытки
Потоковая загрузка больших файлов
Отличная экосистема сторонних расширений
Независимо от того, являетесь ли вы экспертом или новичком, Requests избавит вас от необходимости использовать HTTP в Python. Теперь давайте посмотрим на обработку и анализ HTML-страниц, которые мы получаем.
Анализируйте HTML-страницы как профессионал с помощью Python Beautiful Soup
Итак, Requests упрощает программную загрузку веб-страниц. Но как нам извлечь конкретные данные, которые нам нужны, из HTML-контента?
Вот где красиво оформленный Красивый суп приходит библиотека.
Beautiful Soup специализируется на анализе запутанных, сложных документов HTML/XML и предоставляет простые способы навигации и поиска по анализируемому содержимому.
Он автоматически обрабатывает плохо отформатированный код, преобразует его в анализируемую структуру и позволяет осуществлять поиск с помощью таких методов, как:
find()
– Найти отдельный элемент по селектору или атрибуту CSS.find_all()
– Найдите все совпадающие элементы.select()
– Поддержка селектора CSS для поиска элементовget_text()
– Извлечь текст внутри элемента
Рассмотрим этот беспорядочный HTML:
<html>
<body>
<div>
<p>Hello World</p>
</div>
</body>
</html>
Мы можем легко извлечь <p>
текст, несмотря на неверный HTML:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, ‘html.parser‘)
text = soup.find(‘div‘).p.get_text() # Returns "Hello World"
Beautiful Soup автоматически выполняет весь анализ и предоставляет дружественный интерфейс.
Еще несколько интересных функций:
Интегрируется с такими парсерами, как
html.parser
,lxml
,html5lib
Перемещайтесь по дереву разбора, используя
.next_sibling
,.parent
, и т.д.Поиск с использованием селекторов CSS, например
select()
Уточнение HTML и просмотр дерева синтаксического анализа
Преобразование документов в Юникод и наоборот
Обширная документация и поддержка сообщества
Между запросами на получение HTML-страницы и Beautiful Soup для ее анализа у вас есть идеальная комбинация для извлечения данных с любого веб-сайта. Теперь давайте посмотрим, как все это объединится, построив скребок.
Парсинг веб-страниц в действии: создание парсера для продуктов электронной коммерции
Теперь, когда мы понимаем основы, давайте проверим наши навыки парсинга веб-страниц, разработав сценарий для парсинга списков продуктов с веб-сайта электронной коммерции.
Вот шаги, которые мы выполним:
- Определите целевой сайт и данные для парсинга
- Анализировать HTML-структуру сайта
- Используйте запросы для загрузки страниц
- Разбор страниц с помощью BeautifulSoup
- Извлеките данные о продукте в файл CSV.
- Обработка нумерации страниц
Давайте начнем!
Выбор веб-сайта и данных для парсинга
В этом примере мы возьмем каталог из Books.toscrape.com, демонстрационный сайт книжного магазина.
Наша цель – извлечь:
- Название продукта
- Цена
- Рейтинг
- URL изображения
И сохраните эти данные в файл CSV для последующего анализа. Давайте проверим структуру страницы.
Анализ структуры страницы с помощью Chrome DevTools
Просматривая исходный код страницы или Chrome DevTools, мы видим, что нужные нам данные о продукте содержатся в таких элементах HTML, как:
<img class="thumbnail" src="../media/cache/2c/da/2cdad67c44b002e7ead0cc35693c0e8b.jpg">
<p class="price_color">£51.77</p>
<p class="instock availability">
<i class="icon-ok"></i>In stock
</p>
<p>
<i class="icon-star"></i>
<i class="icon-star"></i>
<i class="icon-star"></i>
<i class="icon-star"></i>
<i class="icon-star"></i>
</p>
Мы можем использовать идентификаторы элементов, классы и селекторы CSS для таргетинга данных.
Получение страниц с помощью запросов Python
Давайте получим страницы с помощью Requests. Хорошо:
- Определите начальный URL
- Получите его с помощью
GET
запросить - Сохраните содержимое ответа
import requests
url = ‘https://books.toscrape.com/catalogue/page-1.html‘
response = requests.get(url)
page_html = response.text
Достаточно легко! Запросы автоматически кодируют для нас URL и параметры.
Анализ HTML-страницы с помощью Beautiful Soup
Теперь мы можем проанализировать HTML-код страницы с помощью Beautiful Soup:
from bs4 import BeautifulSoup
soup = BeautifulSoup(page_html, ‘html.parser‘)
Это анализирует содержимое HTML с помощью встроенного html.parser
. Мы готовы извлечь данные!
Извлечение данных о продукте с помощью селекторов CSS
Основываясь на предыдущем анализе структуры HTML, мы можем использовать селекторы CSS для выделения элементов и извлечения текста:
# Extract product info
title = soup.select_one(‘h1‘).text
price = soup.select_one(‘.price_color‘).text
rating = soup.select_one(‘.star-rating‘)[‘class‘]
image = soup.select_one(‘.thumbnail‘)[‘src‘]
print(title, price, rating, image)
Beautiful Soup упрощает извлечение вложенных данных с помощью select()
, select_one()
и другие методы!
Сохранение очищенных данных в CSV
Давайте соберем все это вместе и пройдемся по продуктам на странице. Мы будем:
- Извлеките данные из каждого продукта в словарь
- Запишите каждый продукт в строку в
products.csv
import requests
from bs4 import BeautifulSoup
import csv
url = ‘http://books.toscrape.com/catalogue/page-1.html‘
products = [] # List to store products
# Download page
response = requests.get(url)
soup = BeautifulSoup(response.text, ‘html.parser‘)
# Extract all products on page
product_list = soup.find_all(‘article‘, {‘class‘: ‘product_pod‘})
for product in product_list:
title = product.find(‘h3‘).find(‘a‘)[‘title‘]
price = product.select_one(‘.price_color‘).text
rating = product.select_one(‘.star-rating‘)[‘class‘]
image = product.select_one(‘img‘)[‘src‘]
product = {
‘title‘: title,
‘price‘: price,
‘rating‘: rating,
‘image‘: image
}
products.append(product)
# Write CSV file
with open(‘products.csv‘, ‘w‘) as outfile:
writer = csv.writer(outfile)
writer.writerow([‘title‘, ‘price‘, ‘rating‘, ‘image‘]) # Header row
for product in products:
writer.writerow(list(product.values()))
Наш скрипт извлекает данные о продукте в словарь и записывает каждый продукт в новую строку в словаре. products.csv
- Миссия выполнена!
Но пока мы очистили только одну страницу. Далее давайте займемся нумерацией страниц…
Обработка нумерации страниц
Чтобы парсить несколько страниц, нам нужно:
- Проверьте, есть ли следующая страница
- Если да, перейдите по ссылке на следующей странице.
- Продолжайте очищать до последней страницы
Многие сайты используют ?page={number}
или есть rel="next"
ссылки для управления нумерацией страниц.
Мы можем улучшить наш парсер, чтобы он мог легко обрабатывать каталоги с нумерацией страниц:
url = ‘https://books.toscrape.com/catalogue/page-1.html‘
while True:
# Scrape current page
# ...
# Check for next page
next_page = soup.find(‘a‘, {‘rel‘: ‘next‘})
if next_page:
url = next_page[‘href‘]
continue
else:
break
print(‘Scraping complete!‘)
Это циклично проходит по всем страницам, следуя rel=‘next‘
ссылки, пока ни одной не останется!
И благодаря этому мы создали полноценный парсер для извлечения данных с разбивкой на страницы и экспорта их в CSV для дальнейшего анализа!
Не так уж плохо для новичка, не так ли? Давайте подведем итог тому, что мы узнали на данный момент:
- Запросы упрощает отправку HTTP-запросов
- Красивый суп анализирует HTML и позволяет осуществлять поиск в DOM
- Мы можем идентифицировать данные, используя Chrome DevTools
- Извлеките данные с помощью CSS селекторы и атрибуты элемента
- Хранить очищенные данные в CSV/JSON Форматы
Эти основные концепции обеспечивают основу для создания надежных сканеров. Теперь давайте посмотрим на некоторые профессиональные советы и лучшие практики.
Советы и рекомендации, которые помогут улучшить ваши навыки парсинга веб-страниц
Вот несколько полезных советов, которые я усвоил за годы работы по парсингу веб-страниц следующего уровня:
Используйте планировщик, например Celery
Хорошей практикой является запуск парсеров по расписанию (скажем, ежедневно), а не постоянно. Celery позволяет автоматизировать парсеры через фиксированные промежутки времени или по произвольному расписанию.
Реализация регулирования и повторных попыток
Уменьшите скорость скребка, используя time.sleep()
чтобы избежать перегруженности сайтов. Также повторите неудачные запросы, используя экспоненциальную отсрочку.
Используйте прокси-сервис, например BrightData
Ротация прокси помогает распределять запросы по IP-адресам и избегать блокировки. Такие сервисы, как BrightData, предлагают доступные домашние прокси, лучше всего подходящие для парсинга веб-страниц.
Случайный выбор пользовательских агентов
Используйте случайный пользовательский агент для каждого запроса, чтобы имитировать посещение сайта различными устройствами. Это помогает избежать обнаружения ботов.
Кэш загруженных страниц
Сохраняйте уже очищенные страницы в локальном кеше, чтобы избежать повторных загрузок. Redis отлично работает как кеш запросов Python.
Выберите надежный парсер, например lxml.
В то время как html.parser
работает, промышленный парсер типа lxml
обеспечивает лучшую скорость и точность при анализе сложных сайтов.
Проверка и нормализация извлеченных данных
Дважды проверьте, соответствуют ли очищенные данные ожидаемым форматам, и выполните необходимую очистку перед анализом.
Используйте контейнеры для портативности
Контейнеры Docker упаковывают зависимости и позволяют распределять парсеры по средам.
Проявите творческий подход и не бойтесь экспериментировать! Теперь поговорим об этике.
Лучшие практики парсинга: парсите этично и ответственно
Парсинг веб-страниц может вызвать некоторые этические проблемы, если его не выполнить должным образом. Вот несколько рекомендаций по парсингу:
Следуйте правилам robots.txt – Избегайте парсинга сайтов, которые это запрещают.
Проверьте условия использования – Прежде чем парсить определенные сайты, сначала получите разрешение.
Минимизировать частоту – Используйте регулирование, планирование и кэширование для ограничения запросов.
Назовите себя – Настройте собственную строку пользовательского агента.
Избегайте личных данных – Собирайте только общедоступную информацию.
Собирайте ответственно – Помните о нагрузке на сервер.
Также вежливо заранее уведомить владельцев веб-сайтов, прежде чем запускать на их сайте крупномасштабные парсеры.
Следуйте этим рекомендациям, чтобы ваши скребки принесли положительный результат!
Иди и поскреби, мой друг!
И это окончание! Мы изучили массу вопросов:
- Почему парсинг веб-страниц — полезный навык
- Как это работает под капотом
- Мощные инструменты, такие как Requests и Beautiful Soup.
- Создание реальных парсеров
- Продвинутые приемы и лучшие практики
- Этические соображения по парсингу
Вот несколько следующих шагов для повышения уровня ваших навыков:
Выучить язык – Python великолепен, но Ruby и Node.js тоже работают хорошо.
Попробуйте фреймворки – Scrapy, Puppeteer или Dramawright обеспечивают более высокую абстракцию.
Используйте инструмент ETL – ParseHub, import.io и другие имеют графические интерфейсы для быстрого создания парсеров.
Практика! - Опыт лучший учитель. Создавайте проекты, чтобы применить полученные знания.
Мир веб-данных у вас под рукой. Теперь идите исследовать, парсить интересные сайты, анализировать крутые наборы данных и автоматизировать все!
Удачной чистки, друг мой! Дайте мне знать, если у вас есть еще вопросы.