pyspider爬虫框架源码阅读

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
2
@click.command()
@click.option('--hash-type',type=click.Choice(['md5','sha1']))

这两个装饰器会对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 john

1
#### 可变参数 ####

@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_context

1
可以将上下文传输过来

@click.pass_obj
则是只传递Context.obj`字段过来。

当使用了这两个装饰器之后,被装饰的函数的第一个参数就是对应的Context或Context.obj

run.py

./pyspider/run.py中从cli()函数开始运行,看之前最好看一下click的使用,因为整个结构是基于click的。

lambda 匿名函数

这个是用来绑定一个匿名函数的

分享到