python爬虫中多线程的使用详解


Posted in Python onSeptember 23, 2019

queue介绍

queue是python的标准库,俗称队列.可以直接import引用,在python2.x中,模块名为Queue。python3直接queue即可

在python中,多个线程之间的数据是共享的,多个线程进行数据交换的时候,不能够保证数据的安全性和一致性,所以当多个线程需要进行数据交换的时候,队列就出现了,队列可以完美解决线程间的数据交换,保证线程间数据的安全性和一致性。

#多线程实战栗子(糗百)
#用一个队列Queue对象,
#先产生所有url,put进队列;
#开启多线程,把queue队列作为参数传入
#主函数中读取url
import requests
from queue import Queue
import re,os,threading,time
# 构造所有ip地址并添加进queue队列
headers = {
  'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
}
urlQueue = Queue()
[urlQueue.put('http://www.qiumeimei.com/image/page/{}'.format(i)) for i in range(1,14)]
def get_image(urlQueue):
  while True:
    try:
      # 不阻塞的读取队列数据
      url = urlQueue.get_nowait()
      # i = urlQueue.qsize()
    except Exception as e:
      break
    print('Current Thread Name %s, Url: %s ' % (threading.currentThread().name, url))
    try:
      res = requests.get(url, headers=headers)
      url_infos = re.findall('data-lazy-src="(.*?)"', res.text, re.S)
      for url_info in url_infos:
        if os.path.exists(img_path + url_info[-20:]):
          print('图片已存在')
        else:
          image = requests.get(url_info, headers=headers)
          with open(img_path + url_info[-20:], 'wb') as fp:
            time.sleep(1)
            fp.write(image.content)
          print('正在下载:' + url_info)
    except Exception as e:
      print(e)
if __name__ == '__main__':
  startTime = time.time()
  # 定义图片存储路径
  img_path = './img/'
  if not os.path.exists(img_path):
    os.mkdir(img_path)
  threads = []
  # 可以调节线程数, 进而控制抓取速度
  threadNum = 4
  for i in range(0, threadNum):
    t = threading.Thread(target=get_image, args=(urlQueue,))
    threads.append(t)
  for t in threads:
    t.start()
  for t in threads:
    # 多线程多join的情况下,依次执行各线程的join方法, 这样可以确保主线程最后退出, 且各个线程间没有阻塞
    t.join()
  endTime = time.time()
  print('Done, Time cost: %s ' % (endTime - startTime))

总结

以上所述是小编给大家介绍的python爬虫中多线程的使用详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python的math模块中的常用数学函数整理
Feb 04 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
Sep 04 Python
PyQt5 实现字体大小自适应分辨率的方法
Jun 18 Python
Django通过dwebsocket实现websocket的例子
Nov 15 Python
pytorch如何冻结某层参数的实现
Jan 10 Python
基于python实现语音录入识别代码实例
Jan 17 Python
如何理解Python中包的引入
May 29 Python
Numpy 多维数据数组的实现
Jun 18 Python
python文件读取失败怎么处理
Jun 23 Python
详解python模块pychartdir安装及导入问题
Oct 22 Python
手把手教你配置JupyterLab 环境的实现
Feb 02 Python
Pandas数据类型之category的用法
Jun 28 Python
Django中自定义模型管理器(Manager)及方法
Sep 23 #Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
Sep 23 #Python
Python 单例设计模式用法实例分析
Sep 23 #Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
Sep 23 #Python
详解Python3定时器任务代码
Sep 23 #Python
python应用文件读取与登录注册功能
Sep 23 #Python
Python爬虫 urllib2的使用方法详解
Sep 23 #Python
You might like
PHP与SQL注入攻击[一]
2007/04/17 PHP
PHP使用fopen与file_get_contents读取文件实例分享
2016/03/04 PHP
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
Javascript 判断函数类型完美解决方案
2009/09/02 Javascript
jQuery 扩展对input的一些操作方法
2009/10/30 Javascript
为jQuery.Treeview添加右键菜单的实现代码
2010/10/22 Javascript
Javascript图像处理—为矩阵添加常用方法
2012/12/27 Javascript
jQuery代码实现发展历程时间轴特效
2015/07/30 Javascript
原生js图片轮播效果实现代码
2016/10/19 Javascript
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
微信小程序 POST请求的实例详解
2017/09/29 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
Angular6 写一个简单的Select组件示例
2018/08/20 Javascript
vue-cli项目配置多环境的详细操作过程
2018/10/30 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
详解利用eventemitter2实现Vue组件通信
2019/11/04 Javascript
vue transition 在子组件中失效的解决
2019/11/12 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
2020/01/07 Javascript
原生JS生成指定位数的验证码
2020/10/28 Javascript
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
用python删除java文件头上版权信息的方法
2014/07/31 Python
python网络编程之读取网站根目录实例
2014/09/30 Python
Python用for循环实现九九乘法表
2018/05/31 Python
Python切片操作深入详解
2018/07/27 Python
Python2与Python3的区别实例分析
2019/04/11 Python
详解python 爬取12306验证码
2019/05/10 Python
python实践项目之监控当前联网状态详情
2019/05/23 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
迎八一活动主题
2014/01/31 职场文书
中级会计职业生涯规划书
2014/03/01 职场文书
幽默自我介绍演讲稿
2014/08/21 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书
先进基层党组织材料
2014/12/25 职场文书
Pygame Event事件模块的详细示例
2021/11/17 Python