# 命令行工具
> 譯者:[OSGeo 中國](https://www.osgeo.cn/)
0.10 新版功能.
Scrapy 通過控制 `scrapy` 命令行工具,這里稱為“scrapy工具”,用于區分子命令,我們稱之為“命令”或“scrapy命令”。
Scrapy工具提供了多個命令,用于多種目的,每個命令接受一組不同的參數和選項。
(The `scrapy deploy` 命令已在1.0中刪除,以支持獨立的 `scrapyd-deploy` . 見 [Deploying your project](https://scrapyd.readthedocs.io/en/latest/deploy.html) )
## 配置設置
Scrapy將查找ini樣式的配置參數 `scrapy.cfg` 標準位置的文件:
1. `/etc/scrapy.cfg` 或 `c:\scrapy\scrapy.cfg` (全系統)
2. `~/.config/scrapy.cfg` ( `$XDG_CONFIG_HOME` ) `~/.scrapy.cfg` ( `$HOME` )用于全局(用戶范圍)設置,以及
3. `scrapy.cfg` 在Scrapy項目的根目錄中(參見下一節)。
這些文件中的設置按列出的首選順序合并:用戶定義的值比系統范圍的默認值具有更高的優先級,并且在定義時,項目范圍的設置將覆蓋所有其他設置。
Scrapy還可以理解并通過許多環境變量進行配置。目前有:
* `SCRAPY_SETTINGS_MODULE` (見 [指定設置](settings.html#topics-settings-module-envvar) )
* `SCRAPY_PROJECT` (見 [在項目之間共享根目錄](#topics-project-envvar) )
* `SCRAPY_PYTHON_SHELL` (見 [Scrapy shell](shell.html#topics-shell) )
## Scrapy 項目的默認結構
在深入研究命令行工具及其子命令之前,讓我們先了解一個零碎項目的目錄結構。
盡管可以修改,但默認情況下,所有零碎項目都具有相同的文件結構,類似于:
```py
scrapy.cfg
myproject/
__init__.py
items.py
middlewares.py
pipelines.py
settings.py
spiders/
__init__.py
spider1.py
spider2.py
...
```
目錄 `scrapy.cfg` 文件駐留稱為 項目根目錄. 該文件包含定義項目設置的python模塊的名稱。下面是一個例子:
```py
[settings]
default = myproject.settings
```
## 在項目之間共享根目錄
一個項目根目錄,其中包含 `scrapy.cfg` ,可以由多個零碎項目共享,每個項目都有自己的設置模塊。
在這種情況下,必須為下面的設置模塊定義一個或多個別名 `[settings]` 在你 `scrapy.cfg` 文件::
```py
[settings]
default = myproject1.settings
project1 = myproject1.settings
project2 = myproject2.settings
```
默認情況下, `scrapy` 命令行工具將使用 `default` 設置。使用 `SCRAPY_PROJECT` 用于指定其他項目的環境變量 `scrapy` 使用:
```py
$ scrapy settings --get BOT_NAME
Project 1 Bot
$ export SCRAPY_PROJECT=project2
$ scrapy settings --get BOT_NAME
Project 2 Bot
```
## 使用 `scrapy` 工具
您可以通過運行無參數的scrapy工具開始,它將打印一些用法幫助和可用的命令:
```py
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
[...]
```
如果您在一個零碎的項目中,第一行將打印當前活動的項目。在本例中,它是從項目外部運行的。如果從項目內部運行,它將打印如下內容:
```py
Scrapy X.Y - project: myproject
Usage:
scrapy <command> [options] [args]
[...]
```
### 創建項目
你通常會做的第一件事就是 `scrapy` 工具是創建零碎項目:
```py
scrapy startproject myproject [project_dir]
```
它將在 `project_dir` 目錄。如果 `project_dir` 沒有指定, `project_dir` 將與 `myproject` .
接下來,進入新的項目目錄:
```py
cd project_dir
```
你已經準備好使用 `scrapy` 從那里管理和控制項目的命令。
### 控制性項目
你使用 `scrapy` 從項目內部使用工具來控制和管理它們。
例如,要創建新的 Spider :
```py
scrapy genspider mydomain mydomain.com
```
一些下流的命令(比如 [`crawl`](#std:command-crawl) )必須從零碎的項目內部運行。見 [commands reference](#topics-commands-ref) 下面是關于必須從項目內部運行哪些命令的詳細信息,而不是。
還要記住,當從內部項目運行某些命令時,它們的行為可能略有不同。例如,fetch命令將使用 Spider 重寫的行為(例如 `user_agent` 屬性來重寫用戶代理)如果要獲取的URL與某個特定的 Spider 相關聯。這是故意的,因為 `fetch` 命令用于檢查 Spider 如何下載頁面。
## 可用工具命令
本節包含可用的內置命令列表,其中包含說明和一些用法示例。記住,您可以通過運行以下命令獲取有關每個命令的更多信息:
```py
scrapy <command> -h
```
您可以使用以下命令查看所有可用命令:
```py
scrapy -h
```
有兩種命令,一種是只從零碎項目(特定于項目的命令)內部工作的命令,另一種是不使用活動零碎項目(全局命令)的命令,盡管從項目內部運行時它們的行為可能略有不同(因為它們將使用項目覆蓋設置)。
全局命令:
* [`startproject`](#std:command-startproject)
* [`genspider`](#std:command-genspider)
* [`settings`](#std:command-settings)
* [`runspider`](#std:command-runspider)
* [`shell`](#std:command-shell)
* [`fetch`](#std:command-fetch)
* [`view`](#std:command-view)
* [`version`](#std:command-version)
僅Project命令:
* [`crawl`](#std:command-crawl)
* [`check`](#std:command-check)
* [`list`](#std:command-list)
* [`edit`](#std:command-edit)
* [`parse`](#std:command-parse)
* [`bench`](#std:command-bench)
### 啟動項目
* Syntax: `scrapy startproject <project_name> [project_dir]`
* 需要項目:_否_
創建一個名為 `project_name` 下 `project_dir` 目錄。如果 `project_dir` 沒有指定, `project_dir` 將與 `project_name` .
使用實例:
```py
$ scrapy startproject myproject
```
### 基因 Spider
* Syntax: `scrapy genspider [-t template] <name> <domain>`
* 需要項目:_否_
在當前文件夾或當前項目的 `spiders` 文件夾(如果從項目內部調用)。這個 `<name>` 參數設置為spider的 `name` ,同時 `<domain>` 用于生成 `allowed_domains` 和 `start_urls` Spider 的屬性。
使用實例:
```py
$ 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'
```
這只是一個基于預先定義的模板創建spider的快捷命令,但肯定不是創建spider的唯一方法。您可以自己創建 Spider 源代碼文件,而不是使用這個命令。
### 爬行
* Syntax: `scrapy crawl <spider>`
* 需要項目:_是_
開始用 Spider 爬行。
用法示例:
```py
$ scrapy crawl myspider
[ ... myspider starts crawling ... ]
```
### 檢查
* Syntax: `scrapy check [-l] <spider>`
* 需要項目:_是_
運行合同檢查。
用法示例:
```py
$ 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
```
### 列表
* Syntax: `scrapy list`
* 需要項目:_是_
列出當前項目中所有可用的spider。每行輸出一個 Spider 。
使用實例:
```py
$ scrapy list
spider1
spider2
```
### 編輯
* Syntax: `scrapy edit <spider>`
* 需要項目:_是_
使用中定義的編輯器編輯給定的 Spider `EDITOR` 環境變量或(如果未設置) [`EDITOR`](settings.html#std:setting-EDITOR) 設置。
這個命令僅作為最常見情況下的快捷方式提供,開發人員當然可以自由選擇任何工具或IDE來編寫和調試spider。
使用實例:
```py
$ scrapy edit spider1
```
### 取來
* Syntax: `scrapy fetch <url>`
* 需要項目:_否_
使用ScrapyDownloader下載給定的URL,并將內容寫入標準輸出。
這個命令的有趣之處在于它獲取了 Spider 如何下載它的頁面。例如,如果 Spider `USER_AGENT` 覆蓋用戶代理的屬性,它將使用該屬性。
所以這個命令可以用來“查看” Spider 如何獲取特定的頁面。
如果在項目之外使用,則不會應用特定的每 Spider 行為,它只會使用默認的scrapy下載器設置。
支持的選項:
* `--spider=SPIDER` :繞過Spider自動檢測并強制使用特定Spider
* `--headers` :打印響應的HTTP頭而不是響應的正文
* `--no-redirect` :不遵循HTTP 3xx重定向(默認為遵循它們)
用法示例:
```py
$ 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)']}
```
### 看法
* Syntax: `scrapy view <url>`
* 需要項目:_否_
在瀏覽器中打開給定的URL,因為您的廢 Spider 會“看到”它。有時候 Spider 看到的頁面與普通用戶不同,所以這可以用來檢查 Spider “看到”什么,并確認它是你所期望的。
支持的選項:
* `--spider=SPIDER` :繞過Spider自動檢測并強制使用特定Spider
* `--no-redirect` :不遵循HTTP 3xx重定向(默認為遵循它們)
使用實例:
```py
$ scrapy view http://www.example.com/some/page.html
[ ... browser starts ... ]
```
### 殼
* Syntax: `scrapy shell [url]`
* 需要項目:_否_
為給定的URL(如果給定)啟動scrapy shell;如果沒有給定URL,則為空。還支持Unix風格的本地文件路徑,無論是相對于 `./` 或 `../` 前綴或絕對文件路徑。見 [Scrapy shell](shell.html#topics-shell) 更多信息。
支持的選項:
* `--spider=SPIDER` :繞過Spider自動檢測并強制使用特定Spider
* `-c code` :評估shell中的代碼,打印結果并退出
* `--no-redirect` :不遵循HTTP 3xx重定向(默認為遵循它們);這只影響在命令行上作為參數傳遞的URL;一旦進入shell, `fetch(url)` 默認情況下仍將遵循HTTP重定向。
使用實例:
```py
$ 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')
```
### 解析
* Syntax: `scrapy parse <url> [options]`
* 需要項目:_是_
獲取給定的URL,并使用處理它的spider,使用 `--callback` 選項,或 `parse` 如果沒有給出。
支持的選項:
* `--spider=SPIDER` :繞過Spider自動檢測并強制使用特定Spider
* `--a NAME=VALUE` :set spider參數(可以重復)
* `--callback` 或 `-c` :用作分析響應的回調的spider方法
* `--meta` 或 `-m` :將傳遞給回調請求的附加請求元。這必須是有效的JSON字符串。示例:--meta='“foo”:“bar”'
* `--pipelines` :通過管道處理項目
* `--rules` 或 `-r` 使用 [`CrawlSpider`](spiders.html#scrapy.spiders.CrawlSpider "scrapy.spiders.CrawlSpider") 發現用于解析響應的回調(即spider方法)的規則
* `--noitems` :不顯示刮掉的項目
* `--nolinks` :不顯示提取的鏈接
* `--nocolour` :避免使用Pygments對輸出著色
* `--depth` 或 `-d` :應遞歸執行請求的深度級別(默認值:1)
* `--verbose` 或 `-v` :顯示每個深度級別的信息
使用實例:
```py
$ 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 -----------------------------------------------------------------
[]
```
### 設置
* Syntax: `scrapy settings [options]`
* 需要項目:_否_
獲取 Scrapy 設置的值。
如果在項目中使用,它將顯示項目設置值,否則它將顯示該設置的默認碎片值。
示例用法:
```py
$ scrapy settings --get BOT_NAME
scrapybot
$ scrapy settings --get DOWNLOAD_DELAY
0
```
### 運行 Spider
* Syntax: `scrapy runspider <spider_file.py>`
* 需要項目:_否_
運行一個包含在python文件中的spider,而不必創建一個項目。
示例用法:
```py
$ scrapy runspider myspider.py
[ ... spider starts crawling ... ]
```
### 版本
* Syntax: `scrapy version [-v]`
* 需要項目:_否_
打印殘缺版本。如果使用 `-v` 它還打印python、twisted和platform信息,這對bug報告很有用。
### 長凳
0.17 新版功能.
* Syntax: `scrapy bench`
* 需要項目:_否_
運行一個快速基準測試。 [Benchmarking](benchmarking.html#benchmarking) .
## 自定義項目命令
還可以使用 [`COMMANDS_MODULE`](#std:setting-COMMANDS_MODULE) 設置。請參閱中的scrappy命令 [scrapy/commands](https://github.com/scrapy/scrapy/tree/master/scrapy/commands) 有關如何實現命令的示例。
### COMMANDS_MODULE
違約: `''` (空字符串)
用于查找自定義 Scrapy 命令的模塊。這用于為您的Scrapy項目添加自定義命令。
例子::
```py
COMMANDS_MODULE = 'mybot.commands'
```
### 通過setup.py入口點注冊命令
注解
這是一個實驗特性,小心使用。
還可以通過添加 `scrapy.commands` 庫入口點中的節 `setup.py` 文件。
下面的示例添加了 `my_command` 命令:
```py
from setuptools import setup, find_packages
setup(name='scrapy-mymodule',
entry_points={
'scrapy.commands': [
'my_command=my_scrapy_module.commands:MyCommand',
],
},
)
```
- 簡介
- 第一步
- Scrapy at a glance
- 安裝指南
- Scrapy 教程
- 實例
- 基本概念
- 命令行工具
- Spider
- 選擇器
- 項目
- 項目加載器
- Scrapy shell
- 項目管道
- Feed 導出
- 請求和響應
- 鏈接提取器
- 設置
- 例外情況
- 內置服務
- Logging
- 統計數據集合
- 發送電子郵件
- 遠程登錄控制臺
- Web服務
- 解決具體問題
- 常見問題
- 調試spiders
- Spider 合約
- 常用做法
- 通用爬蟲
- 使用瀏覽器的開發人員工具進行抓取
- 調試內存泄漏
- 下載和處理文件和圖像
- 部署 Spider
- AutoThrottle 擴展
- Benchmarking
- 作業:暫停和恢復爬行
- 延伸 Scrapy
- 體系結構概述
- 下載器中間件
- Spider 中間件
- 擴展
- 核心API
- 信號
- 條目導出器
- 其余所有
- 發行說明
- 為 Scrapy 貢獻
- 版本控制和API穩定性