针对reallyinfo.rap采集项目
- 到底用scrapy还是asyncio?
首先,需要明确两点:其一 <scrapy~custom> <twisted~asyncio>,scrapy是个框架,其基于twisted事件循环实现;其二业务场景:爬虫。
scrapy框架,重配置,scrapy要适合社区推广使用,就得满足常见需求,其功能组件划分清晰,辅以广泛的接口支撑着庞大的用户群。对过滤器,下载器,并发控制等部件做黑盒处理,极大地降低了用户的使用门槛。如果有额外的需求,只需在知晓其data-flow的基础上配置middlewares即可,可扩展性极强。但是,成也萧何败也萧何,再复杂的爬虫,从工程化角度说,单次采集任务非常简单,有时候面对一些复杂的api进行处理的时候,例如url加时间戳,怎么做requests去重,该url请求失败之后,怎么再次去重并加时间戳?一个简单的问题,scrapy要扩展downloadmiddlewares,spidermiddlewares。scrapy能解决你这个问题,也能解决他的那个问题,但是解决每个问题都大费周章。
scrapy利用的twisted做异步事件管理器(类似python内置asyncio),目前我对复杂的twisted研究甚少,面对有些错误或者空跑不知所云。
但是scrapy也不是没有优点,首先是文档的优秀支持,其次是社区,在遇到问题时,除了自身debug外,多了外部的答案。这一点对于公司稳定的项目尤其友好。
asyncio,python内置,官方强大支持,也是我最开始接触事件循环的地方。在asyncio基础上不受框架的束缚,轻便开发爬虫是很舒服的,流程化的采集任务,丰富的并发控制,自定义的过滤器,下载器,一切都伸展自如。用同步的方式写异步代码,哪里有情况,就在哪里处理。因为爬虫面向的网站是变化的,所以爬虫的工程化实现也应该是灵活的。
目前社区对asyncio的优秀支持,包括aioredis,aiomongodb等。
说到底还是个用不用框架的问题,至于twisted,scrapy已经完全封装,使用者看不到。爬虫工程化要轻快,所以用asyncio更符合要求。
- 用不用redis做缓存?
要不要?redis的使用场景:1. 做代理ip缓存;2. 做cookie缓存;3. 做url缓存。除了url缓存可以在采集任务中实现,其余的都需要独立于采集任务,而外部的缓存,目前理想的就是redis了。所以要不要是个硬需求。
目前做的项目中,将url缓存完全独立于采集结果。在RAP采集任务中,往往需要重新抓取某些目标,这时候在结果集中删除,留下缺口,以待抓取。所以需要将url缓存的初始化与采集结果联系起来。