Scrapy2.5.0汉化计划——命令行工具

命令行工具

通过 scrapy 命令行工具控制Scrapy框架,为了与子命令进行区分,我们将命令行工具称为 Scrapy工具(Scrapy tool),当然你也可以叫她(命令行工具娘)命令集( commands )或者Scrapy命令集( Scrapy commands )。

Scrapy工具为不同的目的提供多种服♂务,每一个命令都可以设置不同的参数和选项。

配置设定

Scrapy框架会在以下标准路径中的INI风格的配置文件 scrapy.cfg 里寻找配置参数:

  1. /etc/scrapy.cfg 或者 c:\scrapy\scrapy.cfg (系统默认);
  2. 全局设定(用户自定)中的~/.config/scrapy.cfg ($XDG_CONFIG_HOME) 和~/.scrapy.cfg ($HOME) ;
  3. Scrapy项目根目录中的 scrapy.cfg

(涉及Linux就是知识盲区了,呜呜呜…… )

(在WIN10使用Pycharm的话实际只需要关注第3条)

这些文档中设定会按照列出顺序的优先级进行合并(我自己页不会翻译了),意思就是用户自定的参数值的优先级高于系统默认的参数值的优先级,而当在项目中进行配置设定时,配置参数将会继承来自用户自定或者系统默认的参数值。

你也可以通过一些环境变量配置Scrapy框架,例如:

  • SCRAPY_SETTINGS_MODULE
  • SCRAPY_PROJECT
  • SCRAPY_PYTHON_SHELL

(没用过,都不认识)

Scrapy项目的默认结构

在深♂入理解命令行工具以及她的子命令之前,我们需要先了解一个Scrapy项目的目录结构。

目录结构是可以修改的,但是所有的Scrapy项目在默认情况下都有相似

的文件结构。例如:

1
2
3
4
5
6
7
8
9
10
11
12
scrapy.cfg
myproject/
__init__.py
items.py
middlewares.py
pipelines.py
settings.py
spiders/
__init__.py
spider1.py
spider2.py
...

scrapy.cfg所在的目录是整个项目的根目录,scrapy.cfg包含了定义在项目设置中的Python模块的声明(就是别名啦),例如:

1
2
[settings]
default = myproject.settings

在项目之间共享根目录

一个包含scrapy.cfg文件的根目录可以同时被多个Scrapy项目共享,每一个项目都可以有自己的设置模块。

也就是说,你得在scrapy.cfg文件中的[setting]下面定义一个或多个配置模块的别名,例如:

1
2
3
4
[settings]
default = myproject1.settings
project1 = myproject1.settings
project2 = myproject2.settings

默认情况下, scrapy 命令行工具会使用默认设置。(这特么不是废话吗?)在使用命令行工具时也可以利用环境变量SCRAPY_PROJECT指定不同的项目:

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

(setting的具体用法下面会讲,这里在用setting举例子,我第一次看也很迷惑)

Scrapy工具的结构

你可以尝试不带参数启动运行 Scrapy 工具,控制台会打印Scrapy工具的使用说明和命令集:

1
2
3
4
5
6
7
8
9
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 工具的话,你可能在控制台看到这样的输出:

1
2
3
4
5
6
Scrapy X.Y - project: myproject

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

[...]

创建 Scrapy项目

正片开始!使用scrapy工具的第一个仪式当然是创建项目啦!!!

在命令行创建项目:

1
scrapy startproject myproject [project_dir]

这个命令将会在 project_dir 目录下创建一个Scrapy项目,如果project_dir 目录没有被指定,那么目录将会被命名为myproject

项目创建之后,你就可以进♂入项目目录了:

1
cd project_dir

你可以在这里使用scrapy工具的管理和控制你的项目。

控♂制Scrapy项目

在项目中使用scrapy工具控制和管理你的项目。

例如创建一个名为mydomain新爬虫spider

1
scrapy genspider mydomain mydomain.com

一些Scrapy命令(比如crawl)必须在项目内才能有效运行。在下一个条目中你可以了解到哪些Scrapy命令需要在项目内运行,哪些不需要在项目内运行。

注意,不同项目中的命令运行效果可能会有略微差异。例如,当url与一些特定的爬虫产生联系时,fetch命令会继承爬虫的运行效果。这当然是有意的,fetch命令被用于检查爬虫如何获取页面。

(这一段的翻译有待改进,得根据实际效果重新修正)

commond命令集

这一节将会详述内置命令集及其使用示例。记住!靓仔!当你想要深入了♂解一个命令时,你可以:

1
scrapy <command> -h

什么?你全都要了解?那你可以:

1
scrapy -h

Srcapy中有两种命令,一种只能在项目中运行——项目命令( Project-specific commands ),一种可以脱离项目运行——全局命令( Global commands ),道理是这么个道理,但实际在项目中运行时,这两种命令的运行效果略有差异(它们使用了相同的设定值,这些设定值来自项目继承的设定)

全局命令:

  • startproject
  • genspider
  • settings
  • runspider
  • shell
  • fetch
  • view
  • version

项目命令:

  • crawl
  • check
  • list
  • edit
  • parse
  • bench

startporject

  • 用法: scrapy startproject <project_name> [project_dir]
  • 必须在项目中使用🐎:当然不需要!

project_dir目录下创建一个名为project_name的新项目,如果project_dir参数缺省,则目录名默认为项目名project_name

使用示例:

1
$ scrapy startproject myproject

genspider

  • 用法: scrapy genspider [-t template] <name> <domain>
  • 必须在项目中使用🐎:当然不需要!

当该命令在项目内部被使用时,会在当前文件夹或当前项目中的 spiders 文件夹中创建一个新的爬虫。template参数用以指定预定义模板,<name>参数设定爬虫的名称,<domain>参数指定爬虫的域。(域是一个很重要的概念,下面会讲)

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
$ 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>
  • 必须在项目中使用!

该命令启动爬虫并获取数据。

使用示例:

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

check

  • 用法: crapy check [-l] <spider>
  • 得在项目中使用!

该命令用于执行Spider的Conract检查,Contract 的作用就是通过一系列的简单约定来替代单元测试。

(搞不懂有什么好处,这玩意儿作者自己都想删除,什么?你自己写代码不做测试?那这个接口你大可不用管了,把麻烦都留给测试员吧!)

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ 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
  • 得在项目中使用!

该命令列出当前项目中所有可用的爬虫,一只爬虫打印一行。

使用示例:

1
2
3
$ scrapy list
spider1
spider2

edit

  • 用法:scrapy edit <spider>
  • 得在项目中使用!

IDE:时代变了,edit!!!

该命令用以编辑爬虫。使用IDE(比如Pycharm)的同志们可以忽略这条命令。

使用示例:

1
$ scrapy edit spider1

fetch

  • 用法:scrapy fetch <url>
  • 必须在项目中使用🐎:当然不需要!

传入URL,将获取到的目标地址的内容(content)写入标准输出。

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ 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。有时候你在浏览器中看到的页面和爬虫抓取到的页面可能不同(许多页面都是动态渲染的,直接抓取的HTML中可能不含数据),view可以帮助你验证爬虫抓到的内容是否符合你的预期。

支持的参数选项:

--spider=SPIDER: 绕过爬虫自动检测,强制使用指定的爬虫

--no--redirect: 禁止使用HTTP3重定向(默认允许使用)

啥是重定向? 啥是HTTP3?

使用示例:

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

shell

  • 用法:scrapy shell [url]
  • 必须在项目中使用🐎:当然不需要!

启动一个Scrapy Shell,url可以不填。支持UNIX风格的文件路径,./ ../前缀以及相对文件路径。Scrapy的详细介绍之后会讲。

支持的参数选项:

--spider=SPIDER: 绕过爬虫自动检测,强制使用指定的爬虫

-c code: 解析shell中的代码,打印执行结果后退出shell

--no-resirect: 禁止使用HTTP3重定向(默认允许使用) ,但这个参数只会在传入URL时生效,比如在shell中,fecth(url)依然会默认使用HTTP重定向。

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ 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')