Перейти к содержимому

Лекция 4: Веб-скрейпинг

Веб-скрейпинг (web scraping) — автоматический сбор данных с веб-страниц.

HTTP (HyperText Transfer Protocol) — протокол передачи гипертекста.

Методы:

  • GET — получение данных
  • POST — отправка данных
  • PUT — обновление данных
  • DELETE — удаление данных

Статус-коды:

  • 200 OK — успешный запрос
  • 404 Not Found — страница не найдена
  • 500 Server Error — ошибка сервера

Библиотека для работы с HTTP.

import requests
# Простой GET запрос
response = requests.get("https://example.com")
# Проверка статуса
if response.status_code == 200:
print("Успех!")
# Получение HTML
html = response.text
# Получение в JSON
data = response.json()

Headers — метаданные запроса. Важно указывать User-Agent.

headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
response = requests.get(url, headers=headers)

HTML (HyperText Markup Language) — структура веб-страниц.

<html>
<head>
<title>Заголовок страницы</title>
</head>
<body>
<h1>Заголовок</h1>
<p>Параграф</p>
<a href="url">Ссылка</a>
<div>Блок</div>
<span>Инлайн</span>
<ul>
<li>Элемент списка</li>
</ul>
<table>
<tr>
<td>Ячейка</td>
</tr>
</table>
</body>
</html>
<div id="unique" class="class1 class2">Содержимое</div>
<a href="https://example.com" target="_blank">Ссылка</a>

Библиотека для парсинга HTML и XML.

from bs4 import BeautifulSoup
html = """
<html>
<body>
<h1 id="main">Заголовок</h1>
<div class="content">Текст</div>
<a href="url">Ссылка</a>
</body>
</html>
"""
soup = BeautifulSoup(html, "html.parser")
# Поиск по тегу
h1 = soup.find("h1")
print(h1.text) # Заголовок
# Поиск по id
main = soup.find(id="main")
# Поиск по классу
content = soup.find(class_="content")
# Поиск по атрибуту
link = soup.find("a", href="url")
# Все элементы
all_links = soup.find_all("a")
# CSS селекторы
element = soup.select_one(".content")
elements = soup.select("div.content")
# По тегу
soup.select("div")
# По id
soup.select("#unique")
# По классу
soup.select(".class-name")
# Комбинации
soup.select("div.content p") # p внутри div.content
soup.select("a[href^='https://']") # ссылки с https
# По атрибуту
soup.select("[data-id='123']")

Файл robots.txt указывает, какие страницы можно сканировать.

from urllib import robotparser
import urllib.parse
def can_scrape(url, user_agent='*'):
"""Проверить, разрешён ли скрейпинг для URL"""
parsed = urllib.parse.urlparse(url)
robots_url = f"{parsed.scheme}://{parsed.netloc}/robots.txt"
rp = robotparser.RobotFileParser()
rp.set_url(robots_url)
try:
rp.read()
return rp.can_fetch(user_agent, url)
except:
return False
  • Проверяйте robots.txt
  • Не скрейпите слишком часто (используйте задержки)
  • Указывайте User-Agent
  • Не скрейпите без разрешения, если robots.txt запрещает
  • Соблюдайте условия использования сайта
URL → HTTP запрос → HTML → BeautifulSoup → Извлечение данных → Сохранение