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中正则表达式的使用详解
Oct 17 Python
python3实现短网址和数字相互转换的方法
Apr 28 Python
浅析Python中MySQLdb的事务处理功能
Sep 21 Python
Python多进程并发与多线程并发编程实例总结
Feb 08 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
May 25 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
Jul 17 Python
Python 从subprocess运行的子进程中实时获取输出的例子
Aug 14 Python
python matplotlib如何给图中的点加标签
Nov 14 Python
python 实现简单的FTP程序
Dec 27 Python
基于Python执行dos命令并获取输出的结果
Dec 30 Python
最新2019Pycharm安装教程 亲测
Feb 28 Python
python实现简单的购物程序代码实例
Mar 03 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出错界面
2006/10/09 PHP
PHP 图像尺寸调整代码
2010/05/26 PHP
javascript 循环读取JSON数据的代码
2010/07/17 Javascript
使用jQuery+HttpHandler+xml模拟一个三级联动的例子
2011/08/09 Javascript
关于jquery ajax 调用带参数的webservice返回XML数据一个小细节
2012/07/31 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
2014/06/13 Javascript
如何编写高质量JS代码
2014/12/28 Javascript
Jquery动态添加输入框的方法
2015/05/29 Javascript
js实现文字垂直滚动和鼠标悬停效果
2015/12/31 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
2016/02/16 Javascript
JS实现队列与堆栈的方法
2016/04/21 Javascript
JavaScript 是什么意思
2016/09/22 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
2016/12/27 Javascript
原生js实现放大镜特效
2017/03/08 Javascript
浅谈ECMAScript 中的Array类型
2019/06/10 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
2020/02/14 Javascript
js实现经典贪吃蛇小游戏
2020/03/19 Javascript
用Python编写一个每天都在系统下新建一个文件夹的脚本
2015/05/04 Python
python中ASCII码和字符的转换方法
2018/07/09 Python
详解windows python3.7安装numpy问题的解决方法
2018/08/13 Python
基于python的socket实现单机五子棋到双人对战
2020/03/24 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
2020/05/18 Python
html5+css如何实现中间大两头小的轮播效果
2018/12/06 HTML / CSS
室内拓展活动方案
2014/02/13 职场文书
关于元旦的广播稿
2014/02/16 职场文书
学生党员的自我评价范文
2014/03/01 职场文书
初中新生军训方案
2014/05/13 职场文书
2015年初中教师个人工作总结
2015/07/21 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书
个人的事迹材料怎么写
2019/04/24 职场文书
Ajax请求超时与网络异常处理图文详解
2021/05/23 Javascript
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python
浅谈Java父子类加载顺序
2021/08/04 Java/Android
详解Python中*args和**kwargs的使用
2022/04/07 Python