上次把类抽象出来,messagequeue,如果要测试,就需要两边一个生产数据一个消费数据,consumer用的话就要配合start_consuming
start_consuming这里就会阻塞,你就要想办法起线程
start_consuming是在所有的sonsume都cancel完了才停止
t12里要把这3个替换掉
以后提取url的也是专门的程序,可能也跑了很多个进程,这些进程也分布在不同的节点上
urls对象就跟其他urls对象就没关系了,因为跑在不同的节点上,一点关系也没有
这就是把生产者写好了
生产者要是写好了,你做的事情就是直接把数据往里面打
crawler爬虫既有生产者和消费者,首先消费urls里的东西,往htmls里生产。如果拿到none,就等1秒再拿,可以把try异常放外层
打印一下异常,以前是用queue从里面拿数据,现在是消费者拿一个数据回来,但是拿回来有可能是none,如果是none就等1秒再拿,如果不是none就快速的去消费
间隔时间做下适当调整,不然发起的请求太快了,爬取是发起requesy请求,最好时间做下间隔,不要疯狂爬取,疯狂爬取很容易被人拒绝
parse解析也是两样东西,是对htmls队列的消费者,对outputs的一个生产者。html=c.recvmsg从里面拿到数据,拿到数据后进行分析,分析的时候有可能也产生一些问题,拿到数据后,产生我们要的数据,现在把产生的数据sendmsg
persist最后就一个消费者了
body要一个string或者unicode
我们现在的类型不行,不符合要求的string
这里直接链接起来,到时候直接拆开即可,因为数据已经传到消息队列,消息队列离开了python环境,序列化和反序列化就没法用了。
序列化和反序列化用过的就是json式的,python自己用的pickle,高效二进制的MessagePack。(这里要string或者unicode)除非做base64编码,既然要把二进制压缩再做base64,还不如json
从队列里拿可能有风险,会有none,等着出错
这里有可能返回none
这次用序列化方式换掉
准备用前面的simplejson来序列化掉
dumps,就这两个值做文本序列化,用json做文本序列化时比较好的选择
这边拿到数据就可以直接对数据进行解构,内部的处理数据,速度快点也可以,不是对外访问。如果拿到数据为none就等1秒
把这个数据再这里装载一下
这个数据是个字典就可以用get,有错误就给外面,这样就可以去爬取相应的内容,这样就各玩各的
现在producer和consumer不互相通信,你要是通信了就可以称为某种意义上的分布式服务了
**现在是多线程的运行,首先是启动gen_url
**
起一个把url搞定了,起多个需要去重
消费url,然后拿到结果,在把结果返回到queue里
parse另一个消费者,就要从里面去消费数据,解析这个数据,把字符串进行序列化,然后把数据打入到outputs里去
加载进来,把数据提取出来,拿到数据将它写数据
把之前的删除干净
把交换机和queue全部删除
执行一下
相对导入就这么直接用了
线程都已经起来了
这里就可以看到在运行了
这个里面什么变化没有,可能出了问题
这里不用的先注释掉
这里数据没人消费了
这样就行了
把之前的queue都删除了
交换机也删除,准备重新来
运行一下
这里数据就开始输出了
这里就进来了
rabbitmq通过它来解耦,数据放到这里进行缓冲,然后消费者来消费
解析的时候对html进行解析,解析的时候会有很多新的链接,这些链接应该加入到url里去,url和html是不断增长的
只有outputs才是有多少数据都消费完
现在有三个,加入用同一个队列还要对数据进行判断,是否是url还是html
写类是一步步抽象出来的
抽象成函数内部要关联起来就用queue,queue写完之后内部测试没有问题,然后再替换成外面的第三方queue
再加一下异常判断,在生产环境用没什么问题,让代码更加健壮
正好3000行,后面分析可以用scrapy