您的位置:首页 >新闻资讯

浅析Python爬虫的多线程并发和gzip压缩

来源:本站 作者:admin 时间:2019-05-05 11:58:58

一、多线程。爬虫的工作量往往非常巨大,单线程太慢了,往往需要多线程,这里给个简单的线程池模板 这个程序只是简单地打印了1-10,但是可以看出是并发的。虽然说python的多线程很鸡肋,但是对于爬虫这种网络频繁型,还是能一定程度提高效率的。


Python爬虫


from threading import Threadfrom Queue import Queuefrom time import sleep# q是任务队列#NUM是并发线程总数#JOBS是有多少任务q=Queue()NUM=2JOBS=10#具体的处理函数,负责处理单个任务def do_somthing_using(arguments):    print arguments#这个是工作进程,负责不断从队列取数据并处理def working():    while True:        arguments=q.get()        do_somthing_using(arguments)        sleep(1)        q.task_done()#fork NUM个线程等待队列for i in range(NUM):    t=Thread(target=working)    t.setDaemon(True)    t.start()#把JOBS排入队列for i in range(JOBS):    q.put(i)#等待所有JOBS完成q.join()


二、gzip压缩。经常遇到某些网页,不论怎么转码都是一团乱码。这是因为许多web服务具有发送压缩数据的能力,可以将网络线路上传输的大量数据消减 60% 以上。这尤其适用于 XML web 服务,因为 XML 数据 的压缩率可以很高。


但是一般服务器不会为你发送压缩数据,除非你告诉服务器你可以处理压缩数据。


于是需要这样修改代码:


import urllib2, httplibrequest=urllib2.Request('http://xxxxx.com')request.add_header('Accept-encoding', 'gzip')        1opener=urllib2.build_opener()f=opener.open(request)


这是关键:创建Request对象,添加一个 Accept-encoding 头信息告诉服务器你能接受 gzip 压缩数据


然后就是解压缩数据:


import StringIOimport gzipcompresseddata=f.read() compressedstream=StringIO.StringIO(compresseddata)gzipper=gzip.GzipFile(fileobj=compressedstream) print gzipper.read()


相关文章内容简介
推荐阅读