Лучший опыт

Многие, кто только начинает ... 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 более мощный и настраиваемый, что делает его хорошим выбором для более крупных и сложных проектов по извлечению данных.