pyspider爬虫框架源码阅读
主要使用的组件
tornado
一个异步可并发的网络库
有4个部分组成
- Web Framework,RequestHandler
- HTTP的客户端和服务端 HTTPServer AsyncHTTPClient
- 一个异步的网络库 IOLoop IOStream
- 一个协程库 tornado.gen
flask
用于搭建web server
phantomjs
用于爬取js页面
click
用于建立一个好的命令行接口的库
1 | @click.command() |
表示这是一个子命令。
1 | @click.option |
表示一个命令行的option
1 | @click.option('--shout/--no-chout',default=False) |
表示这是一个boolean flag
1 | @click.command() |
这两个装饰器会对hash-type这个参数进行检查,如果不是1
2
3
4
5
6
#### prompt ####
当用户没有指定一些参数的时候,让程序去追问用户,叫做prompt parameters
#### 从环境变量中读取值 ####
有两种方式,一种是从环境变量中读取自定义的
@click.command()
@click.option(‘–username’)
def greet(username):
click.echo(‘hello %s!’ % username)
if name==’main‘:
greet(auto_envvar_prefix=’GREETER’)1
2
然后在命令行中
$ export GREETER_USERNAME=john
$ greet
hello john1
#### 可变参数 ####
@click.command()
@click.argument(‘src’,nargs=-1)
@click.argument(‘dst’,nargs=1)1
2
3这样子src就拥有了可变参数的特性,可以吃掉任意多的参数。但是只能有一个可变参数存在。
如果想要至少提供一个参数的可变参数的话,需要设置```requeired=True
文件安全
提供了lazy mode和atomic mode来保证文件的读写安全,lazy模式下,读文件会得到立即的反应,而写文件则会到第一次IO操作的时候才有反应。
复杂应用
上下文环境 context
当一个click命令执行的时候,一个1
2
环境对象建立一个链接表,直到他们到达了最上面的一个。每个环境都会和它的父环境链接。这样子,每个环境对象都能够保存自己的信息,而不用担心会影响到其他命令的状态了。同时也保证了当父环境的数据需要读取的时候,可以到达。
@click.pass_context1
可以将上下文传输过来
@click.pass_obj则是只传递
Context.obj`
字段过来。
当使用了这两个装饰器之后,被装饰的函数的第一个参数就是对应的Context或Context.obj
run.py
在./pyspider/run.py
中从cli()
函数开始运行,看之前最好看一下click的使用,因为整个结构是基于click的。
lambda 匿名函数
这个是用来绑定一个匿名函数的