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实现的一个找零钱的小程序代码分享
Aug 25 Python
浅谈numpy库的常用基本操作方法
Jan 09 Python
用python标准库difflib比较两份文件的异同详解
Nov 16 Python
在PyCharm导航区中打开多个Project的关闭方法
Jan 17 Python
python and or用法详解
Jun 26 Python
在Python函数中输入任意数量参数的实例
Jul 16 Python
Python笔试面试题小结
Sep 07 Python
python函数不定长参数使用方法解析
Dec 14 Python
python使用HTMLTestRunner导出饼图分析报告的方法
Dec 30 Python
python实现高斯投影正反算方式
Jan 17 Python
django models里数据表插入数据id自增操作
Jul 15 Python
python tqdm实现进度条的示例代码
Nov 10 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判断图片格式的七种方法小结
2013/06/03 PHP
php过滤敏感词的示例
2014/03/31 PHP
禁止js文件缓存的代码
2010/04/09 Javascript
使用dynatrace-ajax跟踪JavaScript的性能
2010/04/12 Javascript
jquery随机展示头像代码
2011/12/21 Javascript
JavaScript动态创建div属性和样式示例代码
2013/10/09 Javascript
js获取当前页面路径示例讲解
2014/01/08 Javascript
JavaScript实现数据类型的相互转换
2016/03/06 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
angularjs路由传值$routeParams详解
2020/09/05 Javascript
vue2.0使用swiper组件实现轮播的示例代码
2018/03/03 Javascript
微信小程序 WXML节点信息查询详解
2019/07/29 Javascript
[01:46]辉夜杯—打造中国DOTA新格局
2015/12/25 DOTA
python提取字典key列表的方法
2015/07/11 Python
Flask框架通过Flask_login实现用户登录功能示例
2018/07/17 Python
使用TensorFlow实现二分类的方法示例
2019/02/05 Python
通过shell+python实现企业微信预警
2019/03/07 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
Python OrderedDict字典排序方法详解
2020/05/21 Python
Python如何在循环内使用list.remove()
2020/06/01 Python
使用CSS实现阅读进度条
2017/02/27 HTML / CSS
html5声频audio和视频video等新特性详细说明
2012/12/26 HTML / CSS
美国内衣品牌:Leonisa
2016/08/14 全球购物
Burberry英国官网:英国标志性奢侈品牌
2017/03/29 全球购物
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
CSMA/CD介质访问控制协议
2015/11/17 面试题
员工培训邀请函
2014/01/11 职场文书
茶叶店创业计划书范文
2014/01/19 职场文书
信电学院毕业生自荐书
2014/05/24 职场文书
领导干部贪图享乐整改措施
2014/09/21 职场文书
本溪关门山导游词
2015/02/09 职场文书
田径运动会广播稿
2015/08/19 职场文书
Pytest allure 命令行参数的使用
2021/04/18 Python
nginx配置文件使用环境变量的操作方法
2021/06/02 Servers
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL
JavaScript正则表达式实现注册信息校验功能
2022/05/30 Java/Android