爬虫--分布式爬虫

爬虫的本质:

  很多搞爬虫的总爱吹嘘分布式爬虫,仿佛只有分布式才有逼格,不是分布式简直不配叫爬虫,这是一种很肤浅的思想。

  分布式只是提高爬虫功能和效率的一个环节而已,它从来不是爬虫的本质东西。爬虫的本质是网络请求和数据处理,如何稳定地访问网页拿到数据,如何精准地提取出高质量的数据才是核心问题。分布式爬虫只有当爬虫任务量很大的时候才会凸显优势,一般情况下也确实不必动用这个大杀器,所以要明确你的目标是什么。

分布式概念:  

  那么什么是分布式?严谨学术的概念就不搬过来了。大致来说,就是需要计算的数据量太大,任务太多,一台机器搞不定或者效率极低,需要多台机器共同协作(而不是孤立地各做各的,所以需要通信),最后所有机器完成的任务汇总在一起,完成大量任务。

  之前提到过任务《分割方法》,但这并不是严格意义上的分布式爬虫。任务分割的方法,是首先爬完了url或者id,需要爬取的任务是确定的,这个时候可以人工地将任务划分成几个互不重复的子任务,交给多台机器多个脚本去跑,这样彼此之间不通信不交流,也不会有影响。

  然而还有一种情况,输入的待爬任务并不是固定不变的,而是实时变化的,这种情况下没办法人工以固定不变的逻辑去分割任务还能确保互相独立、互不干扰,最好的办法就是把任务集中在一处,在各台机器能互相通信的前提下,互不干扰地完成任务。

分布式爬虫还有一个动机,就是以机器换速度。有的网站反爬措施很严格,你必须得慢慢爬,否则稍微一浪就被封,这种情况下只靠一台机器一个脚本的速度肯定是无法容忍的。但是对于分布式爬虫,每一个机器的脚本都有不同的IP或者帐号cookie,都以很慢的速度在爬,当并行任务多了之后,总体上的速度就很可观。

 

 

异步编程开发爬虫:

  很多人都认为python的执行环境大部分依赖GIL,而GIL限制了多线程的功

  在这里需要明确的一点就是GIL并不是python的特性,他是在实现python解释器(cpython)时所引入的一个概念,由于物理上的限制,各个厂商在CPU的的核心频率上已经被多核所取代,为了更好的利用多核的性能,这时候就出现了多线程的编程方式,随之而来的就是线程间数据的一致性和状态同步的困难

  为了使用多核,python开始支持多线程,而解决多线程之间的数据的一致性和状态的同步问题就是加锁解决,于是就产生了GIL这把锁,当越来越多的人接受这种设定以后, 他们开始依赖这种特性(也就是默认python内部对象是thread-safe的,无须在实现考虑额外的内存锁和同步的操作)

  多线程环境中,python解释器按照以下的方式执行:

    1、设置GIL  

    2、切换到一个线程去运行

    3、运行:指定数量的字节码指令或者线程主动让出控制(可以调用time.sleep())

    4、把线程设置为睡眠状态

    5、解锁GIL,再次重复以上所有的步骤

 

 

 

如何构建分布式爬虫:

  参照理论博客

  

posted @ 2019-09-11 15:45  tulintao  阅读(304)  评论(0编辑  收藏  举报