个人小玩具:协程爬虫

首先要明白协程的含义:就是比线程更小的操作单位。底层工作由python和操作系统做了,理解为小一级线程和知道如何去用就好了。

对我理解相关概念帮助很大的几篇文章:

https://zhuanlan.zhihu.com/p/25228075

http://www.dongwm.com/archives/%E4%BD%BF%E7%94%A8Python%E8%BF%9B%E8%A1%8C%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B-asyncio%E7%AF%87/

http://aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html

 

本次爬虫目标,就是爬完整个妹子图的图片。

这次的爬虫框架的主体是由500lines的异步爬虫改过来的。

首先分析一下500lines的爬虫:

这个爬虫里面除了主爬虫逻辑,还包括了report,和单元测试模块,但暂时这里只分析主逻辑。

 

实现的功能:

将所有的爬取到的 url 放到python自带的set里面(自动去重),然后还有就是实现了限定主域名,储存方面都是运用了内存,没有持久化。

在生成请求方面,允许有限次的自动重拨操作,也限定了重定向次数

分析页面,就是用正则去爬取页面中符合规则的url,然后放到上面讲到的那个set里面

并发,也就是协程,用asynico.Task来生产一定数量的协程

主逻辑是可以比喻为:(前提:一个有20个人的侦探社,一个人只能有同时查一个线索)有一天侦探社现在收到了1条线索,然后安排1个侦探去查询,结果查着查着,发现了10个线索,带回侦探社;侦探社经过研究,决定派10个侦探1人1个线索地去查,又查着查着,发现了30个线索;经侦探社研究,发现30个线索中有5个是之前发现过的,所以就去掉那5个,现在剩下25个线索,从其中选择20个线索派给20个侦探,留下5个,看谁先回来就让谁再去查,不断循环。。。

 

当然这个比喻我也觉得很牵强,但是我也是想了很久的。总之主逻辑就是:从一个根 url 出发,用正则去收集网页里面所有符合网址规则的字符串,将那些网址存到表里面,然后又从这个表里面取出来进行访问,分析页面,收集符合规则的字符串,又存起来,又爬。。。如此循环

 

根据这个爬虫框架,我仿写了一个小爬虫

数据处理方面:redis(主要是mysql不会用)

分析页面:lxml

最开始的想法是直接仿造主逻辑,只在最后爬取页面后增加保存图片这个步骤

 

 

 

 

过程中遇到的问题:

请求超时重拨的异常捕捉:

 

去重的办法用了bloom filter:

 

保存文件名错误:

 

posted @ 2017-06-12 10:28  Nanrou  阅读(316)  评论(0编辑  收藏  举报