扣丁学堂浅谈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培训