ВГТУ
2024-12-03
Веб-скрапинг (web scraping) — это процесс автоматизированного извлечения данных с веб-сайтов. Этот метод позволяет собирать информацию с веб-страниц и сохранять её в удобном для анализа формате (например, в виде таблицы или базы данных). Веб-скрапинг используется в самых разных задачах, от сбора цен для сравнения товаров до мониторинга новостных сайтов и социальных сетей.
Отправка HTTP-запроса: Для получения содержимого веб-страницы используется HTTP-запрос, который посылает ваша программа (скрапер) на сервер.
Парсинг HTML: После получения содержимого страницы (HTML-кода) необходимо извлечь из него нужную информацию. Это делается с помощью инструментов для парсинга (например, BeautifulSoup, lxml или встроенные средства Python).
Извлечение данных: Из HTML-кода страницы извлекаются определенные данные, такие как текст, изображения, ссылки и т.д.
Сохранение данных: Извлеченные данные можно сохранить в разных форматах — текстовые файлы, CSV, базы данных, JSON и другие.
BeautifulSoup: Библиотека Python для парсинга HTML и XML документов. Она создает дерево синтаксического разбора, которое упрощает навигацию и поиск данных.
Scrapy: Фреймворк для более сложных задач веб-скрапинга. Он позволяет не только извлекать данные, но и следовать по ссылкам и собирать информацию со многих страниц сайта.
Selenium: Используется для скрапинга динамических страниц, которые загружают контент с помощью JavaScript. Selenium позволяет эмулировать браузер и взаимодействовать с элементами страницы.
Puppeteer: Инструмент на JavaScript для управления браузером Chrome или Chromium. Подходит для более сложного скрапинга и тестирования веб-приложений.
Этические и правовые вопросы: Перед тем как начать скрапинг, обязательно ознакомьтесь с robots.txt
сайта и его политикой использования данных. В некоторых случаях веб-скрапинг может быть запрещен или ограничен условиями использования сайта.
Ограничение частоты запросов: Чтобы не перегружать сервер сайта, рекомендуется устанавливать задержку между запросами (time.sleep()
) и ограничивать количество одновременных запросов.
Защита от блокировок: Некоторые сайты могут блокировать скраперы, поэтому может понадобиться использование прокси-серверов или ротация User-Agent.
import requests
from bs4 import BeautifulSoup
url = 'https://example.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# Извлекаем заголовки статей
for title in soup.find_all('h2'):
print(title.get_text())
Этот код отправляет запрос на сайт, парсит его содержимое и выводит заголовки всех статей на странице.
Scrapy — это мощный и широко используемый фреймворк для веб-скрапинга на Python. Он позволяет извлекать данные с веб-сайтов и обрабатывать их по вашему усмотрению. Вот краткое руководство по настройке и использованию Scrapy для создания базового веб-скрейпера.
Сначала убедитесь, что у вас установлен Python. Затем установите Scrapy с помощью pip
:
Чтобы начать новый проект Scrapy, перейдите в каталог, где хотите создать проект, и выполните команду:
Эта команда создаст новый каталог myproject
со следующей структурой:
myproject/
scrapy.cfg # Конфигурационный файл
myproject/ # Модуль Python для вашего проекта
__init__.py
items.py # Определение структур данных
middlewares.py # Пользовательские миддлвары (опционально)
pipelines.py # Пост-обработка данных
settings.py # Настройки проекта
spiders/ # Каталог для модулей пауков
__init__.py
Паук (spider) — это класс, который определяет, как переходить по ссылкам на веб-сайте и извлекать данные. Внутри каталога spiders
создайте новый файл, например, my_spider.py
:
import scrapy
class MySpider(scrapy.Spider):
name = "myspider"
start_urls = [
'https://example.com', # Замените на сайт, который хотите скрапить
]
def parse(self, response):
# Извлечение данных с страницы и передача их в виде словаря
for item in response.css('div.item'): # Замените 'div.item' на нужный CSS-селектор
yield {
'title': item.css('h2::text').get(),
'link': item.css('a::attr(href)').get(),
}
# Переход по ссылкам пагинации, если они есть
next_page = response.css('a.next::attr(href)').get()
if next_page is not None:
yield response.follow(next_page, self.parse)
Чтобы запустить вашего паука, используйте команду scrapy crawl
:
Эта команда запустит паука, и он начнет скрапить данные в соответствии с вашими настройками.
Вы также можете экспортировать собранные данные в файл (например, JSON или CSV), выполнив команду:
Это сохранит собранные данные в файл с именем output.json
.
Вы можете дополнительно настроить своего паука, добавив больше логики для парсинга, обработав разные типы страниц или используя миддлвары, пайплайны и настройки Scrapy.
Вы можете настроить параметры проекта в файле settings.py
. Например, для изменения User-Agent и задержки между запросами:
Scrapy предоставляет несколько полезных утилит командной строки, которые позволяют управлять проектами, запускать пауков, отлаживать и тестировать код, а также взаимодействовать с фреймворком. Вот основные команды и их использование:
Эта команда создаёт новый Scrapy проект с заданным именем.
Запускает паука, который определён в вашем проекте. Например, если паук называется myspider
, то команда будет:
Запускает интерактивную оболочку (shell) Scrapy, где вы можете выполнить запрос к URL и вручную исследовать и парсить HTML-код страницы. Это полезно для тестирования селекторов перед внедрением их в паука.
Эта команда генерирует шаблон паука, который будет настроен для работы с указанным доменом. Например:
Создаст паука с именем myspider
, настроенного на example.com
.
Запускает паука и сохраняет результаты в указанный файл. Поддерживаются форматы JSON, CSV, XML. Например:
Сохранит результаты в файл output.json
.
Выводит список всех пауков, которые доступны в вашем проекте.
Выводит подробную информацию и список опций для указанной команды. Например:
Используя опцию schedule
, можно запускать пауков по расписанию. Для этого можно использовать внешние планировщики (например, cron
на Unix-подобных системах) или сторонние инструменты, такие как scrapy-crawlera
для управления запросами.
Scrapy поддерживает различные уровни логирования (DEBUG, INFO, WARNING, ERROR, CRITICAL). Чтобы изменить уровень логирования:
Выводит только информационные сообщения и выше (ошибки, критические).
Команда делает запрос к указанному URL и возвращает HTML-код страницы. Полезно для отладки.
Эта команда делает запрос к указанному URL, сохраняет его в файл и открывает его в браузере.
Выводит значение конкретной настройки. Например:
Запустите scrapy shell
, чтобы протестировать ваши селекторы (XPath или CSS) в интерактивной оболочке.
С помощью команды scrapy deploy
можно загружать проект на сервер или облачную платформу (например, Scrapy Cloud). Обычно эта команда требует дополнительной настройки и используется с платформами, такими как Scrapyd.
Эти команды помогают эффективно управлять проектами Scrapy, тестировать и отлаживать код, а также сохранять и анализировать результаты веб-скрапинга.
В Scrapy пауки (spiders) являются основными компонентами, которые занимаются сбором информации с веб-сайтов. Пауки определяют, какие страницы нужно загружать, как извлекать данные и как следовать по ссылкам для перехода на другие страницы.
Класс паука Пауки в Scrapy определяются как подклассы scrapy.Spider
. Это базовый класс, который включает все необходимые методы и атрибуты для работы с сайтами.
Имя паука (name
) Каждому пауку присваивается уникальное имя. Это имя используется для вызова паука командой scrapy crawl <имя_паука>
.
Начальные URL (start_urls
) Это список URL, с которых паук начнет сканирование. Например:
Метод parse
Основной метод паука. Он вызывается при получении ответа от каждого URL из start_urls
. Этот метод занимается парсингом страницы и извлечением данных.
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/page/1/',
]
def parse(self, response):
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').get(),
'author': quote.css('small.author::text').get(),
'tags': quote.css('div.tags a.tag::text').getall(),
}
next_page = response.css('li.next a::attr(href)').get()
if next_page is not None:
yield response.follow(next_page, self.parse)
В этом примере паук QuotesSpider
:
http://quotes.toscrape.com/page/1/
.Generic Spider (Основной паук) Это наиболее распространенный тип паука, который может быть настроен для работы с различными структурами сайтов. Пример выше — это пример основного паука.
CrawlSpider Это более мощный тип паука, который используется для сканирования сайтов с большим количеством страниц и сложной навигацией. Он использует правила (rules
) для автоматического следования по ссылкам.
Пример CrawlSpider
:
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class MyCrawlSpider(CrawlSpider):
name = "my_crawl_spider"
start_urls = ['http://example.com']
rules = (
Rule(LinkExtractor(allow=('category\.php', )), callback='parse_item', follow=True),
)
def parse_item(self, response):
self.logger.info('Parsing item page: %s', response.url)
item = {
'title': response.css('title::text').get(),
'link': response.url,
}
return item
В этом примере CrawlSpider
автоматически переходит по ссылкам, соответствующим шаблону category.php
, и использует метод parse_item
для обработки этих страниц.
XMLFeedSpider Этот паук используется для обработки XML-фидов (каналов), таких как RSS или Atom.
from scrapy.spiders import XMLFeedSpider
class MyXMLFeedSpider(XMLFeedSpider):
name = 'xmlfeed'
start_urls = ['http://example.com/feed.xml']
iterator = 'iternodes' # Можно использовать 'iter' для построчной итерации
itertag = 'item' # Тег XML, который содержит элемент
def parse_node(self, response, node):
item = {
'title': node.xpath('title/text()').get(),
'link': node.xpath('link/text()').get(),
}
return item
CSVFeedSpider Этот паук предназначен для работы с CSV-файлами.
from scrapy.spiders import CSVFeedSpider
class MyCSVFeedSpider(CSVFeedSpider):
name = 'csvfeed'
start_urls = ['http://example.com/feed.csv']
headers = ['id', 'name', 'description']
def parse_row(self, response, row):
item = {
'id': row['id'],
'name': row['name'],
'description': row['description'],
}
return item
response.css() / response.xpath(): Методы для выборки элементов страницы с помощью CSS или XPath селекторов.
yield: Используется для возврата извлеченных данных или для передачи следующего запроса (например, для перехода по ссылке).
scrapy.Request: Можно использовать для выполнения запросов вручную внутри метода parse
или других методов.
follow: Метод для следования по ссылке и обработки следующей страницы.
Обработка ошибок: Используйте логирование и обработку исключений для обработки ошибок на этапах парсинга или запроса.
Ограничение скорости: Чтобы избежать блокировки сайта, используйте задержки (DOWNLOAD_DELAY
) между запросами и установите лимиты на количество одновременных запросов (CONCURRENT_REQUESTS
).
Cookies и сессии: Scrapy поддерживает использование cookies, что может быть полезно при работе с сайтами, требующими авторизацию.
Селекторы в Scrapy используются для извлечения данных из HTML-документов, которые паук загружает с веб-страниц. В Scrapy можно использовать два типа селекторов: XPath и CSS-селекторы. Оба инструмента позволяют выбирать элементы из HTML-кода страницы и извлекать нужную информацию.
CSS-селекторы — это мощный и удобный способ выбирать элементы из HTML по их тегам, классам, идентификаторам и другим атрибутам.
title
— выбирает тег <title>
.::text
— выбирает текстовое содержимое тега.get()
— извлекает первое совпадение (вернет текст заголовка страницы).getall()
— извлекает все совпадения (например, все заголовки первого уровня).div.content p
— выбирает все <p>
элементы внутри <div>
с классом content
.a::attr(href)
— извлекает значение атрибута href
у всех ссылок <a>
.src
для всех изображений на странице.XPath — это язык запросов, который позволяет более точно выбирать элементы, особенно если нужно выбрать элементы на основе их структуры, а не стилей.
//title/text()
— выбирает текст внутри тега <title>
.<h1>
.//div[@class="content"]/p/text()
— выбирает текст всех <p>
элементов, находящихся внутри <div>
с классом content
.href
у всех ссылок <a>
.src
для всех изображений на странице..get()
: Возвращает первое совпадение с запросом.
.getall()
: Возвращает все совпадения с запросом в виде списка.
.extract()
: Альтернативный метод для получения данных. Работает аналогично .getall()
, но используется чаще в старых версиях Scrapy.
.re()
: Позволяет использовать регулярные выражения для фильтрации данных.
В этом примере извлекаются цены, представляющие собой числа с десятичной точкой.
.re_first()
: Возвращает первое совпадение с регулярным выражением.
Scrapy позволяет использовать как CSS, так и XPath в одном пауке в зависимости от потребностей. Иногда XPath может быть полезнее для сложных структур, а CSS — для более простых и понятных запросов.
parse
Пример использования CSS-селекторов для извлечения данных о книгах с веб-страницы:
import scrapy
class BooksSpider(scrapy.Spider):
name = 'books'
start_urls = ['http://books.toscrape.com/']
def parse(self, response):
for book in response.css('article.product_pod'):
yield {
'title': book.css('h3 a::attr(title)').get(),
'price': book.css('p.price_color::text').get(),
}
next_page = response.css('li.next a::attr(href)').get()
if next_page is not None:
next_page = response.urljoin(next_page)
yield scrapy.Request(next_page, callback=self.parse)
Пример использования XPath-селекторов для того же сайта:
import scrapy
class BooksSpider(scrapy.Spider):
name = 'books'
start_urls = ['http://books.toscrape.com/']
def parse(self, response):
for book in response.xpath('//article[@class="product_pod"]'):
yield {
'title': book.xpath('.//h3/a/@title').get(),
'price': book.xpath('.//p[@class="price_color"]/text()').get(),
}
next_page = response.xpath('//li[@class="next"]/a/@href').get()
if next_page is not None:
next_page = response.urljoin(next_page)
yield scrapy.Request(next_page, callback=self.parse)
Используйте CSS для простых запросов: Если можно обойтись без сложных запросов, используйте CSS-селекторы — они короче и легче читаются.
Используйте XPath для сложных структур: XPath предоставляет больше возможностей для работы со сложными структурами и условиями, например, выбор элемента на основе его позиции в структуре документа.
Тестируйте селекторы в Scrapy Shell: Прежде чем интегрировать селекторы в код паука, тестируйте их в интерактивной оболочке Scrapy (scrapy shell <URL>
).