Веб-скрапинг с помощью Scrapy: Руководство по Python
В этом руководстве мы покажем, как начать работу с Scrapy для Веб-скрейпинг и автоматизация: и создайте свой первый проект по веб-скрейпингу.
Почему стоит использовать Scrapy?
Scrapy - быстрый, эффективный и гибко настраиваемый фреймворк. Он особенно полезен для крупномасштабных задач по сбору данных, когда нужно обходить сотни или тысячи страниц. Фреймворк создан с упором на производительность: он одновременно обрабатывает HTTP-запросы и парсит ответы.
Альтернативы Scrapy
Если вы ищете альтернативы Scrapy, я могу порекомендовать 3 лучших провайдера веб-скрапинга на рынке (я ни с одним из них не связан, не волнуйтесь):
- Яркие данные: Ведущий инструмент с обширной прокси-сетью и сопутствующими решениями.
- Oxylabs: Продвинутый сбор данных с надежными прокси и API.
- Zyte: Удобный скрапинг с интеллектуальным извлечением данных и поддержкой.
Ключевые возможности Scrapy:
- Встроенная поддержка обработки запросов: Упрощает работу с несколькими страницами и ссылками.
- Конкурентность и асинхронный ввод-вывод: Эффективная обработка нескольких запросов одновременно.
- Поддержка XPath и CSS-селекторов: Мощные способы навигации по HTML и извлечения данных.
- Robust API: Позволяет задавать, как данные обрабатываются и хранятся.
Пререквизиты
- Basic Python Knowledge: Понимание основ Python имеет ключевое значение.
- Install Scrapy: Для начала выполните pip install scrapy. Убедитесь, что у вас установлен Python 3.6+.
Начало работы с Scrapy
Setting Up Scrapy
Чтобы начать использовать Scrapy, сначала его нужно установить. Самый простой способ - использовать pip, менеджер пакетов Python.
pip install scrapy
После установки проверьте её, выполнив следующую команду:
scrapy version
Если Scrapy установлен правильно, эта команда выведет версию Scrapy.
Создание проекта Scrapy
Scrapy строится вокруг концепции проектов. Чтобы создать свой первый проект, перейдите в каталог, где должен находиться ваш проект, и выполните:
scrapy startproject myproject
Это создаст папку с именем myproject, в которой будут все необходимые файлы для начала работы.
Понимание структуры проекта
После создания проекта вы увидите структуру папок примерно такого вида:
myproject/
scrapy.cfg # Configuration file
myproject/
__init__.py
items.py # Define the data structure
middlewares.py # Handle middleware logic
pipelines.py # Store the scraped data
settings.py # Project settings
spiders/ # Folder to store your spiders
- items.py: Определяет структуру данных, которые вы хотите собирать.
- middlewares.py: Позволяет изменять запросы и ответы.
- pipelines.py: Обрабатывает и сохраняет собранные данные.
- settings.py: Настраивает поведение вашего проекта Scrapy.
- spiders/: Содержит код паука, в котором будет находиться вся логика скрапинга.
Создание первого паука
Паук — это класс в Scrapy, который определяет, как следует парсить конкретный сайт или группу сайтов.
Создание паука
To create a spider, navigate to the spiders directory and create a new Python file. Let’s call it quotes_spider.py to scrape data from the famous quotes.toscrape.com website, which is great for beginners.
Вот базовая структура вашего паука:
импорт scrapy
класс QuotesSpider(scrapy.Spider):
имя = "quotes"
start_urls = ['http://quotes.toscrape.com']
def разбор(self, response):
для quote в response.css('div.quote'):
урожайность {
'text': quote.css('span.text::text').get(),
'author': quote.css('span small::text').get(),
'tags': quote.css('div.tags a.tag::text').getall(),
}
next_page = response.css('li.next a::attr(href)').get()
если next_page это не Нет:
урожайность response.follow(next_page, self.parse)
Let’s break this down:
- name: Это имя паука. Scrapy использует это имя, чтобы определить, какого паука запускать.
- start_urls: Это список URL-адресов, с которых паук начнет сбор данных.
- parse(): This method is where the extraction logic resides. It defines how the content of the page is processed. Here, we’re using CSS selectors (response.css) to extract the text, author, and tags of quotes.
- Pagination: После обработки текущей страницы паук находит URL следующей страницы и переходит по нему, чтобы собрать следующий набор цитат.
Запуск паука
Чтобы запустить своего паука, просто выполните следующую команду:
scrapy crawl quotes
Scrapy посетит стартовый URL, извлечет данные, перейдет по ссылкам на следующие страницы и соберет дополнительные цитаты.
Exporting Scraped Data
Scrapy позволяет легко экспортировать собранные данные. Их можно экспортировать в форматах JSON, CSV или XML. Чтобы экспортировать данные в JSON-файл, выполните следующую команду:
scrapy crawl quotes -o quotes.json
This command will save the scraped data into quotes.json. Similarly, you can export it in CSV by changing the extension.
Работа с настройками Scrapy
Scrapy’s behavior can be configured through the settings.py file. Here are some important settings you may want to adjust:
- USER_AGENT: Некоторые сайты блокируют запросы без User-Agent. Вы можете задать User-Agent вашего паука в настройках.
USER_AGENT = ‘myproject (+http://www.yourdomain.com)'
- CONCURRENT_REQUESTS: Этот параметр определяет, сколько запросов Scrapy может выполнять одновременно.
CONCURRENT_REQUESTS = 16
- DOWNLOAD_DELAY: Можно использовать задержку между запросами, чтобы не перегружать сервер.
DOWNLOAD_DELAY = 1 # 1 second delay between requests
Handling Dynamic Content
Многие современные сайты используют JavaScript для динамической загрузки контента, а сам Scrapy не умеет выполнять JavaScript. В таких случаях можно использовать Scrapy-Splash или интегрировать Scrapy с headless-браузером, таким как Селен.
Using Scrapy-Splash
Splash — это браузер в headless-режиме, предназначенный для веб-скрапинга. Чтобы использовать Splash, его нужно установить и затем интегрировать со Scrapy.
Вот как установить Scrapy-Splash:
pip install scrapy-splash
You also need to update the settings.py file to include:
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
Благодаря интеграции Splash Scrapy лучше обрабатывает динамический контент и извлекает данные с сайтов на JavaScript.
Пайплайны Scrapy: хранение данных
После сбора данных вам понадобится способ их хранить или обрабатывать. Здесь в дело вступают пайплайны.
Let’s say you want to store the scraped data in a MongoDB database. First, install the pymongo library:
pip install pymongo
Then, create a pipeline in pipelines.py:
импорт pymongo
класс MongoPipeline:
def open_spider(self, spider):
self.client = pymongo.MongoClient("mongodb://localhost:27017/")
self.db = self.client["scrapy_db"]
def close_spider(self, spider):
self.client.close()
def process_item(self, item, spider):
self.db["quotes"].insert_one(dict(item))
возврат item Don't forget to activate the pipeline in settings.py:
ITEM_PIPELINES = {
'myproject.pipelines.MongoPipeline': 300,
}
Теперь все собранные данные будут храниться в коллекции MongoDB.
Заключение
Веб-скрейпинг с Scrapy — мощный способ эффективно извлекать данные с сайтов. От настройки Scrapy и создания пауков до обработки динамического контента и хранения данных в базе данных, Scrapy предлагает гибкость как для новичков, так и для опытных разработчиков.
Освоение Scrapy может автоматизировать процессы сбора данных, предоставляя вам инструменты для получения ценных инсайтов и помогая принимать отраслевые решения.
Теперь, когда вы понимаете, как работает Scrapy, создайте свой следующий проект по веб-скрейпингу!

