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 列表(List)操作方法详解
Mar 11 Python
python数据结构之二叉树的统计与转换实例
Apr 29 Python
Django静态资源URL STATIC_ROOT的配置方法
Nov 08 Python
Python实现小数转化为百分数的格式化输出方法示例
Sep 20 Python
python实现维吉尼亚加密法
Mar 20 Python
使用Python实现毫秒级抢单功能
Jun 06 Python
Python 中Django安装和使用教程详解
Jul 03 Python
python装饰器相当于函数的调用方式
Dec 27 Python
使用tensorboard可视化loss和acc的实例
Jan 21 Python
Python2与Python3关于字符串编码处理的差别总结
Sep 07 Python
python绘制雷达图实例讲解
Jan 03 Python
Pytest实现setup和teardown的详细使用详解
Apr 17 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设计模式 php实现状态模式
2015/12/07 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
2019/04/23 PHP
PHP实现的抓取小说网站内容功能示例
2019/06/27 PHP
prototype 的说明 js类
2006/09/07 Javascript
火狐4、谷歌12不支持Jquery Validator的解决方法分享
2011/06/20 Javascript
JS通过相同的name进行表格求和代码
2013/08/18 Javascript
javascript中动态加载js文件多种解决办法总结
2013/11/15 Javascript
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
js闭包实例汇总
2014/11/09 Javascript
jQuery实现美观的多级动画效果菜单代码
2015/09/06 Javascript
window.onload使用指南
2015/09/13 Javascript
javascript常用函数(2)
2015/11/05 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
jQuery基于xml格式数据实现模糊查询及分页功能的方法
2016/12/25 Javascript
JavaScript仿支付宝6位数字密码输入框
2016/12/29 Javascript
巧用canvas
2017/01/21 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
Angular.js中处理页面闪烁的方法详解
2017/03/09 Javascript
十个免费的web前端开发工具详细整理
2017/09/18 Javascript
react+redux的升级版todoList的实现
2017/12/18 Javascript
Vue 中对图片地址进行拼接的方法
2018/09/03 Javascript
微信小程序实现横向滚动导航栏效果
2019/12/12 Javascript
使用Mock.js生成前端测试数据
2020/12/13 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
Python json 错误xx is not JSON serializable解决办法
2017/03/15 Python
scrapy spider的几种爬取方式实例代码
2018/01/25 Python
python操作xlsx文件的包openpyxl实例
2018/05/03 Python
浅谈pandas dataframe对除数是零的处理
2020/07/20 Python
Html5获取高德地图定位天气的方法
2019/12/26 HTML / CSS
博士生入学考试推荐信
2013/11/17 职场文书
体育专业个人求职信范文
2013/12/27 职场文书
世界读书日的活动方案
2014/08/20 职场文书
乡镇2014法制宣传日活动总结
2014/11/01 职场文书
信用卡收入证明范本
2015/06/12 职场文书
Vue-Element-Admin集成自己的接口实现登录跳转
2021/06/23 Vue.js
nginx sticky实现基于cookie负载均衡示例详解
2022/12/24 Servers