Scrapy против Pyspider: Что лучше для веб-скрапинга?

Сравните Scrapy и Pyspider для веб-скрапинга и выберите лучший инструмент для ваших нужд.
3 мин. чтения
Scrapy vs Pyspider blog image

В этом руководстве Scrapy vs Pyspider вы узнаете:

  • Что такое Scrapy и Pyspider
  • Сравнение Scrapy и Pyspider для веб-скрапинга
  • Как использовать Scrapy и Pyspider для веб-скреппинга
  • Общие ограничения между Scrapy и Pyspider в сценариях веб-скрапинга

Давайте погрузимся!

Что такое Scrapy?

Scrapy – это фреймворк для веб-скрапинга с открытым исходным кодом, написанный на языке Python. Его основная цель – быстрое и эффективное извлечение данных с веб-сайтов. В деталях он позволяет:

  • Определите, как перемещаться и собирать информацию с одной или нескольких веб-страниц.
  • Занимайтесь такими аспектами, как HTTP-запросы, переход по ссылкам и извлечение данных.
  • Избежать запрета можно, регулируя скорость запроса с помощью дросселирования и асинхронных запросов.
  • Управляйте прокси и ротацией прокси с помощью собственного промежуточного ПО или библиотеки scrapy-rotating-proxies.

Что такое Pyspider?

Pyspider – это фреймворк с открытым исходным кодом, написанный на Python. Он создан для простого и гибкого извлечения данных с веб-сайтов и позволяет вам:

  • Определите, как перемещаться и собирать информацию с одной или нескольких веб-страниц с помощью CLI или удобного веб-интерфейса.
  • Занимайтесь такими аспектами, как планирование задач, повторные попытки и хранение данных.
  • Ограничьте количество блоков, поддерживая распределенную обработку и приоритетные задачи.
  • Управляйте сложными рабочими процессами и обработкой данных благодаря встроенной поддержке баз данных и очередей сообщений.

Scrapy против Pyspider: Сравнение возможностей веб-скрапинга

Теперь, когда вы узнали, что такое Scrapy и Pyspider, пришло время сравнить их для веб-скрапинга:

Характеристика Scrapy Паук
Пример использования Крупномасштабные и сложные проекты по скрапбукингу Запланированные задания по скрапбукингу
Управление скрапингом CLI CLI и пользовательский интерфейс
Методы синтаксического анализа XPath и селекторы CSS Селекторы CSS
Сохранение данных Возможность экспорта данных в CSV и другие форматы файлов Автоматическое сохранение данных в базе данных
Повторная попытка Требуется ручное вмешательство для повторной попытки Автоматическое повторное выполнение неудачных заданий
Планирование заданий Нужны внешние интеграции Встроенная поддержка
Вращение прокси-сервера Поддержка вращения прокси через промежуточные программы Требует ручного вмешательства
Сообщество Сообщество Hige, в настоящее время насчитывающее более 54 тыс. звезд GitHub, которые активно вносят свой вклад в его развитие Обширное сообщество, в настоящее время имеет более 16 тысяч звезд на GitHub, но архивируется с 11 июня 2024 года.

Приведенная выше сравнительная таблица Scrapy vs Pyspider показывает, что эти две библиотеки похожи. Основные различия на высоком уровне таковы:

  • Scrapy можно использовать только через CLI, в то время как Pyspider также предоставляет пользовательский интерфейс.
  • Scrapy может анализировать селекторы XPath и CSS, в то время как Pyspider поддерживает только селекторы CSS.
  • Scrapy автоматически поддерживает ротацию прокси с помощью пользовательской логики промежуточного ПО.

Однако, что действительно важно учитывать, так это то, что Pyspider больше не поддерживается:

Архивный GitHub-репозиторий Pyspider

Scrapy против Pyspider: Сравнение прямого скрапинга

Сравнив Scrapy с Pyspider, вы узнали, что эти два фреймворка предлагают схожие возможности для веб-скрапинга. По этой причине лучший способ сравнить их – это реальный пример кодирования.

В следующих двух разделах мы покажем вам, как использовать Scrapy и Pyspider для поиска одного и того же сайта. Если говорить подробно, то целевой страницей будет страница “Hokey Teams” из Scrape This Site. Она содержит данные о хоккее в табличной форме:

Табличные данные для сканирования

Цель этих разделов – получить все данные из таблицы и сохранить их локально. Давайте посмотрим, как это сделать!

Как использовать Scrapy для веб-скрапинга

В этом параграфе вы узнаете, как с помощью Scrapy получить все данные из таблицы, предоставленной целевым сайтом.

Требования

Чтобы следовать этому руководству, на вашем компьютере должен быть установлен Python 3.7 или выше.

Шаг #1: Настройка окружения и установка зависимостей

Предположим, что вы назвали главную папку своего проекта hockey_scraper/. По завершении этого шага папка будет иметь следующую структуру:

hockey_scraper/
   └── venv/

Вы можете создать каталог виртуальной среды venv/ следующим образом:

python -m venv venv

Чтобы активировать его, в Windows выполните команду:

venv\Scripts\activate

Аналогично, в macOS/Linux выполните команду:

source venv/bin/activate

Теперь вы можете установить Scrapy с помощью:

pip install scrapy

Шаг № 2: Начните новый проект

Теперь вы можете запустить новый проект Scrapy. В основной папке hockey_scraper/ введите:

scrapy startproject hockey

С помощью этой команды Scrapy создаст папку hockey/. Внутри нее она автоматически сгенерирует все необходимые файлы. Вот результирующая структура папок:

hockey_scraper/ 
    ├── hockey/ # Main Scrapy project folder
    │   ├── __init__.py  
    │   ├── items.py # Defines the data structure for scraped items 
    │   ├── middlewares.py # Custom middlewares
    │   ├── pipelines.py # Handles post-processing of scraped data 
    │   ├── settings.py # Project settings 
    │   └── spiders/ # Folder for all spiders  
    ├── venv/ 
    └── scrapy.cfg # Scrapy configuration file

Шаг № 3: Создайте паука

Чтобы сгенерировать нового паука, который будет ползать по целевому сайту, сначала зайдите в папку hockey/:

cd hockey

Затем сгенерируйте нового паука:

scrapy genspider data https://www.scrapethissite.com/pages/forms/

В этом скрипте data означает имя паука. Scrapy автоматически создаст файл data.py в папке spiders/. Этот файл будет содержать необходимую логику скраппинга для получения данных о команде Hokey.

Шаг #4: Определите логику скрапинга

Вы готовы к написанию логики скраппинга. Сначала просмотрите в браузере таблицу, содержащую интересующие вас данные. Вы можете увидеть, что данные содержатся внутри элемента .table:

Класс таблицы в HTML n HTML-коде целевой веб-страницы

Чтобы получить все данные, напишите следующий код в файле data.py:

import scrapy

class DataSpider(scrapy.Spider):
    name = "data"
    allowed_domains = ["www.scrapethissite.com"]
    start_urls = ["https://www.scrapethissite.com/pages/forms/"]
    
    def parse(self, response):
        for row in response.css("table.table tr"):
            yield {
                "name": row.css("td.name::text").get(),
                "year": row.css("td.year::text").get(),
                "wins": row.css("td.wins::text").get(),
                "losses": row.css("td.losses::text").get(),
                "ot_losses": row.css("td.ot-losses::text").get(),
                "pct": row.css("td.pct::text").get(),
                "gf": row.css("td.gf::text").get(),
                "ga": row.css("td.ga::text").get(),
                "diff": row.css("td.diff::text").get(),
            }

Обратите внимание, что переменные name, allowed_domains и start_urls были автоматически созданы Scrapy на предыдущем шаге.

Даже метод parse() был автоматически создан Scrapy. Таким образом, вам нужно только добавить логику скрапинга на этом шаге, который находится под циклом for.

В деталях метод response.css() ищет таблицу. Затем код перебирает все строки таблицы и получает данные.

Шаг 5: Запустите краулер и сохраните данные в CSV-файл

Чтобы запустить краулер и сохранить собранные данные в CSV-файл, выполните следующие действия:

scrapy crawl data -o output.csv

С помощью этого кода Scrapy:

  • Запускает файл data.py, содержащий логику скраппинга
  • Сохраняет собранные данные в CSV-файл под названием output.csv.

Ожидаемый файл output.csv, созданный скрепером, имеет следующий вид:

Ожидаемый файл CSV

Обратите внимание, что этот способ использования Scrapy является самым коротким, но не единственным. Scrapy предоставляет различные настройки и параметры, и вы можете узнать об этом больше в нашей статье Scrapy vs Requests.

Как использовать Pyspider для веб-скрапинга

Узнайте, как с помощью Pyspider отсканировать тот же целевой сайт.

Требования

Pyspider поддерживает Python3.6 в качестве последней версии. Если у вас установлены более поздние версии Python, прочитайте следующий шаг, чтобы узнать, как использовать его версию 3.6.

Шаг #1: Настройка окружения и установка зависимостей

Допустим, назовем главную папку вашего проекта hockey_scraper/.

Если у вас Python 3.7 или более поздняя версия, установите pyenv, чтобы получить Python 3.6.

Используйте pyenv для установки Python 3.6 с помощью этой команды:

pyenv install 3.6.15

Затем сделайте его локальной версией Python, чтобы не повлиять на всю систему с другой версией:

pyenv local 3.6.15

Чтобы убедиться, что все прошло нормально, проверьте версию Python:

python --version

Результат должен быть:

Python 3.6.15

Создайте виртуальную среду, выбрав правильную версию Python:

python3.6 -m venv venv

Активируйте виртуальную среду, как показано в предыдущей главе этого руководства. Теперь вы можете установить Pyspider с помощью:

pip install pyspider

Чтобы запустить запуск пользовательского интерфейса:

pyspider

Обратите внимание, что, поскольку этот репозиторий архивный, а вы используете Python 3.6, вы получите некоторые ошибки. Чтобы исправить их, вам может потребоваться установить следующие библиотеки:

pip install tornado==4.5.3 requests==2.25.1

Вы также можете получить другие ошибки, связанные с файлом webdav.py. Найдите этот файл и исправьте следующие ошибки:

  • В классе ScriptProvider() переименуйте метод getResourceInst() в get_resource_inst()
  • В нижней части файла найдите переменную config = DEFAULT_CONFIG.copy() и измените весь последующий код на:
config = DEFAULT_CONFIG.copy()
config.update({
    "mount_path": "/dav",
    "provider_mapping": {
        "/": ScriptProvider(app)
    },
    "domaincontroller": NeedAuthController(app),
    "verbose": 1 if app.debug else 0,
    "dir_browser": {"davmount": False,
                    "enable": True,
                    "msmount": False,
                    "response_trailer": ""},
})
dav_app = WsgiDAVApp(config)

Теперь должен запуститься веб-интерфейс pyspider. Зайдите на сайт http://localhost:5000/ в браузере, и вот что вы должны увидеть:

Пользовательский интерфейс Pyspider

Шаг №2: Создайте новый проект

Нажмите кнопку “Создать”, чтобы создать новый проект, и заполните поля:

  • Выберите название проекта по своему усмотрению, например Hockey_scraper.
  • Установите https://www.scrapethissite.com/pages/forms/ в поле стартового URL-адреса (URL-адресов).

Это должно быть результатом:

Результат создания проекта в Pyspider

Шаг № 3: Определите логику скрапинга

Реализуйте логику скрапинга, написав код на Python прямо в редакторе в правой части пользовательского интерфейса:

from pyspider.libs.base_handler import *

class Handler(BaseHandler):
    crawl_config = {}

    @every(minutes=24 * 60)
    def on_start(self):
        self.crawl("https://www.scrapethissite.com/pages/forms/", callback=self.index_page)

    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        for each in response.doc("table.table tr").items():
            self.crawl(each.attr.href, callback=self.detail_page)

    @config(priority=2)
    def detail_page(self, response):
        return {
            "name": row.css("td.name::text").get(),
            "year": row.css("td.year::text").get(),
            "wins": row.css("td.wins::text").get(),
            "losses": row.css("td.losses::text").get(),
            "ot_losses": row.css("td.ot-losses::text").get(),
            "pct": row.css("td.pct::text").get(),
            "gf": row.css("td.gf::text").get(),
            "ga": row.css("td.ga::text").get(),
            "diff": row.css("td.diff::text").get(),
        }

Вот что изменилось по сравнению с кодом по умолчанию:

  • Метод response.doc() выполняет поиск целевой таблицы.
  • detail_page() возвращает строки, которые были перехвачены с помощью метода row.css().

Нажмите “Сохранить” и “Запустить”, чтобы запустить процесс скрапирования. Полученные данные будут похожи на те, что вы получили с помощью Scrapy.

Отлично! Теперь вы знаете, как использовать Scrapy и Pyspider для веб-скрапинга.

Scrapy против Pyspider: Что лучше использовать?

Сравнение Scrapy и Pyspider показало, как их использовать, но какой из них лучше? Пришло время узнать!

Выберите Scrapy:

  • Для высокопроизводительных проектов, нуждающихся в параллельной обработке данных и расширенных функциях, таких как дросселирование.
  • Если вам нужно интегрировать скраппинг с внешними конвейерами или другими инструментами.
  • Если вы уверенно используете CLI и сценарии веб-скрапинга и предпочитаете современный фреймворк.

Выбирайте Pyspider, если:

  • Вы предпочитаете использовать пользовательский интерфейс вместо CLI.
  • Вы хотите работать в распределенной системе и предпочитаете простые конфигурации.
  • Вы хотите запланировать задания по скрапбукингу.

Как всегда, здесь нет однозначного победителя – лучший инструмент для скраппинга зависит исключительно от ваших конкретных потребностей и условий использования.

Ограничения Scrapy и Pyspider

Scrapy и Pyspider – мощные фреймворки для веб-скрапинга, но у них есть свои ограничения.

Во-первых, они не справляются с отбором сайтов с динамическим контентом, которые используют JavaScript для визуализации или получения данных. Несмотря на то, что оба продукта могут быть расширены для соскабливания сайтов с JavaScript, они по своей сути ограничены в этом аспекте. Это также делает их более восприимчивыми к обычным мерам по борьбе со скаппингом.

Кроме того, оба этих фреймворка подвержены IP-запретам, поскольку выполняют большое количество автоматических запросов. Они могут вызвать срабатывание ограничителей скорости, что приведет к попаданию вашего IP в черный список. Решение для предотвращения запрета вашего IP – интегрировать прокси в ваш код.

О ротации прокси смотрите наше руководство о том , как использовать прокси для ротации IP-адресов в Python.

Наконец, если вы ищете надежные прокси-серверы, имейте в виду, что прокси-сети Bright Data доверяют компании из списка Fortune 500 и более 20 000 клиентов по всему миру. Эта обширная сеть включает в себя:

Заключение

В этой статье блога Scrapy vs Pyspider вы узнали о роли этих двух библиотек в веб-скрапинге. Вы изучили их возможности для извлечения данных и сравнили их производительность в реальном сценарии пагинации.

Pyspider обеспечивает дружественный пользовательский интерфейс, но, к сожалению, уже устарел. Scrapy полезен для крупных проектов, поскольку он предоставляет большинство инструментов, необходимых для структурированного скраппинга, и его базовая технология обновляется с помощью последних версий Python.

Вы также узнали об их ограничениях, таких как потенциальные запреты IP-адресов. К счастью, эти проблемы можно преодолеть с помощью прокси-серверов или специализированных решений для веб-скрепинга, таких как Bright Data’s Web Scraper API. Этот API, ориентированный на скраппинг, легко интегрируется со Scrapy, Pyspider и любым другим HTTP-клиентом или инструментом для скраппинга, обеспечивая неограниченное извлечение данных.

Создайте бесплатную учетную запись Bright Data сегодня, чтобы изучить наши API для прокси и скребков!

Кредитная карта не требуется