Python 多线程与常见算法

多线程介绍

我们之前所讲到的爬虫,都只有一个进程一个线程,我们称之为单线程爬虫。单线程爬虫每次只访问一个页面,不能充分利用电脑的网络带宽。一个页面最多也就几百KB,所以爬虫在爬取一个页面的时候,多出来的网速就浪费掉了。

而如果我们可以让爬虫同时访问10个页面,就相当于我们的爬取速度提高了10倍。这个时候就需要使用多线程技术了。

这里有一点要强调一下,Python这门语言在设计上的时候,有一个GIL锁。这个东西让Python的多线程都是伪多线程。本质上还是只有一个线程,但是这个线程每个事情只做几毫秒,做完几秒救保存线程,换做其他事情几毫秒,换一轮下来继续回到第一件事上,恢复线程再做几秒,继续换……

在《X战警-天启》中,万磁王他儿子从教授的学院里面救出了非常多的人。由于他速度非常的快,所以虽然它是一个人一个人救的,但是对其他人来说,就感觉像是全部同时移动到了学校外面去了一样。

这样微观上的单线程,在宏观上看起来就像是同时在做几件事。这种机制在IO密集型的操作上面影响也不大,但是在CPU计算密集型的操作上面,由于只能使用CPU的一个核,这就会对性能产生非常大的影响。所以涉及到计算密集型的程序,就需要使用多进程,Python的多进程不受GIL锁的影响。

爬虫属于IO密集型的程序,所以使用多线程不会不会对性能造成太大的影响。

multiprocessing库

multiprocessing是Python的一个多进程库,它可以实现多进程的操作。但是由于进程与进程之间不能直接共享资源,而且启动新的进程开销也比线程大得多。因此我们使用多线程来爬取。multiprocessing下面有一个dummy模块,它可以让Python的线程使用multiprocessing各种方法。

dummy下面有一个Pool类,它用来实现线程池。这个线程池有一个map 方法。这个方法可以让线程池里面的所有线程都“同时”执行一个函数。

from multiprocessing.dummy import Pool

pool = Pool(10)

results = pool.map(爬取函数, 网址列表)

下面来一段简单的单线程和多线程爬虫的代码,代码写的不好!只是一个思路的简单演示

单线程

# -*- coding: utf-8 -*-

python爬虫系统学习八:多线程与常见算法

多线程

# -*- coding: utf-8 -*-

python爬虫系统学习八:多线程与常见算法

爬虫的常见算法

深度优先算法

为了解释什么是深度优先算法和广度优先算法,我们举一个例子。

大家都打过RPG游戏吧,在游戏里面我们会找NPC来接任务。有的同学喜欢一次只领取一个任务,把这个任务做完,再去领下一个任务,这就叫做深度优先算法。另外一些同学他们喜欢先把所有的任务一次性接玩,然后再去慢慢完成,最后再一次性的把任务奖励都领取了。这就叫做广度优先算法。

python爬虫系统学习八:多线程与常见算法

在深度优先算法的情况下,我们的爬取路线如下图所示:

python爬虫系统学习八:多线程与常见算法

首先要走完红色线,把爬虫的所有课时都爬取完成,再走绿色线爬取Django的所有课时,最后再走黄色线爬取机器学习的的所有课时。然后再去爬取Node.js的所有信息……

广度优先算法

在广度优先的算法情况下,我们的爬取路线如下图所示:

python爬虫系统学习八:多线程与常见算法

首先走红色,绿色,肉色线爬取每个大分类的信息。然后再走橙色,蓝色,灰色线从第一个大分类中,爬取所有的课程信息,爬完了第一个大分类,再爬第二个大分类。直到所有大分类下面的课程信息都搞定了,再爬第一个课程的所有课时信息……

好了到这里大家就可以自己动手写一个爬取静态网页的小爬虫了 ,大家动起手来吧! 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值