【Scrapy】Scrapy教程4——命令行工具


上一节我们了解了如何安装Scrapy,安装后如何用呢?这节开始学习。
在Scrapy中提供一个命令行工具,可以控制scrapy进行各种操作,实现不同功能。本节要先学习这个命令行工具,这样我们就能快速创建scrapy项目和爬虫程序,并进行相关调试和运行。

配置文件

Scrapy有一个默认的配置参数文件叫“scrapy.cfg”,scrapy默认会从这个文件中读取配置参数,该配置文件的标准存放路径有以下三种:

  1. 系统级路径:/etc/scrapy.cfg(Linux或Mac)或C:\scrapy\scrapy.cfg(Windows)
  2. 用户级:~/.config/scrapy.cfg ($XDG_CONFIG_HOME) 和 ~/.scrapy.cfg ($HOME)
  3. 项目级:创建项目根目录下的scrapy.cfg

其中项目级的优先级最高,其次是用户级和系统级,简单来讲项目级>用户级>系统级,所以通常我们默认只用项目级的。
Scrapy也可以理解一些配置的环境变量,如:

  • SCRAPY_SETTINGS_MODULE用来设置python的scrapy模块路径
  • SCRAPY_PROJECT用来设置scrapy使用的爬虫程序
  • SCRAPY_PYTHON_SHELL用来设置所使用的shell环境

Scrapy的默认项目结构

在继续进行命令行工具讲解前,还有一个需要了解的,就是Scrapy的默认文件结构,如果不了解这个结构,我们使用命令行时可能会在错误的路径执行,造成命令找不到指定的文件而报错,Scrapy默认的文件结构如下所示:

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

scrapy的命令行工具,默认使用的是项目根目录(即上面的最外层目录),因为scrapy的配置文件scrapy.cfg也在根目录下。
scrapy.cfg文件中有下面一行配置,用来设置默认使用的爬虫程序。

[settings]
default = myproject.settings

如果有多个项目在同一个文件夹下,那么可以在scrapy.cfg文件中添加如下设置:

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

然后使用export SCRAPY_PROJECT=project2来设置使用的项目。

Scrapy命令行的使用

查看帮助

我们可以直接在安装了scrapy的python环境下,直接输入scrapy就可以显示scrapy的帮助信息,如下所示,和命令scrapy -h作用一样,注意如果和我一样用的是虚拟环境,需要先进入虚拟环境再执行。

(venv_scrapy) D:\Code\scrapyTutorial>scrapy
Scrapy 2.11.2 - no active project

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

Available commands:
bench Run quick benchmark test
fetch Fetch a URL using the Scrapy downloader
genspider Generate new spider using pre-defined templates
runspider Run a self-contained spider (without creating a project)
settings Get settings values
shell Interactive scraping console
startproject Create new project
version Print Scrapy version
view Open URL in browser, as seen by Scrapy

[ more ] More commands available when run from project directory

Use "scrapy <command> -h" to see more info about a command

在上面的帮助信息中,第一行会显示我们安装的scrapy的版本和已激活的项目,下面是scrapy的用法,和可用的命令有哪些,最后一行还提示了如果想相信了解某个命令的详细信息,可以使用scrapy <command> -h来查看每个命令的帮助。

准备项目

后面为了逐一讲解每个命令的作用的,我们需要先有个可以用的项目才能继续讲解,因此先来看如何创建项目和操作项目。
创建项目可以使用命令

scrapy startproject myproject [project_dir]

这个命令将会在project_dir目录下创建一个scrapy的项目,并且项目名称为myproject,如果project_dir省略不指定,则会自动创建一个和项目名称相同的目录。
创建好项目后,需要进入到project_dir目录,即项目根目录对scrapy的项目进行操作。如创建新的爬虫程序:

cd myproject  # 进入scrapy根目录
scrapy genspider mydomain mydomain.com # 创建爬虫

这里要注意区分下,有scrapy.cfg文件的是根目录,若执行startproject时没指定project_dir,则在根目录下会有一个和项目名称相同的文件夹,这是个默认的爬虫程序目录。
为了方便理解,后面我会把startproject创建的根目录称为项目目录,该目录下包含scrapy的参数配置文件和爬虫程序目录。
爬虫程序就是根目录下创建的文件夹,我称为爬虫程序,因为后面开发爬虫时,主要在这些文件中编写,爬虫程序目录名称可能和根目录名称相同(startproject时不指定project_dir就会相同),一个项目目录中可能有多个爬虫程序目录,每个爬虫程序目录中都包含了爬虫文件、中间件文件、items文件、pipelines文件、设置文件等。
执行爬虫时,可使用scrapy.cfg文件对默认的爬虫程序进行切换,还可通过设置SCRAPY_PROJECT环境变量指定使用的爬虫程序。

可用命令

scrapy中分全局命令(Global commands)和项目命令(Project-only commands)两种,什么意思呢?全局命令只要在scrapy项目的根目录或子目录中都可以使用,而项目命令必须切换到项目目录下才能执行。

全局命令Global Commands

startproject

  • 语法:scrapy startproject <project_name> [project_dir]
  • 说明:创建项目,在project_dir目录下创建新的Scrapy项目,命名为project_name,其中project_dir可以省略,默认会在当前目录下创建一个和project_name同名的文件夹作为project_dir。
  • 例子:scrapy startproject myproject

genspider

  • 语法:scrapy genspider [-t template] <name> <domain or URL>
  • 说明
    • 作用:在当前文件夹(非项目文件夹内)或当前项目爬虫文件夹(必须项目文件夹内)创建一个新的爬虫,创建爬虫时不一定必须使用这个命令,也可以自己手动创建爬虫文件。
    • 参数说明
      • name是爬虫名字
      • domain or URL是生成allowed_domainsstart_urls属性的
      • -t template是可选参数,用于指定使用的模板
      • -l查询可用的模板
  • 例子
# 查询可用的模板
$ scrapy genspider -l
Available templates:
basic
crawl
csvfeed
xmlfeed

# 使用basic模板创建example爬虫
$ scrapy genspider example example.com

# 使用crawl模板创建scrapyorg爬虫
$ scrapy genspider -t crawl scrapyorg scrapy.org

settings

  • 语法:scrapy settings [options]
  • 说明
    • 作用:查询Scrapy设置,如果是在爬虫程序文件夹中,则显示爬虫程序设置,如果是在根目录则显示默认的Scrapy设置
    • options参数说明
      • -h显示帮助信息
      • --get输出原始设置值
      • --getbool--getint--getfloat--getlist分别是输出布尔值、整型、浮点型、列表的设置值,这几个基本不用,因为参数值不是对应的类型会直接报错
  • 例子
# 查询BOT_NAME
$ scrapy settings --get BOT_NAME
scrapybot

# 查询DOWNLOAD_DELAY时间
$ scrapy settings --get DOWNLOAD_DELAY
0

runspider

  • 语法:scrapy runspider <spider_file.py>
  • 说明
    • 作用:单独运行一个爬虫文件,不必创建项目
  • 例子
scrapy runspider scrapyorg.py

shell

  • 语法:scrapy shell [url]
  • 说明
    • 作用:启动scrapy的交互模式,如果指定url则启动交互模式时会自动爬取该url;如果不指定url,则只启动交互模式,不会下载任何页面。url也可替换成本地的文件。该模式下可以用来调试代码,如验证选择器编写的是否正确等。
    • 参数说明
      • --spider=SPIDER指定要使用的爬虫文件
      • -c code执行代码并打印代码的执行结果
      • --no-redirect不遵循重定向
      • --nolog不打印日志,新手不建议使用,因为交互模式启动后会打印很多提示信息,包括可以使用的命令
  • 例子
$ 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')

fetch

  • 语法:scrapy fetch <url>
  • 说明
    • 作用:使用Scrapy下载器下载指定的url,并输出到屏幕。这个命令可以展示爬虫如何获取页面,如获取请求头。
    • 参数
      • --spider=SPIDER指定要使用的爬虫文件
      • --headers打印请求头,而不是请求体
      • --no-redirect不遵循重定向
  • 例子
$ 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,用于调试代码,如你想要的结果和spider找到的是否一致
    • 参数
      • --spider=SPIDER指定要使用的爬虫文件
      • --no-redirect不遵循重定向
  • 例子
$ scrapy view http://www.example.com/some/page.html
[ ... browser starts ... ]

version

  • 语法:scrapy version [-v]
  • 说明
    • 作用:打印Scrapy的版本信息
    • 参数
      • -v除了显示Scrapy的版本信息,还显示Python、Twisted等依赖包的版本信息和平台信息。
  • 例子
$ scrapy version
Scrapy 2.11.2

$ scrapy version -v
Scrapy : 2.11.2
lxml : 5.3.0.0
libxml2 : 2.11.7
cssselect : 1.2.0
parsel : 1.9.1
w3lib : 2.2.1
Twisted : 24.10.0
Python : 3.11.4 (tags/v3.11.4:d2340ef, Jun 7 2023, 05:45:37) [MSC v.1934 64 bit (AMD64)]
pyOpenSSL : 24.2.1 (OpenSSL 3.3.2 3 Sep 2024)
cryptography : 43.0.3
Platform : Windows-10-10.0.22631-SP0

项目命令Project-only Commands

crawl

  • 语法:scrapy crawl <spider>
  • 说明
    • 作用:启动爬虫的爬取
    • 参数
      • -h, --help显示帮助文件
      • -a NAME=VALUE设置爬虫参数
      • --output FILE-o FILE添加爬取的项目到文件末尾,使用-用作标准输出,用冒号设置输出格式-o FILE: FORMAT
  • 例子
$ scrapy crawl myspider
[ ... myspider starts crawling ... ]

$ scrapy crawl -o myfile:csv myspider
[ ... myspider starts crawling and appends the result to the file myfile in csv format ... ]

$ scrapy crawl -O myfile:json myspider
[ ... myspider starts crawling and saves the result in myfile in json format overwriting the original content... ]

$ scrapy crawl -o myfile -t csv myspider
[ ... myspider starts crawling and appends the result to the file myfile in csv format ... ]

check

  • 语法:scrapy check [-l] <spider>
  • 说明
    • 作用:检查是否有语法错误
    • 参数
      • -l列出所有可用的检查器
  • 例子
$ 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 设置编辑给爬虫。
  • 例子
$ scrapy edit spider1

parse

  • 语法:scrapy parse <url> [options]
  • 说明
    • 作用:获取指定的URL并传给爬虫处理,使用--callback参数指定回调函数。可以用来验证我们写的回调函数是否正确。
    • 参数
      • --spider=SPIDER指定要使用的爬虫文件
      • -a NAME=VALUE设置爬虫参数
      • --callback-c指定回调函数
      • --meta-m附加传给回调函数的请求meta,必须是json字符串,如–-meta='{"foo" : "bar"}'
      • --cbkwargs附加传给回调函数的参数,必须是json字符串,如–-cbkwargs='{"foo" : "bar"}'
      • --pipelines通过pipelines处理items
      • --rules-r使用CrawlSpider规则寻找回调函数
      • --noitems不显示爬虫项目items
      • --nolinks不显示提取的链接
      • --nocolour不实用高亮输入内容
      • --depth-d请求需要递归的层数
      • --verbose-v显示每层的信息
      • --output-o存储爬取的items到文件
  • 例子
$ 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 -----------------------------------------------------------------
[]

bench

  • 语法:scrapy bench
  • 说明
    • 作用:对Scrapy做压力测试,可以帮助开发者找出性能瓶颈和优化空间,提高爬虫的效率和稳定性。

自定义项目命令

Scrapy支持使用COMMANDS_MODULE模块设置自己的项目命令。
如何实现可参考scrapy/commands的实践方法。
然后在项目的settings文件中配置COMMANDS_MODULE = "mybot.commands"来添加自定义命令。
以上就是对Scrapy命令行工具的说明,有不明确的地方,可参考官方文档


文章作者: jayhgq
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 jayhgq !
  目录