扣丁学堂浅谈Python3视频教程之多线程爬虫实例讲解

2018-01-04 10:11:37 531浏览

今天扣丁学堂给大家详细介绍一下关于Python3多线程爬虫实例讲解,首先多线程使得程序内部可以分出多个线程来做多件事情,充分利用CPU空闲时间,提升处理效率。python提供了两个模块来实现多线程thread和threading,thread有一些缺点,在threading得到了弥补。并且在Python3中废弃了thread模块,保留了更强大的threading模块。



使用场景

在python的原始解释器CPython中存在着GIL(GlobalInterpreterLock,全局解释器锁),因此在解释执行python代码时,会产生互斥锁来限制线程对共享资源的访问,直到解释器遇到I/O操作或者操作次数达到一定数目时才会释放GIL。所以,虽然CPython的线程库直接封装了系统的原生线程,但CPython整体作为一个进程,同一时间只会有一个获得GIL的线程在跑,其他线程则处于等待状态。这就造成了即使在多核CPU中,多线程也只是做着分时切换而已。

如果你的程序是CPU密集型,多个线程的代码很有可能是线性执行的。所以这种情况下多线程是鸡肋,效率可能还不如单线程因为有上下文切换开销。但是如果你的代码是IO密集型,涉及到网络、磁盘IO的任务都是IO密集型任务,多线程可以明显提高效率,例如多线程爬虫,多线程文件处理等等

多线程爬虫

多线程爬虫的代码实例

注:以下代码在python3下运行通过,python2版本差异较大,不能运行成功,如需帮助请下方留意。

#coding=utf-8

importthreading,queue,time,urllib

fromurllibimportrequest

baseUrl="http://www.codingke.com/python/"

urlQueue=queue.Queue()

foriinrange(2,10):

url=baseUrl+str(i)+'.html'

urlQueue.put(url)

#print(url)

deffetchUrl(urlQueue):

whileTrue:

try:

#不阻塞的读取队列数据

url=urlQueue.get_nowait()

i=urlQueue.qsize()

exceptExceptionase:

break

print('CurrentThreadName%s,Url:%s'%(threading.currentThread().name,url))

try:

response=urllib.request.urlopen(url)

responseCode=response.getcode()

exceptExceptionase:

continue

ifresponseCode==200:

#抓取内容的数据处理可以放到这里

#为了突出效果,设置延时

time.sleep(1)

if__name__=='__main__':

startTime=time.time()

threads=[]

#可以调节线程数,进而控制抓取速度

threadNum=4

foriinrange(0,threadNum):

t=threading.Thread(target=fetchUrl,args=(urlQueue,))

threads.append(t)

fortinthreads:

t.start()

fortinthreads:

#多线程多join的情况下,依次执行各线程的join方法,这样可以确保主线程最后退出,且各个线程间没有阻塞

t.join()

endTime=time.time()

print('Done,Timecost:%s'%(endTime-startTime))

运行结果:

1个线程时:

CurrentThreadNameThread-1,Url:http://www.codingke.com/course/320

CurrentThreadNameThread-1,Url:http://www.codingke.com/

CurrentThreadNameThread-1,Url:http://www.codingke.com/python/

CurrentThreadNameThread-1,Url:http://www.codingke.com/course/324

CurrentThreadNameThread-1,Url:http://www.codingke.com/course/278

CurrentThreadNameThread-1,Url:http://www.codingke.com/course/247

CurrentThreadNameThread-1,Url:http://www.codingke.com/course/246

Done,Timecost:8.182249069213867

2个线程时:

CurrentThreadNameThread-1,Url:http://www.codingke.com/course/320

CurrentThreadNameThread-2,Url:http://www.codingke.com/

CurrentThreadNameThread-2,Url:http://www.codingke.com/python/

CurrentThreadNameThread-1,Url:http://www.codingke.com/course/324

CurrentThreadNameThread-2,Url:http://www.codingke.com/course/278

CurrentThreadNameThread-1,Url:http://www.codingke.com/course/247

CurrentThreadNameThread-2,Url:http://www.codingke.com/course/246

Done,Timecost:4.0987958908081055

3个线程时:

CurrentThreadNameThread-1,Url:http://www.codingke.com/course/320

CurrentThreadNameThread-2,Url:http://www.codingke.com/

CurrentThreadNameThread-3,Url:http://www.codingke.com/python/

CurrentThreadNameThread-4,Url:http://www.codingke.com/course/324

CurrentThreadNameThread-2,Url:http://www.codingke.com/course/278

CurrentThreadNameThread-4,Url:http://www.codingke.com/course/247

CurrentThreadNameThread-1,Url:http://www.codingke.com/course/246

Done,Timecost:2.287320137023926

通过调节线程数可以看到,执行时间会随着线程数的增加而缩短,抓取效率成正比增加。

以上就是关于Python3视频教程多线程爬虫实例讲解介绍,最后Python多线程在IO密集型任务,多线程可以明显提高效率,CPU密集型任务不适合使用多线程处理,想要学习Python的小伙伴可以选择扣丁学堂,扣丁学堂不仅有专业的老师,还有与时俱进的课程体系,更有大量的Python培训视频教程供学员观看学习,心动的小伙伴抓紧时间行动吧。扣丁学堂Python技术交流群:279521237。






关注微信公众号获取更多的学习资料



查看更多关于"Python开发资讯"的相关文章>>

标签: Python视频教程 Python基础教程 Python爬虫 Python培训

热门专区

暂无热门资讯

课程推荐

微信
微博
15311698296

全国免费咨询热线

邮箱:codingke@1000phone.com

官方群:148715490

北京千锋互联科技有限公司版权所有   北京市海淀区宝盛北里西区28号中关村智诚科创大厦4层
京ICP备12003911号-6   Copyright © 2013 - 2019

京公网安备 11010802030908号