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 相关文章推荐
利用打码兔和超人打码自封装的打码类分享
Mar 16 Python
跟老齐学Python之字典,你还记得吗?
Sep 20 Python
初步理解Python进程的信号通讯
Apr 09 Python
详解Python中的正则表达式的用法
Apr 09 Python
Python装饰器使用实例:验证参数合法性
Jun 24 Python
Python实现PS滤镜的旋转模糊功能示例
Jan 20 Python
简单了解python的break、continue、pass
Jul 08 Python
python装饰器的特性原理详解
Dec 25 Python
PyCharm 专业版安装图文教程
Feb 20 Python
在python3中实现更新界面
Feb 21 Python
TensorFlow2.0使用keras训练模型的实现
Feb 20 Python
tensorflow中的梯度求解及梯度裁剪操作
May 26 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
SSI指令
2006/11/25 PHP
Win2003服务器安全加固设置--进一步提高服务器安全性
2007/05/23 PHP
用PHP程序实现支持页面后退的两种方法
2008/06/30 PHP
php输出xml格式字符串(用的这个)
2012/07/12 PHP
PHP 通过Socket收发十六进制数据的实现代码
2013/08/16 PHP
CodeIgniter中使用Smarty3基本配置
2015/06/29 PHP
Smarty变量用法详解
2016/05/11 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
2020/04/27 PHP
jQuery中:reset选择器用法实例
2015/01/04 Javascript
点评js异步加载的4种方式
2015/12/22 Javascript
javascript中利用柯里化函数实现bind方法【推荐】
2016/04/29 Javascript
html+js+highcharts绘制圆饼图表的简单实例
2016/08/04 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
2016/12/18 Javascript
走进AngularJs之过滤器(filter)详解
2017/02/17 Javascript
使用JavaScript实现表格编辑器(实例讲解)
2017/08/02 Javascript
Node.js简单入门前传
2017/08/21 Javascript
Cpage.js给组件绑定事件的实现代码
2017/08/31 Javascript
angular6开发steps步骤条组件
2019/07/04 Javascript
nodejs 递归拷贝、读取目录下所有文件和目录
2019/07/18 NodeJs
Vue中axios的封装(报错、鉴权、跳转、拦截、提示)
2019/08/20 Javascript
使用 Angular RouteReuseStrategy 缓存(路由)组件的实例代码
2019/11/01 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
python中xrange和range的区别
2014/05/13 Python
Python实现将Excel转换成为image的方法
2018/10/23 Python
对python借助百度云API对评论进行观点抽取的方法详解
2019/02/21 Python
Python使用正则表达式分割字符串的实现方法
2019/07/16 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
CSS3按钮鼠标悬浮实现光圈效果源码
2016/09/11 HTML / CSS
印度第一网上礼品店:IGP.com
2020/02/06 全球购物
英语自我评价范文
2014/01/24 职场文书
企业消防安全制度
2014/02/02 职场文书
2014党员学习习主席讲话思想汇报
2014/09/15 职场文书
病人写给医生的感谢信
2015/01/23 职场文书
2019大学毕业晚会主持词
2019/06/21 职场文书
vue中data改变后让视图同步更新的方法
2021/03/29 Vue.js
thinkphp 获取控制器及控制器方法
2021/04/16 PHP