Ответ
Для веб-парсинга в 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. Это такая бандура, которая из коробки умеет в очередь, в паузу, в обработку ошибок. Для больших проектов — то, что надо.
Вот и вся наука. Выбирай инструмент по задаче, и не еби мозг себе и серверу.