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使用reportlab画图示例(含中文汉字)
Dec 03 Python
详谈python read readline readlines的区别
Sep 22 Python
11月编程语言排行榜 Python逆袭C#上升到第4
Nov 15 Python
Python简单实现的代理服务器端口映射功能示例
Apr 08 Python
对python 操作solr索引数据的实例详解
Dec 07 Python
Pandas读写CSV文件的方法示例
Mar 27 Python
python每天定时运行某程序代码
Aug 16 Python
Django框架模板用法入门教程
Nov 04 Python
Anaconda和ipython环境适配的实现
Apr 22 Python
Python 测试框架unittest和pytest的优劣
Sep 26 Python
Python opencv缺陷检测的实现及问题解决
Apr 24 Python
Python卷积神经网络图片分类框架详解分析
Nov 07 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下统计用户在线时间的一种尝试
2010/08/26 PHP
php设计模式 Adapter(适配器模式)
2011/06/26 PHP
编写PHP脚本使WordPress的主题支持Widget侧边栏
2015/12/14 PHP
Yii使用migrate命令执行sql语句的方法
2016/03/15 PHP
Laravel与CI框架中截取字符串函数
2016/05/08 PHP
PHP获取input输入框中的值去数据库比较显示出来
2016/11/16 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
jquery 最简单易用的表单验证插件
2010/02/27 Javascript
EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题
2011/04/16 Javascript
5种处理js跨域问题方法汇总
2014/12/04 Javascript
轻松实现JavaScript图片切换
2016/01/12 Javascript
使用Script元素发送JSONP请求的方法
2016/06/12 Javascript
简单实现js悬浮导航效果
2017/02/05 Javascript
jQuery实现链接的title快速出现的方法
2017/02/20 Javascript
ES6新特性三: Generator(生成器)函数详解
2017/04/21 Javascript
vue.js实现条件渲染的实例代码
2017/06/22 Javascript
react-native-tab-navigator组件的基本使用示例代码
2017/09/07 Javascript
详解关于element el-button使用$attrs的一个注意要点
2018/11/09 Javascript
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
微信小程序跨页面数据传递事件响应实现过程解析
2019/12/19 Javascript
Node.js中文件系统fs模块的使用及常用接口
2020/03/06 Javascript
JavaScript ES6 Class类实现原理详解
2020/05/08 Javascript
[51:34]Ti4主赛事胜者组 DK vs EG 2
2014/07/19 DOTA
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
pandas带有重复索引操作方法
2018/06/08 Python
在Python 不同级目录之间模块的调用方法
2019/01/19 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
属性与 @property 方法让你的python更高效
2020/09/21 Python
什么是数据抽象
2016/11/26 面试题
网络教育自我鉴定
2013/11/01 职场文书
学校安全责任书范本
2014/07/23 职场文书
搞笑婚前保证书
2015/02/28 职场文书
装饰技术负责人岗位职责
2015/04/13 职场文书
redis配置文件中常用配置详解
2021/04/14 Redis
Java 在线考试云平台的实现
2021/11/23 Java/Android
各国货币符号大全
2022/02/17 杂记