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爬虫:通过关键字爬取百度图片
Feb 17 Python
python+pillow绘制矩阵盖尔圆简单实例
Jan 16 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
Apr 23 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
Apr 25 Python
浅谈python中拼接路径os.path.join斜杠的问题
Oct 23 Python
Django框架模板注入操作示例【变量传递到模板】
Dec 19 Python
用Python将结果保存为xlsx的方法
Jan 28 Python
Python将字符串常量转化为变量方法总结
Mar 17 Python
Python内存管理实例分析
Jul 10 Python
解决Python3 抓取微信账单信息问题
Jul 19 Python
OpenCV读取与写入图片的实现
Oct 13 Python
浅谈Python3中datetime不同时区转换介绍与踩坑
Aug 02 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
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
PHP 截取字符串专题集合
2010/08/19 PHP
php smarty 二级分类代码和模版循环例子
2011/06/01 PHP
PHP的可变变量名的使用方法分享
2012/02/05 PHP
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
2015/12/19 PHP
PHP设计模式之委托模式定义与用法简单示例
2018/08/13 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
JavaScript创建一个object对象并操作对象属性的用法
2015/03/23 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
jQuery实用技巧必备(中)
2015/11/03 Javascript
JS表格组件神器bootstrap table使用指南详解
2017/04/12 Javascript
Jquery EasyUI $.Parser
2017/06/02 jQuery
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
js定时器+简单的动画效果实例
2017/11/10 Javascript
vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
2017/11/27 Javascript
关于react中组件通信的几种方式详解
2017/12/10 Javascript
详解多页应用 Webpack4 配置优化与踩坑记录
2018/10/16 Javascript
js实现无缝轮播图插件封装
2020/07/31 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
Vue实现圆环进度条的示例
2021/02/06 Vue.js
python列表与元组详解实例
2013/11/01 Python
使用简单工厂模式来进行Python的设计模式编程
2016/03/01 Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
2019/08/20 Python
在Python中使用MongoEngine操作数据库教程实例
2019/12/03 Python
python 实现dict转json并保存文件
2019/12/05 Python
基于PyTorch中view的用法说明
2021/03/03 Python
浅谈h5自定义audio(问题及解决)
2016/08/19 HTML / CSS
OLEDBConnection和SQLConnection有什么区别
2013/05/31 面试题
大三在校生电子商务求职信
2013/10/29 职场文书
工商管理专业应届生求职信
2013/11/04 职场文书
公司庆典邀请函范文
2014/01/13 职场文书
关于赌博的检讨书
2014/01/24 职场文书
连锁酒店店长职责范本
2014/02/13 职场文书
考察现实表现材料
2014/05/19 职场文书
使用Nginx的访问日志统计PV与UV
2022/05/06 Servers