перейти к содержанию

Полное руководство по парсингу веб-страниц с помощью Beautiful Soup и запросов Python

Мой друг, ты хочешь открыть для себя мир данных в Интернете? Вы хотите извлекать и анализировать данные с веб-сайтов для своих исследований, бизнеса или побочных проектов?

Если да, то позвольте мне познакомить вас с волшебным миром соскоб – автоматическое извлечение информации с веб-сайтов.

Парсинг веб-страниц может показаться сложным, но для этого не обязательно использовать правильные инструменты. В этом подробном руководстве я предоставлю вам все знания, которые помогут вам стать профессиональным парсером веб-страниц, используя две самые мощные библиотеки Python для парсинга веб-страниц — Красивый суп и Запросы.

Вот что я расскажу:

  • Почему парсинг веб-страниц так чертовски полезен
  • Как на самом деле работает парсинг веб-страниц
  • Установка и отправка запросов с помощью Python Requests
  • Парсинг HTML-страниц с помощью Beautiful Soup
  • Создание полноценного парсера шаг за шагом
  • Советы, рекомендации и рекомендации
  • Этические соображения относительно ответственного парсинга веб-страниц

Давайте поскребём!

Почему парсинг веб-страниц чертовски полезен

По Аналитическая компания Gartner, к 75 году более 2024% всех организаций внедрит какое-либо решение для интеграции данных, такое как парсинг веб-страниц. Почему парсинг веб-страниц стал таким популярным?

Вот некоторые из ключевых случаев использования:

  • Мониторинг цен – Отслеживайте цены на продукты, акции и т. д. на сайтах электронной торговли. Полезно для финансового анализа.

  • Лидогенерация – Создавайте базы данных деловых контактов из каталогов и списков сайтов. Отлично подходит для отделов продаж и маркетинга.

  • В исследовании – Сбор данных с информационных сайтов и страниц. Помогает исследователям, журналистам и аналитикам автоматизировать сбор данных.

  • мониторинг – Проверяйте веб-сайты и страницы на предмет изменений с течением времени. Полезно для SEO и мониторинга безопасности.

  • Машинное обучение – Собирать и извлекать большие наборы обучающих данных для моделей машинного обучения.

Веб-скрапинг позволяет собирать бесконечные объемы общедоступных данных из Интернета, которые затем можно структурировать, анализировать и вводить в модели или приложения. Это дает вам возможность создавать крутые вещи!

По Стацита, более 50% всех собранных данных используется для бизнес-аналитики, 15% — для привлечения потенциальных клиентов и 10% — для исследований по мониторингу цен. Приложения бесконечны.

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

Вот как на самом деле работает парсинг веб-страниц

Вкратце, вот обычные шаги для проекта парсинга веб-страниц:

  1. Определите свою цель – Какие веб-сайты вы хотите парсить и какие данные необходимо извлечь?

  2. Проанализируйте структуру – Просмотрите страницы, чтобы определить, как извлечь необходимые данные.

  3. Напишите парсер – Скрипт для запроса страниц и анализа HTML для извлечения данных.

  4. Хранить данные – Сохраните очищенные данные в базе данных или файле для последующего использования.

  5. Повторяйте и уточняйте – Улучшите парсер для обработки большего количества страниц, ошибок и крайних случаев.

Веб-скраперы автоматизируют процесс извлечения данных. Но как они работают под капотом? Вот что происходит:

  1. Скребок отправляет HTTP-запросы на целевой веб-сайт для загрузки веб-страниц.

  2. Веб-сайт отвечает HTML страницы, содержащие данные.

  3. Скребок анализирует HTML используя парсер, такой как Beautiful Soup.

  4. It извлекает необходимые данные использование селекторов CSS, регулярных выражений и т. д.

  5. Наконец, данные структурировано и хранится в базе данных, 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 для ее анализа у вас есть идеальная комбинация для извлечения данных с любого веб-сайта. Теперь давайте посмотрим, как все это объединится, построив скребок.

Парсинг веб-страниц в действии: создание парсера для продуктов электронной коммерции

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

Вот шаги, которые мы выполним:

  1. Определите целевой сайт и данные для парсинга
  2. Анализировать HTML-структуру сайта
  3. Используйте запросы для загрузки страниц
  4. Разбор страниц с помощью BeautifulSoup
  5. Извлеките данные о продукте в файл CSV.
  6. Обработка нумерации страниц

Давайте начнем!

Выбор веб-сайта и данных для парсинга

В этом примере мы возьмем каталог из 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. Хорошо:

  1. Определите начальный URL
  2. Получите его с помощью GET запросить
  3. Сохраните содержимое ответа
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 - Миссия выполнена!

Но пока мы очистили только одну страницу. Далее давайте займемся нумерацией страниц…

Обработка нумерации страниц

Чтобы парсить несколько страниц, нам нужно:

  1. Проверьте, есть ли следующая страница
  2. Если да, перейдите по ссылке на следующей странице.
  3. Продолжайте очищать до последней страницы

Многие сайты используют ?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 и другие имеют графические интерфейсы для быстрого создания парсеров.

  • Практика! - Опыт лучший учитель. Создавайте проекты, чтобы применить полученные знания.

Мир веб-данных у вас под рукой. Теперь идите исследовать, парсить интересные сайты, анализировать крутые наборы данных и автоматизировать все!

Удачной чистки, друг мой! Дайте мне знать, если у вас есть еще вопросы.

Присоединяйтесь к беседе

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