新闻资讯
行业资讯
Python爬虫多线程如何使用多线程?Python爬虫实例代码
2018-01-04 02:16:45
摘要:python是支持多线程的,主要是通过thread和threading这两个模块来实现的。thread模块是比较底层的模块,threading模块是对thread做了一些包装的,可以更加方便的使用。

python是支持多线程的,主要是通过thread和threading这两个模块来实现的。thread模块是比较底层的模块,threading模块是对thread做了一些包装的,可以更加方便的使用。

虽然python的多线程受GIL限制,并不是真正的多线程,但是对于I/O密集型计算还是能明显提高效率,比如说爬虫。

下面用一个实例来验证多线程的效率。代码只涉及页面获取,并没有解析出来。

# -*-coding:utf-8 -*- import urllib2, time import threading class MyThread(threading.Thread):   def __init__(self, func, args):     threading.Thread.__init__(self)     self.args = args     self.func = func   def run(self):     apply(self.func, self.args) def open_url(url):   request = urllib2.Request(url)   html = urllib2.urlopen(request).read()   print len(html)   return html if __name__ == '__main__':   # 构造url列表   urlList = []   for p in range(1, 10):     urlList.append('http://s.wanfangdata.com.cn/Paper.aspx?q=%E5%8C%BB%E5%AD%A6&p=' + str(p))   # 一般方式   n_start = time.time()   for each in urlList:     open_url(each)   n_end = time.time()   print 'the normal way take %s s' % (n_end-n_start)   # 多线程   t_start = time.time()   threadList = [MyThread(open_url, (url,)) for url in urlList]   for t in threadList:     t.setDaemon(True)     t.start()   for i in threadList:     i.join()   t_end = time.time()   print 'the thread way take %s s' % (t_end-t_start)

分别用两种方式获取10个访问速度比较慢的网页,一般方式耗时50s,多线程耗时10s。

多线程代码解读:

# 创建线程类,继承Thread类 class MyThread(threading.Thread):   def __init__(self, func, args):     threading.Thread.__init__(self) # 调用父类的构造函数     self.args = args     self.func = func   def run(self): # 线程活动方法     apply(self.func, self.args) threadList = [MyThread(open_url, (url,)) for url in urlList] # 调用线程类创建新线程,返回线程列表   for t in threadList:     t.setDaemon(True) # 设置守护线程,父线程会等待子线程执行完后再退出     t.start() # 线程开启   for i in threadList:     i.join() # 等待线程终止,等子线程执行完后再执行父线程


USA-IDC海外服务器支持Python爬虫,欢迎广大用户联系24小时在线客服租用

USA-IDC为您提供免备案服务器 0元试用
立即联系在线客服,即可申请免费产品试用服务
立即申请