Инструмент командной строки

Scrapy управляется с помощью инструмента командной строки scrapy, называемого здесь «инструментом Scrapy», чтобы отличать его от подкоманд, которые мы просто называем «командами» или «командами Scrapy».

Инструмент Scrapy предоставляет несколько команд для разных целей, каждая из которых принимает разные наборы аргументов и опций.

(Команда scrapy deploy была удалена в 1.0 в пользу автономной scrapyd-deploy. См. Развёртывание вашего проекта.)

Настройки конфигурации

Scrapy будет искать параметры конфигурации в файлах scrapy.cfg в стиле ini в стандартных местах:

  1. /etc/scrapy.cfg или c:\scrapy\scrapy.cfg (в масштабе всей системы) ,

  2. ~/.config/scrapy.cfg ($XDG_CONFIG_HOME) и ~/.scrapy.cfg ($HOME) для глобальных (пользовательских) настроек и

  3. scrapy.cfg внутри корня проекта Scrapy (см. следующий раздел).

Параметры из данных файлов объединяются в указанном порядке предпочтения: значения, определённые пользователем, имеют более высокий приоритет, чем значения по умолчанию для всей системы, а параметры для всего проекта имеют приоритет над всеми остальными, если они определены.

Scrapy также понимает и может быть настроен с помощью ряда переменных среды. В настоящее время они следующие:

Стандартная структура проектов Scrapy

Прежде чем углубляться в инструмент командной строки и его подкоманды, давайте сначала разберёмся со структурой каталогов проекта Scrapy.

Хотя его можно изменить, все проекты Scrapy по умолчанию имеют одинаковую файловую структуру, аналогичную этой:

scrapy.cfg
myproject/
    __init__.py
    items.py
    middlewares.py
    pipelines.py
    settings.py
    spiders/
        __init__.py
        spider1.py
        spider2.py
        ...

Каталог, в котором находится файл scrapy.cfg, известен как каталог корня проекта. Данный файл содержит имя модуля python, который определяет настройки проекта. Вот пример:

[settings]
default = myproject.settings

Совместное использование корневого каталога между проектами

Корневой каталог проекта, содержащий scrapy.cfg, может использоваться несколькими проектами Scrapy, каждый со своим собственным модулем настроек.

В этом случае вы должны определить один или несколько псевдонимов для данных модулей настроек в [settings] в вашем файле scrapy.cfg:

[settings]
default = myproject1.settings
project1 = myproject1.settings
project2 = myproject2.settings

По умолчанию инструмент командной строки scrapy будет использовать параметры default. Используйте переменную среды SCRAPY_PROJECT, чтобы указать другой проект, который будет использовать scrapy:

$ scrapy settings --get BOT_NAME
Project 1 Bot
$ export SCRAPY_PROJECT=project2
$ scrapy settings --get BOT_NAME
Project 2 Bot

С помощью инструмента scrapy

Вы можете начать с запуска инструмента Scrapy без аргументов, и он напечатает некоторую справку по использованию и доступные команды:

Scrapy X.Y - no active project

Usage:
  scrapy <command> [options] [args]

Available commands:
  crawl         Run a spider
  fetch         Fetch a URL using the Scrapy downloader
[...]

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

Scrapy X.Y - project: myproject

Usage:
  scrapy <command> [options] [args]

[...]

Создание проектов

Первое, что вы обычно делаете с помощью инструмента scrapy — это создаёте проект Scrapy:

scrapy startproject myproject [project_dir]

Эта инструкция создаст проект Scrapy в каталоге project_dir. Если project_dir не указан, project_dir будет таким же, как myproject.

Затем вы заходите в новый каталог проекта:

cd project_dir

И вы готовы использовать команду scrapy для управления своим проектом оттуда.

Контролирующие проекты

Вы используете инструмент scrapy изнутри своих проектов, чтобы контролировать их и управлять ими.

Например, чтобы создать нового паука:

scrapy genspider mydomain mydomain.com

Некоторые команды Scrapy (например, crawl) необходимо запускать из проекта Scrapy. См. справочник по командам ниже для получения дополнительной информации о том, какие команды нужно запускать изнутри проекта, а какие нет.

Также имейте в виду, что некоторые команды могут иметь немного другое поведение при запуске изнутри проекта. Например, команда выборки будет использовать поведение, переопределенное пауком (например, атрибут user_agent для переопределения пользовательского агента), если извлекаемый URL-адрес связан с каким-то конкретным пауком. Это сделано намеренно, поскольку команда fetch предназначена для проверки того, как пауки загружают страницы.

Доступные команды инструмента

В этом разделе содержится список доступных встроенных команд с описанием и некоторыми примерами использования. Помните, что вы всегда можете получить дополнительную информацию о каждой команде, запустив:

scrapy <command> -h

И вы можете увидеть все доступные команды с помощью:

scrapy -h

Есть два типа команд: те, которые работают только внутри проекта Scrapy (команды для конкретного проекта), и те, которые также работают без активного проекта Scrapy (глобальные команды), хотя они могут вести себя немного по-другому при запуске изнутри проекта (поскольку они использовали бы переопределенные настройки проекта).

Глобальные команды:

Команды только для проекта:

startproject

  • Синтаксис: scrapy startproject <project_name> [project_dir]

  • Требуется проект: нет

Создаёт новый проект Scrapy с именем project_name в каталоге project_dir. Если project_dir не указан, project_dir будет таким же, как project_name.

Пример использования:

$ scrapy startproject myproject

genspider

  • Синтаксис: scrapy genspider [-t template] <name> <domain>

  • Требуется проект: нет

Создать нового паука в текущей папке или в папке spiders текущего проекта, если вызывается изнутри проекта. Параметр <name> устанавливается как name паука, а <domain> используется для создания атрибутов паука allowed_domains и start_urls.

Пример использования:

$ scrapy genspider -l
Available templates:
  basic
  crawl
  csvfeed
  xmlfeed

$ scrapy genspider example example.com
Created spider 'example' using template 'basic'

$ scrapy genspider -t crawl scrapyorg scrapy.org
Created spider 'scrapyorg' using template 'crawl'

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

crawl

  • Синтаксис: scrapy crawl <spider>

  • Требуется проект: да

Запуск парсинга с помощью паука.

Примеры использования:

$ scrapy crawl myspider
[ ... myspider starts crawling ... ]

check

  • Синтаксис: scrapy check [-l] <spider>

  • Требуется проект: да

Выполнение проверки контрактов.

Примеры использования:

$ scrapy check -l
first_spider
  * parse
  * parse_item
second_spider
  * parse
  * parse_item

$ scrapy check
[FAILED] first_spider:parse_item
>>> 'RetailPricex' field is missing

[FAILED] first_spider:parse
>>> Returned 92 requests, expected 0..4

list

  • Синтаксис: scrapy list

  • Требуется проект: да

Список всех доступных пауков в текущем проекте. Вывод — по одному пауку на строку.

Пример использования:

$ scrapy list
spider1
spider2

edit

  • Синтаксис: scrapy edit <spider>

  • Требуется проект: да

Отредактируйте данного паука с помощью редактора, определенного в переменной среды EDITOR или (если не задано) в настройке EDITOR.

Эта команда предоставляется только в качестве удобного ярлыка для наиболее распространенного случая, разработчик, конечно, может выбрать любой инструмент или IDE для написания и отладки пауков.

Пример использования:

$ scrapy edit spider1

fetch

  • Синтаксис: scrapy fetch <url>

  • Требуется проект: нет

Загружает указанный URL-адрес с помощью загрузчика Scrapy и записывает содержимое в стандартный вывод.

Что интересно в этой команде, так это то, что она загружает страницу так, как её скачает паук. Например, если у паука есть атрибут USER_AGENT, который переопределяет User Agent, он будет использовать данный атрибут.

Таким образом, эту команду можно использовать, чтобы «увидеть», как ваш паук получит определённую страницу.

При использовании вне проекта не будет применяться какое-либо конкретное поведение для каждого паука, и будут просто использоваться настройки загрузчика Scrapy по умолчанию.

Поддерживаемые варианты:

  • --spider=SPIDER: обход автоматического обнаружения паука и принудительное использование конкретного паука

  • --headers: печатать заголовки HTTP ответа вместо тела ответа

  • --no-redirect: не следовать перенаправлениям HTTP 3xx (по умолчанию следовать им)

Примеры использования:

$ scrapy fetch --nolog http://www.example.com/some/page.html
[ ... html content here ... ]

$ scrapy fetch --nolog --headers http://www.example.com/
{'Accept-Ranges': ['bytes'],
 'Age': ['1263   '],
 'Connection': ['close     '],
 'Content-Length': ['596'],
 'Content-Type': ['text/html; charset=UTF-8'],
 'Date': ['Wed, 18 Aug 2010 23:59:46 GMT'],
 'Etag': ['"573c1-254-48c9c87349680"'],
 'Last-Modified': ['Fri, 30 Jul 2010 15:30:18 GMT'],
 'Server': ['Apache/2.2.3 (CentOS)']}

view

  • Синтаксис: scrapy view <url>

  • Требуется проект: нет

Открывает указанный URL-адрес в браузере, как ваш «паук» Scrapy «видит» его. Иногда пауки видят страницы не так, как обычные пользователи, поэтому это можно использовать для проверки того, что «видит» паук, и подтверждения того, что вы ожидаете.

Поддерживаемые варианты:

  • --spider=SPIDER: обход автоматического обнаружения паука и принудительное использование конкретного паука

  • --no-redirect: не следовать перенаправлениям HTTP 3xx (по умолчанию следовать им)

Пример использования:

$ scrapy view http://www.example.com/some/page.html
[ ... browser starts ... ]

shell

  • Синтаксис: scrapy shell [url]

  • Требуется проект: нет

Запускает оболочку Scrapy для данного URL (если указан) или пусто, если URL не указан. Также поддерживает локальные пути к файлам в стиле UNIX, относительные с префиксом ./ или ../ или абсолютные пути к файлам. См. Оболочка Scrapy для получения дополнительной информации.

Поддерживаемые варианты:

  • --spider=SPIDER: обход автоматического обнаружения паука и принудительное использование конкретного паука

  • -c code: вычислить код в оболочке, распечатать результат и выйти

  • --no-redirect: не следовать перенаправлениям HTTP 3xx (по умолчанию следовать им); это влияет только на URL-адрес, который вы можете передать в качестве аргумента в командной строке; как только вы окажетесь внутри оболочки, fetch(url) по-прежнему будет следовать HTTP-перенаправлениям по умолчанию.

Пример использования:

$ scrapy shell http://www.example.com/some/page.html
[ ... scrapy shell starts ... ]

$ scrapy shell --nolog http://www.example.com/ -c '(response.status, response.url)'
(200, 'http://www.example.com/')

# shell follows HTTP redirects by default
$ scrapy shell --nolog http://httpbin.org/redirect-to?url=http%3A%2F%2Fexample.com%2F -c '(response.status, response.url)'
(200, 'http://example.com/')

# you can disable this with --no-redirect
# (only for the URL passed as command line argument)
$ scrapy shell --no-redirect --nolog http://httpbin.org/redirect-to?url=http%3A%2F%2Fexample.com%2F -c '(response.status, response.url)'
(302, 'http://httpbin.org/redirect-to?url=http%3A%2F%2Fexample.com%2F')

parse

  • Синтаксис: scrapy parse <url> [options]

  • Требуется проект: да

Получает указанный URL-адрес и анализирует его с помощью паука, который его обрабатывает, используя метод, переданный с параметром --callback, или parse, если он не указан.

Поддерживаемые варианты:

  • --spider=SPIDER: обход автоматического обнаружения паука и принудительное использование конкретного паука

  • --a NAME=VALUE: установить аргумент паука (может повторяться)

  • --callback или -c: метод паука для использования в качестве обратного вызова для анализа ответа

  • --meta или -m: дополнительный мета-запрос, который будет передан в запрос обратного вызова. Это должна быть допустимая строка json. Пример: –meta = «{»foo«: »bar«}»

  • --cbkwargs: дополнительные ключевые аргументы, которые будут переданы функции обратного вызова. Это должна быть допустимая строка json. Пример: –cbkwargs = «{»foo«: »bar«}»

  • --pipelines: обрабатывать элементы по конвейерам

  • --rules или -r: использовать правила CrawlSpider для обнаружения обратного вызова (т. е. метода паука), который будет использоваться для парсинга ответа

  • --noitems: не показывать распарсенные элементы

  • --nolinks: не показывать извлечённые ссылки

  • --nocolour: избегать использования pygments для раскрашивания вывода

  • --depth или -d: уровень глубины, для которого запросы должны выполняться рекурсивно (по умолчанию: 1)

  • --verbose или -v: отображать информацию для каждого уровня глубины

  • --output или -o: выгрузить скопированные элементы в файл

    Добавлено в версии 2.3.

Пример использования:

$ scrapy parse http://www.example.com/ -c parse_item
[ ... scrapy log lines crawling example.com spider ... ]

>>> STATUS DEPTH LEVEL 1 <<<
# Scraped Items  ------------------------------------------------------------
[{'name': 'Example item',
 'category': 'Furniture',
 'length': '12 cm'}]

# Requests  -----------------------------------------------------------------
[]

settings

  • Синтаксис: scrapy settings [options]

  • Требуется проект: нет

Получить значение параметра Scrapy.

При использовании внутри проекта будет отображаться значение параметра проекта, в противном случае будет отображаться значение Scrapy по умолчанию для этого параметра.

Пример использования:

$ scrapy settings --get BOT_NAME
scrapybot
$ scrapy settings --get DOWNLOAD_DELAY
0

runspider

  • Синтаксис: scrapy runspider <spider_file.py>

  • Требуется проект: нет

Запускать паука автономно в файле Python, не создавая проект.

Пример использования:

$ scrapy runspider myspider.py
[ ... spider starts crawling ... ]

version

  • Синтаксис: scrapy version [-v]

  • Требуется проект: нет

Печатает версию Scrapy. При использовании с -v он также выводит информацию о Python, Twisted и Platform, которая полезна для отчетов об ошибках.

bench

  • Синтаксис: scrapy bench

  • Требуется проект: нет

Выполнить быстрый тест производительности. Бенчмаркинг.

Пользовательские команды проекта

Вы также можете добавить свои собственные команды проекта, используя параметр COMMANDS_MODULE. См. команды Scrapy в scrapy/commands для примеров того, как реализовать ваши команды.

COMMANDS_MODULE

По умолчанию: '' (пустая строка)

Модуль для поиска пользовательских команд Scrapy. Это используется для добавления пользовательских команд для вашего проекта Scrapy.

Пример:

COMMANDS_MODULE = 'mybot.commands'

Зарегистрировать команды через точки входа setup.py

Вы также можете добавить команды Scrapy из внешней библиотеки, добавив раздел scrapy.commands в точки входа файла библиотеки setup.py.

В следующем примере добавляется команда my_command:

from setuptools import setup, find_packages

setup(name='scrapy-mymodule',
  entry_points={
    'scrapy.commands': [
      'my_command=my_scrapy_module.commands:MyCommand',
    ],
  },
 )