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中的随机函数小结
Jan 27 Python
Python告诉你木马程序的键盘记录原理
Feb 02 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
Mar 11 Python
python与mysql数据库交互的实现
Jan 06 Python
Python Selenium参数配置方法解析
Jan 19 Python
python应用Axes3D绘图(批量梯度下降算法)
Mar 25 Python
Python基于当前时间批量创建文件
May 07 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
May 27 Python
python 写函数在一定条件下需要调用自身时的写法说明
Jun 01 Python
python+requests接口自动化框架的实现
Aug 31 Python
python中翻译功能translate模块实现方法
Dec 17 Python
Python中tkinter的用户登录管理的实现
Apr 22 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中的错误处理、异常处理机制分析
2012/05/07 PHP
php递归方法实现无限分类实例代码
2014/02/28 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
php mongodb操作类 带几个简单的例子
2016/08/25 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
PHP实现通过CURL上传文件功能示例
2018/05/30 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
PHP isset()及empty()用法区别详解
2020/08/29 PHP
javascript globalStorage类代码
2009/06/04 Javascript
图片onload事件触发问题解决方法
2011/07/31 Javascript
JavaScript常用数组算法小结
2016/02/13 Javascript
JavaScript计算器网页版实现代码分享
2016/07/15 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
2017/01/22 Javascript
微信小程序 支付功能开发错误总结
2017/02/21 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
vue 中的keep-alive实例代码
2018/07/20 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
JavaScript中的this基本问题实例小结
2020/03/09 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
2020/07/17 Javascript
原生js实现自定义消息提示框
2020/11/19 Javascript
pycharm 使用心得(九)解决No Python interpreter selected的问题
2014/06/06 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
python更改已存在excel文件的方法
2018/05/03 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
在python中pandas的series合并方法
2018/11/12 Python
python自动发微信监控报警
2019/09/06 Python
如何学习Python time模块
2020/06/03 Python
Python 带星号(* 或 **)的函数参数详解
2021/02/23 Python
做一个能自适应高度的textarea的示例代码
2019/09/06 HTML / CSS
Europcar比利时:租车
2019/08/26 全球购物
如何开发安全的AJAX应用
2014/03/26 面试题
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
优秀党员先进事迹材料2016
2016/02/29 职场文书
缓存替换策略及应用(以Redis、InnoDB为例)
2021/07/25 Redis
Vue的过滤器你真了解吗
2022/02/24 Vue.js
Java 定时任务技术趋势简介
2022/05/04 Java/Android