python爬虫:一些爬虫常用的技巧 (2)

于是需要这样修改代码:

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

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

然后就是解压缩数据:

import StringIO import gzip compresseddata = f.read()  compressedstream = StringIO.StringIO(compresseddata) gzipper = gzip.GzipFile(fileobj=compressedstream)  print gzipper.read() 8、多线程并发抓取

单线程太慢的话,就需要多线程了,这里给个简单的线程池模板 这个程序只是简单地打印了1-10,但是可以看出是并发的。

虽然说python的多线程很鸡肋,但是对于爬虫这种网络频繁型,还是能一定程度提高效率的。

from threading import Thread from Queue import Queue from time import sleep # q是任务队列 #NUM是并发线程总数 #JOBS是有多少任务 q = Queue() NUM = 2 JOBS = 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()

转自:  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgyjwy.html