Scrapy 教程

Scrapy 命令


Scrapy 针对不同目的提供了多个命令。

创建项目

一般来说,使用 Scrapy 工具的第一件事就是创建您的 Scrapy 项目:

scrapy startproject myproject

该命令将会在 myproject 目录中创建一个Scrapy项目。

接下来,进入到项目目录中:

cd myproject

这时候就可以使用 Scrapy 命令来管理和控制项目了。

控制项目

可以在自己的项目中使用 Scrapy 工具来对其进行控制和管理。

比如,创建一个新的 spider:

scrapy genspider mydomain mydomain.com

有些 Scrapy 命令(比如 crawl)要求必须在 Scrapy 项目中运行。

另外要注意,有些命令在项目里运行时的效果有些许区别。以 fetch 命令为例,如果被爬取的 url 与某个特定 spider 相关联,则该命令将会使用 spider 的动作(spider-overridden behaviours)。(比如 spider 指定的 user_agent)。该表现是有意而为之的。一般来说,fetch 命令就是用来测试检查 spider 是如何下载页面。

内置命令

Scrapy 提供了两种类型的内置命令。

一种必须在 Scrapy 项目中运行(针对项目的命令);另外一种则不需要(全局命令);全局命令在项目中运行时的表现可能会与在非项目中运行有些许差别(因为可能会使用项目的设定)。

全局命令

命令 描述
startproject 在指定文件夹下创建一个指定名的 Scrapy 项目
settings 获取 Scrapy 的相关设定
runspider 在未创建项目的情况下,运行一个编写在 Python 文件中的 spider
shell 以给定的 URL(如果给出)或者空(没有给出 URL)启动 Scrapy shell
fetch 使用 Scrapy 下载器(downloader)下载给定的 URL,并将获取到的内容送到标准输出
view 在浏览器中打开给定的 URL,并以 Scrapy spider 获取到的形式展现
version 输出 Scrapy 相关版本信息

startproject

在 project_name 文件夹下创建一个名为 project_name 的 Scrapy 项目。

语法如下:

scrapy startproject <project_name>

示例如下:

$ scrapy startproject myproject

settings

获取 Scrapy 的设定。在项目中运行时,该命令将会输出项目的设定值,否则输出 Scrapy 默认设定。

语法如下:

scrapy settings [options]

示例如下:

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

runspider

在未创建项目的情况下,运行一个编写在 Python 文件中的 spider。

语法如下:

scrapy runspider <spider_file.py>

示例如下:

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

shell

以给定的 URL(如果给出)或者空(没有给出 URL)启动 Scrapy shell。

语法如下:

scrapy shell [url]

示例如下:

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

fetch

使用 Scrapy 下载器(downloader)下载给定的 URL,并将获取到的内容送到标准输出。

该命令以 spider 下载页面的方式获取页面。例如,如果 spider 有 USER_AGENT 属性修改了 User Agent,该命令将会使用该属性。

因此,您可以使用该命令来查看 spider 如何获取某个特定页面。

该命令如果非项目中运行则会使用默认 Scrapy downloader 设定。

语法如下:

scrapy fetch <url>

示例如下:

$ 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'],
 ...}

view

在浏览器中打开给定的 URL,并以 Scrapy spider 获取到的形式展现。

有些时候 spider 获取到的页面和普通用户看到的并不相同。

因此该命令可以用来检查 spider 所获取到的页面,并确认这是您所期望的。

语法如下:

scrapy view <url>

示例如下:

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

version

输出 Scrapy 版本。配合 -v 运行时,该命令同时输出 Python,Twisted 以及平台的信息,方便 bug 提交。

语法如下:

scrapy version [-v]

示例如下:

$ scrapy version
Scrapy 1.5.1

项目命令

命令 描述
crawl 使用 spider 进行爬取
check 运行 contract 检查
list 列出当前项目中所有可用的 spider
edit 使用 EDITOR 中设定的编辑器编辑给定的 spider
parse 获取给定的 URL 并使用相应的 spider 分析处理
genspider 在当前项目中创建 spider
bench 运行 benchmark 测试

crawl

使用 spider 进行爬取。

语法如下:

scrapy crawl <spider>

示例如下:

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

check

运行 contract 检查。

语法如下:

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

列出当前项目中所有可用的 spider。每行输出一个 spider。

语法如下:

scrapy list

示例如下:

$ scrapy list
spider1
spider2

edit

使用 EDITOR 中设定的编辑器编辑给定的 spider。

该命令仅仅是提供一个快捷方式。开发者可以自由选择其他工具或者 IDE 来编写调试 spider。

语法如下:

scrapy edit <spider>

示例如下:

$ scrapy edit spider1

parse

获取给定的 URL 并使用相应的 spider 分析处理。

如果您提供 --callback 选项,则使用 spider 的该方法处理,否则使用 parse。

  • --spider=SPIDER: 跳过自动检测 spider 并强制使用特定的 spider;
  • --a NAME=VALUE: 设置spider的参数(可能被重复);
  • --callback or -c: spider 中用于解析返回(response)的回调函数;
  • --pipelines: 在 pipeline 中处理 item;
  • --rules or -r: 使用 CrawlSpider;规则来发现用来解析返回(response)的回调函数;
  • --noitems: 不显示爬取到的 item;
  • --nolinks: 不显示提取到的链接;
  • --nocolour: 避免使用 pygments 对输出着色;
  • --depth or -d: 指定跟进链接请求的层次数(默认: 1);
  • --verbose or -v: 显示每个请求的详细信息;

语法如下:

scrapy parse <url> [options]

示例如下:

$ 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  -----------------------------------------------------------------
[]

genspider

在当前项目中创建 spider。

这仅仅是创建 spider 的一种快捷方法。该方法可以使用提前定义好的模板来生成 spider。您也可以自己创建 spider 的源码文件。

语法如下:

scrapy genspider [-t template] <name> <domain>

示例如下:

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

$ scrapy genspider -d basic
import scrapy

class $classname(scrapy.Spider):
    name = "$name"
    allowed_domains = ["$domain"]
    start_urls = (
        'http://www.$domain/',
        )

    def parse(self, response):
        pass

$ scrapy genspider -t basic example example.com
Created spider 'example' using template 'basic' in module:
  mybot.spiders.example

bench

运行 benchmark 测试。

语法如下:

scrapy bench

自定义命令

可以通过 COMMANDS_MODULE 来添加自己的项目命令。可以以 scrapy/commands 中 Scrapy commands 为例来了解如何实现自己的命令。

COMMANDS_MODULE

Default: '' (empty string)

用于查找添加自定义 Scrapy 命令的模块。

示例如下:

COMMANDS_MODULE = 'mybot.commands'

通过 setup.py entry point 来注册命令

可以通过在库文件 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',
    ],
  },
 )

这是个实验性的特性,请谨慎使用。