在系统命令行中,使用 scrapy 命令可以创建工程或启动爬虫,它控制着 Scrapy 的行为,我们称之为 Scrapy 命令行工具(command-line tool)或 Scrapy 工具(Scrapy tool)。紧跟在 scrapy 命令之后的命令属于子命令(我们称之为“命令(commands)”或“Scrapy命令(Scrapy commands)”,例如用于新建项目的 startproject 命令)。
Scrapy 工具包含许多命令,有各自的功能、参数和选项。
(scrapy deploy 命令已在1.0中删除,取而代之的是 scryd-deploy,请参阅 Deploying your project。)
配置设置
Scrapy 默认在 scrapy.cfg 文件中查找配置参数:
- 系统范围:
/etc/scrapy.cfg
或c:\scrapy\scrapy.cfg
- 用户范围:
~/.config/scrapy.cfg
($XDG_CONFIG_HOME
) 和~/.scrapy.cfg (
$HOME
) - 项目内范围:scrapy.cfg
项目范围的设置将覆盖所有其他文件的设置,用户范围内定义的设置的覆盖系统范围内的设置。
Scrapy 也可以接受来自环境变量的配置。目前有:
-
SCRAPY_SETTINGS_MODULE
(见 Designating the settings) SCRAPY_PROJECT
-
SCRAPY_PYTHON_SHELL
(见 Scrapy shell)
Scrapy项目的默认结构
在深入了解命令行工具及其子命令之前,先来看一下 Scrapy 项目的目录结构。
虽然可以修改,但默认所有的 Scrapy 项目都具有相同的文件结构,与此类似:
scrapy.cfg myproject/ __init__.py items.py pipelines.py settings.py spiders/ __init__.py spider1.py spider2.py ...
scrapy.cfg 文件所在的目录称为项目根目录(project root directory)。 该文件中声明了项目设置所在的 python 模块。例如:
[settings] default = myproject.settings
(myproject.settings 指 /myproject/settings.py)
使用 scrapy 工具
在没有参数的情况下直接运行 scrapy 命令将得到一些使用帮助和可用的命令,如下所示(X.Y 是版本号):
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]
这将在 project_dir 目录下创建一个 Scrapy 项目。如果没有指定 project_dir,将会在与 myproject 同名的目录中创建项目(如果没有则创建它)。
接下来,进入新建项目的根目录:
cd project_dir
现在,您已经准备好了使用 scrapy 命令来管理和控制您的项目。
管理项目
在项目内(即在项目根目录下)您可以使用 scrapy 工具来控制和管理您的项目。
例如,新建一个爬虫:
scrapy genspider mydomain mydomain.com
一些 Scrapy 命令(如 crawl)必须在 Scrapy 项目内运行。 具体请参阅下一节:scrapy 工具中的命令。
一些命令在从项目内部运行时可能稍有不同。 例如,如果要获取的 URL 与某个特定的爬虫相关联,则 fetch 命令将使用爬虫重载的行为(例如爬虫的
user_agent 属性将覆盖默认的 user-agent)。 这是有意的,因为 fetch 命令旨在检查爬虫是怎样下载页面的。
scrapy 工具中的命令
本节介绍 Scrapy 的内置命令、说明和一些示例。 记住,您可以随时通过运行下面的命令来获取有关每个命令的更多信息:
scrapy <command> -h
您也通过下面的命令查看所有可用的命令:
scrapy -h
有两种命令,仅在 Scrapy 项目内工作的命令(项目命令:Project-specific commands)以及也可以在项目外工作的命令(全局命令:Global commands),尽管它们在项目内运行时可能会略有不同(此时会使用项目重载的设置)。
全局命令:
startproject
genspider
settings
runspider
shell
fetch
view
version
项目命令:
crawl
check
list
edit
parse
bench
startproject
- 语法:scrapy startproject <project_name> [project_dir]
- 必须在项目内使用:否
在 project_dir 目录下新建一个名为 project_name 的 Scrapy 项目。 如果没有指定 project_dir,project_dir 将与 myproject 同名。
示例:
$ scrapy startproject myproject
genspider
- 语法:scrapy genspider [-t template] <name> <domain>
- 必须在项目内使用:否
在当前文件夹或当前项目的 spiders 文件夹中新建一个爬虫。如果在项目中使用此命令。 <name> 参数为爬虫的名称,<domain> 用于生成 allowed_domains 和 start_urls spider 的属性。
示例(template:模板):
$ 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>
- 必须在项目内使用:是
协议(contract)检查。
示例:
$ 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环境变量或设置中定义的编辑器编辑爬虫。
该命令仅作为一种快捷方式提供,开发人员可以*选择工具或IDE来编写和调试爬虫。
示例:
$ scrapy edit spider1
fetch
- 语法:scrapy fetch <url>
- 必须在项目内使用:否
使用 Scrapy 下载器下载给定的 URL,并将内容输出到标准输出流。
这个命令的有趣之处在于它会使用爬虫定义的方式下载页面。 例如,如果爬虫具有 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-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>
- 必须在项目内使用:否
以 Scrapy 爬虫所“看到”的样子在浏览器中打开给定的URL。用来查看爬虫所“看到”的样子是否是你所期望的,因为两者有可能不同。
支持的选项:
- --spider = SPIDER:强制使用给定的爬虫
- --no-redirect:禁用 HTTP 3xx 重定向(默认启用)
示例:
$ scrapy view http://www.example.com/some/page.html [ ... browser starts ... ]
shell
- 语法:scrapy shell [url]
- 必须在项目内使用:否
以给定的 URL(如果给定)启动 Scrapy shell。支持 UNIX 风格的本地文件路径,包括相对路径(./ 或 ../)和绝对路径。请参阅 Scrapy shell 了解更多信息。
支持的选项:
- --spider = SPIDER:强制使用给定的爬虫
- -c code:在 shell 中执行代码,打印结果并退出
- --no-redirect:禁用 HTTP 3xx 重定向(默认启用); 这只会影响您在命令行参数中给定的 URL;,一旦你进入到 shell 中,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/') # 默认启用重定向 $ scrapy shell --nolog http://httpbin.org/redirect-to?url=http%3A%2F%2Fexample.com%2F -c '(response.status, response.url)' (200, 'http://example.com/') # 你可以通过 --no-redirect 禁用重定向 # (只作用于命令行参数中的 URL) $ 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:解析响应对象的回调方法
- --piplines:通过管道处理项
- --rules 或 -r:使用 CrawlSpider 规则查找用于解析响应对象的回调方法
- --noitems:不显示抓取到的项
- --nolinks:不显示提取的链接
- --nocolour:避免使用pygments对输出着色
- --depth 或 -d:递归爬取的深度(默认值:1)
- --verbose 或 -v:显示爬取每一层的信息
示例:
$ scrapy parse http://www.example.com/ -c parse_item [ ... scrapy log lines crawling example.com spider ... ] >>> STATUS DEPTH LEVEL 1 <<< # Scraped Items ------------------------------------------------------------ [{'name': u'Example item', 'category': u'Furniture', 'length': u'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
- 必须在项目内使用:否
运行 benchmark 测试。
自定义命令
您还可以使用 COMMANDS_MODULE 设置添加自定义项目命令。有关如何实现命令的示例,请参阅 scrapy commands 。
COMMANDS_MODULE
默认值:''(空字符串)
用于查找自定义 Scrapy 命令的模块。用于为您的 Scrapy 项目添加自定义命令。
例:
COMMANDS_MODULE = 'mybot.commands'
通过 setup.py 的 entry points 注册命令
注意
这是一个实验性功能,请谨慎使用。
您还可以在 setup.py 文件的 entry point 中添加 scrapy.commands,从外部库添加 Scrapy 命令。
以下示例添加了 my_command 命令:
from setuptools import setup, find_packages setup(name='scrapy-mymodule', entry_points={ 'scrapy.commands': [ 'my_command=my_scrapy_module.commands:MyCommand', ], }, )