Scrapy学习笔记(3)--Command line tool(命令行工具)
Command line tool
Scrapy是在命令行中控制的,比如创建project,运行爬虫等。Scrapy提供了很多的参数和命令。
PS:所有括号中的指令都和前边的对应指令等价,或者是缩写形式
使用scrapy tool
scrapy <command> [options] [args]
如果你直接输入scrapy
,它会显示帮助,即命令参数,你也可以输入scrapy -h
来查看,或者scrapy <command> -h
来显示某个命令的帮助
startproject
语法: scrapy startproject project_name [project_dir]
需求:
不需要项目(此处当作废话处理)
将在指定目录[目录可选,默认当前目录]创建一个指定名称的项目
下一步你就可以cd project_dir
进入创建的项目目录,如果是默认目录,创建完成后下一步cd project_mame
即可
例子: scrapy startproject HelloScrapy D:\\CrazyScrapy\\
cd D:\\CrazyScrapy\\
genspider
语法: scrapy genspider [-t template] <name> <domain>
需求:
不需要有项目
在当前目录或项目目录中的spiders文件夹下创建一个爬虫,如果是在项目中创建,那么它的name
将在项目中设置为spider的name
,<domain>
用来生成spider中的allowed_domains
和start_urls
属性。下列具体参数中括号的指令与前面的缩写指令等价:
-
scrapy genspider -h
(–help)显示帮助 -
scrapy genspider -l
(–list)显示可用的模板(templates),有basic、crawl、csvfeed、xmlfeed四种,默认basic,最简的那种 -
scrapy genspider -e
(–edit)创建后编辑,前提是设置好编辑器,以后设置里会讲 -
scrapy genspider -d
(–dump=TEMPLATE),参数是模板,使用这个不会创建一个爬虫,而是在命令行中展示它的模板代码,也就是预览 -
scrapy genspider -t
(–template=TEMPLATE),参数是模板,生成一个对应模板的爬虫,-d是预览,-t是生成 -
scrapy genspider --force
如果指定的spider已经存在,那么就用指定的模板覆盖它!(默认basic模板)
ps:这些知道就好,因为它只是创建爬虫的命令,你完全可以自己手动创建一个spider文件,重要的还是如何写爬虫的代码,当然你可以都试一试,关于那四种模型,以后学到Spider会接触到
例子: scrapy genspider -t xmlfeed spider1 "baidu.com"
crawl
语法: scrapy crawl <spider>
需求:
需要项目
执行爬虫,注意使用该命令要在项目目录里。
-
scrapy crawl -a NAME=VALUE
设置爬虫的参数(可能会重复) -
scrapy crawl --output=FILE
(-o FILE) 将爬下来的item存储(dump)到指定文件 -
scrapy crawl --output-format=FORMAT
(-t FORMAT) 按格式存储item到指定文件,常见的有FILE.json、FILE.jl格式等
例子: scrapy crawl spider1 -t spider1_item.json
check
语法: scrapy check [-l] <spider>
需求:
需要项目
运行检查,即检查你的spiders是否有代码错误,需要在项目目录中使用:
-
scrapy check
检查所有的spiders,后边跟上spider名字会针对某个spider检查 -
scrapy check -l
(–list)只会列出contracts,但是不检查 -
scrapy check -v
(–verbose)打印出所有spiders的contracts测试结果,相当于scrapy check
例子: >scrapy check
>...
D:\Crazy\Hello\HelloProject \spiders\spider2.py, line12
yield i:::
SyntaxError: invalid character in identifier
没错,我打了三个中文冒号,然后报错,被它检查出来了。
list
语法: scrapy list
需求:
需要项目
作用:列出所有的spider
例子: >scrapy list
spider1
spider2
edit
语法: scrapy edit <spider>
需求:
需要项目
在设置过的EDITOR中打开。没有设置过的话就默认了。当然有IDE的话这个命令用不着,这里只是提一下,具体怎么设置以后再说。
fetch
语法: scrapy fetch [options] <url>
需求:
不需要项目
利用Scrapy downloader从网页中提取内容(body,页面源代码)保存到本地(.html文件,具体目录看浏览器上面显示的地址)并且打印到标准输出,你可以使用--nolog
指令来取消打印日志(这个指令是Global Options,所有命令都有的,之后会介绍)。如果你是在一个项目中执行,那么它会先找你的项目的settings.py中是否设置了headers,如果有,则用你设置的headers进行提取。以下是指令:
-
scrapy fetch --spider=SPIDER <url>
用指定的spider来获取 -
scrapy --headers <url>
打印HTTP headers而不是页面的body -
scrapy --no-redirect <url>
不要处理HTTP 3xx状态码和按原样打印响应,就是比如302、303等状态吗不要处理、打印。
例子: scrapy fetch --nolog --headers "http://cn.bing.com/"
...显示HTTP的headers相关信息...
view
语法: scrapy view <url>
需求:
不需要项目
用你的浏览器打开指定的url链接,而且默认不会加载你的插件,货真价实的就是你的spider看到的页面。你可以试一下,看看淘宝网,结果不是很理想,因为淘宝的界面都是即时生成的、动态的,要爬取这样的网页还需要模拟工具比如PhantomJS,这个就先不提。下面是view的指令:
-
--spider=SPIDER
以爬虫的视角来看 -
--no-redirect
同fetch。
例子: scrapy view --spider=spider1 "http://dict.youdao.com/"
将用你的默认浏览器打开该爬虫视角的页面
shell
语法: scrapy shell [url]
需求:
不需要项目
shell是个很强大的功能,对于你解析HTML信息十分有用,先讲一下参数,然后再细说:
-
scrapy shell -c CODE <url>
将你的CODE代码在shell中执行之后退出shell,记得给你的代码加上引号,并且不要和你代码中用到的引号冲突。其实直接在shell中操作会更好。 -
scrapy shell --spider=SPIDER
用指定的爬虫获取信息,然后进入shell -
scrapy shell --no-redirect
同fetch
在shell中,response就是你对你指定的url链接发出请求后返回的信息,就相当于整个页面的源代码。接下来你就需要使用选择器(Selectors)来模拟提取信息,不断地测试。选择器,比如CSS Selectors,XPath,re()正则表达式,当然BeautifulSoup也是可以的。你完全可以把这个环境当成python的shell,在里面进行测试,找到合适的选择路径,然后写入Spider中。
例子: >scrapy shell "http://cn.bing.com/"
# log以及打开shell
>>>a='http://cn.bing.com/'+response.xpath('//li[@id="scpt3"]/a[@id]/@href').extract_first()
>>>print(a)
parse
语法: scrapy parse <url> [options]
需求:
需要项目
用爬虫解析url链接并且打印结果
-
scrapy parse --spider=SPIDER <url>
用指定的爬虫而不是寻找一个 -
scrapy parse -a NAME=VALUE <url>
设定爬虫的参数(可能会有重复的) -
scrapy parse --pipelines <url>
通过pipelines处理items -
scrapy parse --nolinks <url>
不显示可以再次请求(follow)的链接 -
scrapy parse --noitems <url>
不显示爬取到的items -
scrapy parse --nocolour <url>
不要使用代码高亮来颜色化输出 -
scrapy parse -r <url>
(–rules)使用CrawlSpider rules来发现callback(回调) -
scrapy parse -c CALLBACK <url>
(–callback=CALLBACK)使用指定的callback回调来解析(parse),而不是自己找 -
scrapy parse -d DEPTH <url>
(–depth=DEPTH) 解析请求的最大深度,默认1 -
scrapy parse -v <url>
(–verbose) 一个接一个地打印每一层深度
例子(用的是我已经写过的项目): D:\CrazyScrapy\FamousQuotes\FamousQuotes>scrapy parse --spider=quotes -v "http://www.dailyenglishquote.com/"
settings
语法: scrapy settings [options]
需求:
不需要项目
获得settings的值。如果在一个项目中使用,它将展示项目的setting value, 否则将会展示,默认的Scrapy settings值,下面的SETTING都是settings.py中具体的某一项设置的名字,你可以
-
scrapy settings --get=SETTING
直接(raw)打印setting的值 -
scrapy settings --getbool=SETTING
以boolean形式打印 -
scrapy settings --getint=SETTING
以整型数据打印 -
scrapy settings --getfloat
以浮点型打印 -
scrapy settings --getlist
以列表的形式打印
例子: scrapy settings --get=BOT_NAME
打印项目名 scrapy settings --getbool=ROBOTSTXT_OBEY
打印是否遵循robots协议 scrapy settings --getfloat=DOWNLOAD_DELAY
打印下载器在下载同一个网站下一个页面前需要等待的时间
ps:关于settings.py以后还会再深入
runspider
语法: scrapy runspider <spider_file.py>
需求:
不需要项目
不需要创建项目就可以跑爬虫,简单易懂:
-
scrapy runspider -a NAME=VALUE <spider_file.py>
设定爬虫的参数(可能会有重复) -
scrapy runspider --output=FILE <spider_file.py>
(-o FILE) dump(存储)爬下来的item到指定的文件中;使用-
来标准输出 -
scrapy runspider --output-format=FORMAT
(-t FORMAT)格式化使用-o输出
scrapy runspider spider4.py
...crawling log...
version
语法: scrapy version [-v]
需求:
不需要项目
显示scrapy的版本。如果使用了-v
参数,同时也会打印Python版本、Twisted版本和Platform info(平台信息)等,下面是我的信息:
大家可以参考一下。Twisted和lxml库是我手动下载的,因为之前下载scrapy的时候出了一些问题。等以后有更多的需求再换电脑和系统 :)
bench
语法: scrapy bench
需求:
不需要项目
运行一个快速的基准测试,反应当前爬虫的一些基本数据。
Global Options(通用的参数/可选项)
这个是以上命令的通用命令:
-
--logfile=FILE
日志文件。如果省略了stderr(标准错误输出)将被使用 -
--loglevel=LEVEL
(-L LEVEL) 日志的LEVEL,默认:INFO -
--nolog
不会显示日志信息(log) -
--profile=FILE
写入python cProfile stats到文件中 -
--pidfile-FILE
写入process ID到文件中 -
--set=NAME=VALUE
(-s NAME=VALUE) 设定/重写 setting(可能会有重复) -
--pdb
enable pdb on failure(使程序数据库文件失效)
PS:关于scrapy的自定义项目命令(Custom project commands),你可以通过使用COMMANDS_MODULE setting来加入你自己的项目命令。但是由于我的水平还不够,所以在这里我不打算叙述。