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 27 Python
Python pickle模块用法实例分析
May 27 Python
最大K个数问题的Python版解法总结
Jun 16 Python
python2.7无法使用pip的解决方法(安装easy_install)
Apr 03 Python
Python叠加两幅栅格图像的实现方法
Jul 05 Python
Python tkinter 下拉日历控件代码
Mar 04 Python
浅谈keras 模型用于预测时的注意事项
Jun 27 Python
用Python 爬取猫眼电影数据分析《无名之辈》
Jul 24 Python
浅析Python打包时包含静态文件处理方法
Jan 15 Python
python四个坐标点对图片区域最小外接矩形进行裁剪
Jun 04 Python
Python上下文管理器Content Manager
Jun 26 Python
python自动获取微信公众号最新文章的实现代码
Jul 15 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
中英文字符串翻转函数
2008/12/09 PHP
php解析json数据实例
2014/08/19 PHP
利用laravel搭建一个迷你博客实战教程
2017/08/13 PHP
键盘 keycode的值 javascript时触发事件时很有用的要素
2009/11/02 Javascript
jQuery EasyUI 中文API Layout(Tabs)
2010/04/27 Javascript
Javascript异步编程模型Promise模式详细介绍
2014/05/08 Javascript
jQuery实现Twitter的自动文字补齐特效
2014/11/28 Javascript
JavaScript中的原始值和复杂值
2016/01/07 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
2016/05/31 Javascript
Bootstrap3 图片(响应式图片&图片形状)
2017/01/04 Javascript
Javascript中for循环语句的几种写法总结对比
2017/01/23 Javascript
JavaScript阻止表单提交方法(附代码)
2017/08/15 Javascript
Bootstrap 3多级下拉菜单实例
2017/11/23 Javascript
vue表单自定义校验规则介绍
2018/08/28 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
Javascript Dom元素获取和添加详解
2019/09/24 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
[01:30]2016国际邀请赛中国区预选赛神秘商店火爆开启
2016/06/26 DOTA
Python常用库推荐
2016/12/04 Python
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
python 获取当天凌晨零点的时间戳方法
2018/05/22 Python
安装好Pycharm后如何配置Python解释器简易教程
2019/06/28 Python
Django使用list对单个或者多个字段求values值实例
2020/03/31 Python
python中逻辑与或(and、or)和按位与或异或(&、|、^)区别
2020/08/05 Python
The Beach People美国:澳洲海滨奢华品牌
2018/07/05 全球购物
JAVA程序员自荐书
2014/01/30 职场文书
企业法人授权委托书
2014/04/03 职场文书
高二学年自我鉴定范文(2篇)
2014/09/26 职场文书
社区好人好事材料
2014/12/26 职场文书
个人事迹材料怎么写
2014/12/30 职场文书
2015新学期家长寄语
2015/02/26 职场文书
大学生实习介绍信
2015/05/05 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
创业计划书之干洗店
2019/09/10 职场文书
sql通过日期判断年龄函数的示例代码
2021/07/16 SQL Server
Win11 21h2可以升级22h2吗?看看你的电脑符不符合要求
2022/07/07 数码科技