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去除列表中重复元素的方法
Mar 20 Python
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
Jan 20 Python
Windows系统下多版本pip的共存问题详解
Oct 10 Python
pandas string转dataframe的方法
Apr 11 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
Dec 26 Python
对python 判断数字是否小于0的方法详解
Jan 26 Python
python3实现指定目录下文件sha256及文件大小统计
Feb 25 Python
解决django 新增加用户信息出现错误的问题
Jul 28 Python
Django后端发送小程序微信模板消息示例(服务通知)
Dec 17 Python
利用jupyter网页版本进行python函数查询方式
Apr 14 Python
详细分析Python垃圾回收机制
Jul 01 Python
Python 的 sum() Pythonic 的求和方法详细
Oct 16 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
Re:从零开始的异世界生活 第2季 开播啦
2020/07/24 日漫
用PHP的ob_start();控制您的浏览器cache!
2007/02/14 PHP
php字符串截取的简单方法
2013/07/04 PHP
ecshop 2.72如何修改后台访问地址
2015/03/03 PHP
PHP连接操作access数据库实例
2015/03/30 PHP
基于PHP实现商品成交时发送短信功能
2016/05/11 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
利用JQuery的load函数动态加载其它页面的内容的实现代码
2010/12/14 Javascript
JavaScript中使用构造器创建对象无需new的情况说明
2012/03/01 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
文本域中换行符的替换示例
2014/03/04 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
基于jQuery实现的文字按钮表单特效整理
2014/12/07 Javascript
jQuery实现的简单提示信息插件
2015/12/08 Javascript
js 判断数据类型的几种方法
2017/01/13 Javascript
Node.js中Bootstrap-table的两种分页的实现方法
2017/09/18 Javascript
详解vue-cli 构建项目 vue-cli请求后台接口 vue-cli使用axios、sass、swiper
2018/05/28 Javascript
html2canvas属性和使用方法以及如何使用html2canvas将HTML内容写入Canvas生成图片
2020/01/12 Javascript
Python使用scrapy采集时伪装成HTTP/1.1的方法
2015/04/08 Python
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
Python之pandas读写文件乱码的解决方法
2018/04/20 Python
一条命令解决mac版本python IDLE不能输入中文问题
2018/05/15 Python
python处理数据,存进hive表的方法
2018/07/04 Python
python打印异常信息的两种实现方式
2019/12/24 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
python实现企业微信定时发送文本消息的示例代码
2020/11/24 Python
html+js 实现markdown编辑器效果
2019/10/23 HTML / CSS
Marc O’Polo俄罗斯官方在线商店:德国高端时尚品牌
2019/12/26 全球购物
《母鸡》教学反思
2014/02/25 职场文书
小学生安全教育心得体会
2016/01/15 职场文书
2016党员干部廉政准则学习心得体会
2016/01/20 职场文书
2016年学校招生广告语
2016/01/28 职场文书
2016年党员干部公开承诺书
2016/03/24 职场文书
python pygame 开发五子棋双人对弈
2022/05/02 Python