Лекция 4: Веб-скрейпинг
Что такое веб-скрейпинг?
Заголовок раздела «Что такое веб-скрейпинг?»Веб-скрейпинг (web scraping) — автоматический сбор данных с веб-страниц.
HTTP запросы
Заголовок раздела «HTTP запросы»Основы HTTP
Заголовок раздела «Основы HTTP»HTTP (HyperText Transfer Protocol) — протокол передачи гипертекста.
Методы:
GET— получение данныхPOST— отправка данныхPUT— обновление данныхDELETE— удаление данных
Статус-коды:
200 OK— успешный запрос404 Not Found— страница не найдена500 Server Error— ошибка сервера
requests
Заголовок раздела «requests»Библиотека для работы с HTTP.
import requests
# Простой GET запросresponse = requests.get("https://example.com")
# Проверка статусаif response.status_code == 200: print("Успех!")
# Получение HTMLhtml = response.text
# Получение в JSONdata = response.json()Headers
Заголовок раздела «Headers»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 и DOM
Заголовок раздела «HTML и DOM»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>BeautifulSoup
Заголовок раздела «BeautifulSoup»Библиотека для парсинга 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) # Заголовок
# Поиск по idmain = 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")CSS селекторы
Заголовок раздела «CSS селекторы»# По тегуsoup.select("div")
# По idsoup.select("#unique")
# По классуsoup.select(".class-name")
# Комбинацииsoup.select("div.content p") # p внутри div.contentsoup.select("a[href^='https://']") # ссылки с https
# По атрибутуsoup.select("[data-id='123']")Этика скрейпинга
Заголовок раздела «Этика скрейпинга»robots.txt
Заголовок раздела «robots.txt»Файл robots.txt указывает, какие страницы можно сканировать.
from urllib import robotparserimport 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 → Извлечение данных → Сохранение