Какие библиотеки Python используются для веб-парсинга и в чем их различие?

Ответ

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

1. Статические страницы (HTML)

Для страниц, контент которых не меняется после загрузки, используется комбинация библиотек:

  • requests: для выполнения HTTP-запросов и получения HTML-кода страницы.
  • BeautifulSoup4 или lxml: для парсинга HTML-документа и удобной навигации по его структуре с помощью CSS-селекторов или XPath.

Пример:

import requests
from bs4 import BeautifulSoup

URL = "https://example.com"

# 1. Получаем HTML-код
response = requests.get(URL)
response.raise_for_status() # Проверка на ошибки HTTP

# 2. Парсим HTML
soup = BeautifulSoup(response.text, 'html.parser')

# 3. Извлекаем данные (например, заголовок h1)
header = soup.find('h1')
if header:
    print(header.text)

2. Динамические страницы (JavaScript)

Для страниц, контент которых генерируется с помощью JavaScript в браузере, необходимы инструменты, которые могут исполнять JS.

  • Selenium или Playwright: управляют реальным браузером (Chrome, Firefox), позволяя дождаться загрузки всех динамических элементов перед парсингом.

Пример с Selenium:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# Установка и запуск драйвера
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)

driver.get("https://example.com")

# Находим элемент по ID (современный синтаксис)
dynamic_content = driver.find_element(By.ID, "dynamic-content-id")
print(dynamic_content.text)

driver.quit()

Рекомендации:

  • Всегда проверяйте файл robots.txt сайта на наличие ограничений для парсинга.
  • Используйте User-Agent в заголовках requests, чтобы имитировать запрос от браузера.
  • Добавляйте задержки между запросами (time.sleep), чтобы не создавать чрезмерную нагрузку на сервер.
  • Для масштабных и сложных задач рассмотрите фреймворк Scrapy, который предоставляет готовую архитектуру для создания "пауков".

Ответ 18+ 🔞

Да ты посмотри, какие, блядь, подходы есть! Прямо как в жизни — либо всё просто и лежит на блюдечке, либо надо, сука, танцы с бубном устраивать.

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

1. Страницы статичные (простой HTML)

Это когда весь контент, блядь, уже в HTML-коде приезжает. Тут всё просто, как три копейки. Берёшь:

  • requests: чтобы дернуть сервер и получить этот самый HTML, ёпта.
  • BeautifulSoup4 или lxml: чтобы потом в этой простыне из тегов не хуй пойми что найти, а конкретные данные.

Смотри, как это выглядит:

import requests
from bs4 import BeautifulSoup

URL = "https://example.com"

# 1. Дёргаем сервак за HTML
response = requests.get(URL)
response.raise_for_status() # А тут, бля, проверяем, не послал ли он нас нахуй с ошибкой

# 2. Засовываем HTML в парсер
soup = BeautifulSoup(response.text, 'html.parser')

# 3. Выковыриваем нужное (ну, допустим, заголовок h1)
header = soup.find('h1')
if header:
    print(header.text)

Вот и вся магия. Если данные на странице есть — они твои.

2. Страницы динамические (с JavaScript'ом)

А вот это, блядь, отдельная песня! Тут контент подгружается скриптами уже в браузере. Запросил страницу — а там пустое тело, одна разметка, а данных-то нихуя! Для такого дела нужен тяжёлый артиллерийский инструмент, который умеет в браузер.

  • Selenium или Playwright: это, сука, целые фреймворки, которые поднимают реальный браузер (Chrome, Firefox), ждут, пока вся эта javascript-хуйня отработает, и только потом позволяют тебе данные снимать.

Вот, например, на Selenium глянь:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# Настраиваем и запускаем хром, чтоб он не сдох на ровном месте
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)

driver.get("https://example.com")

# Ищешь элемент по ID (современным способом, не как дед)
dynamic_content = driver.find_element(By.ID, "dynamic-content-id")
print(dynamic_content.text)

driver.quit() # Не забудь браузер прибить, а то память жрать будет!

А теперь, блядь, слушай сюда, главное:

  • robots.txt — это святое, ёпта! Зайди на сайт, посмотри /robots.txt, а то мало ли, они парсить запрещают. Нехорошо получится.
  • В requests всегда подсовывай нормальный User-Agent, будто ты человек, а не скрипт-бот ебучий.
  • Не дрочи сервер запросами без перерыва. time.sleep() — твой друг, делай паузы, дай всем подышать.
  • Если задача, блядь, овердохуищная и сложная — посмотри в сторону Scrapy. Это такая бандура, которая из коробки умеет в очередь, в паузу, в обработку ошибок. Для больших проектов — то, что надо.

Вот и вся наука. Выбирай инструмент по задаче, и не еби мозг себе и серверу.