Многие, кто только начинает ... Beautiful Soup против Scrapy для парсинга
Beautiful Soup против Scrapy для парсинга...
Многие, кто только начинает заниматься парсингом, задаются вопросом, в чем разница между Beautiful Soup и Scrapy. Эта статья должна пролить свет на их различные функции и цели и помочь вам решить, какой из них лучше подходит для вашего проекта. Разработчики Python даже более вероятно, чем большинство других, будут нуждаться в парсинге на определенном этапе своей карьеры. В эпоху больших данных умение создавать ботов для «открытия» веб-сайтов и извлечения информации, иначе называемое парсингом, является практически обязательным для всех, кто имеет дело с цифровыми данными. Два популярных инструмента для парсинга на Python — Beautiful Soup и Scrapy. Какой из них подходит для ваших нужд? Давайте узнаем.
Что такое Beautiful Soup?
Beautiful Soup — это библиотека Python, которая позволяет разбирать документы HTML и XML и извлекать из них данные. Она предоставляет простой и интуитивно понятный способ навигации и поиска в древовидной структуре HTML, используя в качестве критериев поиска теги, атрибуты и текстовое содержимое.
Начните с использования pip для установки Beautiful Soup и Python Requests в качестве зависимостей проекта:
pip install beautifulsoup4 requests
Чтобы спарсить веб-страницу, необходимо сначала загрузить HTML-содержимое страницы с помощью HTTP-клиента типа requests, а затем разобрать содержимое страницы с помощью BeautifulSoup.
import requests from bs4 import BeautifulSoup url = '<https://www.example.com>' response = requests.get(url) html_content = response.text soup = BeautifulSoup(html_content, 'html.parser')
Затем вы можете использовать методы Beautiful Soup для извлечения интересующих вас данных. Например, допустим, мы хотим извлечь заголовок сайта и список всех URL на странице:
title = soup.find('title').get_text() url_list = [] links = soup.find_all('a') for link in links: url = link.get('href') url_list.append(url) print(title, url_list)
Этот код выведет заголовок и список URL всех ссылок на странице.
Что такое Scrapy?
Scrapy — это Python-фреймворк для парсинга, который обеспечивает более мощный и настраиваемый способ извлечения данных с веб-сайтов. Он позволяет определить набор правил для навигации и извлечения данных с нескольких страниц веб-сайта и обеспечивает встроенную поддержку для работы с различными типами данных.
Чтобы использовать Scrapy, сначала необходимо установить его с помощью pip:
# Установить Scrapy
pip install scrapy
Затем вы можете создать новый проект Scrapy с помощью команды scrapy:
# Создать проект Scrapy
scrapy startproject myproject
Это создаст новый каталог myproject с базовой структурой проекта Scrapy. Затем вы можете сгенерировать спайдер, который является основным компонентом Scrapy, выполняющим фактический поиск:
# Generate Spider
scrapy genspider myspider
Вот пример простого спайдера, который извлекает заголовки и URL всех ссылок на веб-странице:
import scrapy class MySpider(scrapy.Spider): name = 'myspider' start_urls = ['']. def parse(self, response): links = response.css('a') for link in links: title = link.css('::text').get() url = link.attrib['href'] yield { 'title': title, 'url': url, }
Этот спайдер определяет метод разбора, который вызывается для каждой страницы, которую он посещает, начиная с URL, определенных в start_urls. Он использует встроенные селекторы Scrapy для извлечения заголовка и URL каждой ссылки и создает словарь с этими данными.
Чтобы запустить спайдер, вы используете команду scrapy crawl:
# Запустить спайдер scrapy crawl myspider
Расширенные возможности Scrapy
Очередь URL-адресов для сканирования
Scrapy может управлять очередью запросов для парсинга, с автоматической дедупликацией и проверкой максимальной глубины рекурсии. Например, этот спайдер парсит заголовки всех связанных страниц на глубину до 5:
import scrapy class TitleSpider(scrapy.Spider): name = 'titlespider' start_urls = ['']. custom_settings = { "DEPTH_LIMIT": 5 } def parse(self, response): yield { 'url': response.url, 'title': response.css('title::text').extract_first(), } for link_href in response.css('a::attr("href")'): yield scrapy.Request(link_href.get())
Несколько форматов вывода
Scrapy напрямую поддерживает сохранение вывода в различных форматах, таких как JSON, CSV и XML:
# Запустите спайдер и сохраните вывод в файл JSON scrapy crawl -o myfile -t json myspider # Запустите спайдер и сохраните вывод в CSV-файл scrapy crawl -o myfile -t csv myspider # Запуск спайдер и сохранение результатов в XML-файл scrapy crawl -o myfile -t xml myspider
Cookies
Scrapy получает и отслеживает файлы cookie, отправленные серверами, и отправляет их обратно при последующих запросах, как это делает любой обычный веб-браузер.
Если вы хотите указать дополнительные cookies для ваших запросов, вы можете добавить их к создаваемому Scrapy Request:
request_with_cookies = scrapy.Request(
url="",
cookies={'currency': 'USD', 'country': 'UY'},
)
Подмена агента пользователя
Scrapy поддерживает установку пользовательского агента для всех запросов в пользовательское значение, что полезно, например, если вы хотите отсканировать мобильную версию сайта. Просто поместите пользовательский агент в файл [settings.py]() в вашем проекте, и он будет автоматически использоваться для всех запросов:
# settings.py USER_AGENT = 'Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.5563.57 Mobile Safari/537.36'
Когда использовать Beautiful Soup и когда использовать Scrapy
Вам следует использовать Beautiful Soup, когда вам нужно извлечь данные из нескольких простых веб-страниц, и вы не ожидаете, что они будут пытаться блокировать ваш доступ к ним. Вам следует использовать Scrapy, если вы хотите спарсить целый веб-сайт, переходить по ссылкам с одной страницы на другую, иметь дело с cookies и блокировкой, а также экспортировать большое количество данных в различных форматах.
Вывод
Итак, выбор между Beautiful Soup и Scrapy вам придется делать самостоятельно, но вот краткое описание различий, чтобы вы не забыли. Beautiful Soup в целом проще в использовании и более гибкий, чем Scrapy, что делает его хорошим выбором для небольших задач парсинга. Scrapy более мощный и настраиваемый, что делает его хорошим выбором для более крупных и сложных проектов по извлечению данных.