命令行
scrapy支持命令行模式,它提供了一套命令集,每个命令都有不同的参数和可选项
关于配置的设定
Scrapy会在scrapy.cfg文件查找配置参数,该文件位于scrapy project的根目录下
配置参数有不同的有效范围
system-wide
user-wide
project-wide
优先级
project-wide > user-wide > system-wide
环境变量
可以通过设置环境变量的方式,来控制scrapy使用哪些设置
相关环境变量如下:
SCRAPY_SETTINGS_MODULE
SCRAPY_PROJECT
SCRAPY_PYTHON_SHELL
Project目录结构
Scrapy project默认目录结构如下,但可以改变
scrapy.cfg
myproject/
__init__.py
items.py
middlewares.py
pipelines.py
settings.py
spiders/
__init__.py
spider1.py
spider2.py
scrapy.cfg
该文件所在目录称为project根目录,该文件包含了python模块名,这些模块定义了project settings
project间共享根目录
一个project的根目录,可能会共享给多个project,而每个project会有自己的settings
因此需要定义别名
[settings] default = myproject1.settings #表示默认情况下使用哪个project project1 = myproject1.settings project2 = myproject2.settings
默认情况下,scrapy command-line tool会使用default settings
可通过修改环境变量SCRAPY_PROJECT来更改使用哪个project
scrapy settings #输出:Project 1 Bot,get BOT_NAME export SCRAPY_PROJECT=project2 scrapy settings #get BOT_NAME --输出:Project 2 Bot,get BOT_NAME
Scrapy Tool使用
Scrapy Tool是一款软件,类似于linux的vi,通过命令行使用
使用scrapy tool会返回一些项目信息及一些可用的命令
如果使用的是anaconda,需要在anaconda的命令行上执行
project创建
scrapy startproject myproject [project_dir]
如果不指定project_dir,则默认使用的是myproject的目录
创建project后,进入project目录(cd project_dir),就可以操控project了
project控制
要想操控project,必须要进入到project文件夹下
在project内和project外运行命令,返回的结果可能会有很大的不同
有些属性如user_agent,进入project根目录下执行时,project内部的user_agent会覆盖global的user_agent
内置命令集
帮助命令
scrapy <command> -h 可查看所有命令的帮助文档
scrapy -h 查看所有命令
命令分类
Project-specific commands:必须进入到project目录内执行
Global commands:不需要一定进入到project目录内执行
project外的setting会被project内的setting覆盖,因此project目录内执行命令会有不同结果
startproject
语法:scrapy startproject <project_name> [project_dir]
require project:no
在project_dir下创建project,如果不指定project_dir,则默认在当前目录下创建project
genspider
语法:scrapy genspider [-t template] <name> <domain>,require project:no
在当前文件夹下创建一个新的spider
如果在当前project目录下,则在当前project的spiders文件夹下创建一个新的spider
name用于指定新建spider的name
domain用于生成spider的属性allowed_domains和start_urls
创建spider不一定要用这种命令行的方式,直接创建文件并手写代码或拷贝其他spider并修改更方便
crawl
语法:scrapy crawl <spider>
require project:yes
进入project根目录,执行该命令,使用spider爬取数据
check
语法:scrapy check [-l] <spider>
require project:yes
进入project根目录,执行该命令,检查spider内部是否有错误
使用例:
scrapy check #检查project内所有的spider
scrapy check <spider_name> #检查某指定spider
list
语法:scrapy list
require project:yes
进入project根目录,执行该命令,列出当前project下所有的spider
edit
语法:scrapy edit <spider>,require project:yes
使用EDITOR环境变量或EDITOR Setting指定的编辑器修改spider
该方法仅用于方便时进行操作,也可以使用IDE或记事本直接编辑
fetch
语法:scrapy fetch <url>
require project:no
使用Scrapy downloader从给定的URL下载网页源码,并将其写入标准输出
spider下载网页源码与该命令下载的是一样的
如果spider定义了USER_AGENT属性,该属性会覆盖User Agent,下载是会使用定义的USER_AGENT属性
因此,如果想查看spider下载某个网页具体是什么样的,可以使用该命令,而无需debug
如果是在project外执行该命令,它会使用默认的Scrapy downloader settings
支持的参数
--spider=SPIDER: 强制使用某个指定spider
--headers: 打印response的http header,而不是response body
--no-redirect: 不遵循HTTP 3xx重定向(默认是遵循)
--nolog:不打印log
使用例:
scrapy fetch --nolog http://www.example.com/some/page.html
scrapy fetch --nolog --headers http://www.example.com/
view
语法:scrapy view <url>
require project:no
在浏览器打开指定的URL
使用例:
scrapy view --nolog http://www.example.com/some/page.html
shell
语法:scrapy shell [url]
require project:no
为给定的URL启动Scrapy shell,类似ipython,如果没有URL,则为空
也支持类unix的本地文件路径,包括绝对路径和相对路径
支持的参数
--spider=SPIDER:强制使用某个指定spider
-c code:评估shell中的code,打印结果并退出
--no-redirect: 不遵循HTTP 3xx重定向(默认是遵循)
该参数只影响在命令行作为参数传递的URL
一旦进入shell,默认情况下,fetch(url)仍将遵循HTTP重定向
parse
语法:scrapy parse <url> [options],require project:yes
使用给定的URL,并使用spider对结果进行解析
解析方法是通过--callback选项指定的,如果不指定callback方法,则默认使用parse()方法
settings
语法:scrapy settings [options],require project:no
获取setting的值
如果是在project内,返回project setting值,如果在project外,则返回默认的Scrapy setting值
scrapy settings --get BOT_NAME #输出:scrapybot
scrapy settings --get DOWNLOAD_DELAY #输出:0
runspider
语法:scrapy runspider <spider_file.py>
require project:no
运行一个包含在python文件中的spider,而不必创建一个项目
version
语法:scrapy version [-v]
require project:no
打印scrapy版本
如果与-v一起使用,还打印python、twisted和平台信息,这对于bug报告很有用
bench
语法:scrapy bench
require project:no
运行一个快速基准测试,测试电脑当前爬取速度性能
自定义project命令
COMMANDS_MODULE
可以通过使用COMMANDS_MODULE来自定义并查看自定义project命令
Default: '' (empty string)
COMMANDS_MODULE = 'mybot.commands'
注册命令
通过setup.py入口点注册命令
注意:该功能尚处于试验阶段,会不稳定