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创建进程fork用法
Jun 04 Python
在Python的Flask中使用WTForms表单框架的基础教程
Jun 07 Python
Python变量和数据类型详解
Feb 15 Python
python实现读取excel写入mysql的小工具详解
Nov 20 Python
Python实现通过继承覆盖方法示例
Jul 02 Python
python跳过第一行快速读取文件内容的实例
Jul 12 Python
Django 限制用户访问频率的中间件的实现
Aug 23 Python
Django数据库类库MySQLdb使用详解
Apr 28 Python
python Django的web开发实例(入门)
Jul 31 Python
python同义词替换的实现(jieba分词)
Jan 21 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
Feb 23 Python
python中pickle模块浅析
Dec 29 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 mongodb扩展时 需要注意的事项
2013/06/18 PHP
php批量删除数据库下指定前缀的表以prefix_为例
2014/08/24 PHP
jquery+php实现导出datatables插件数据到excel的方法
2015/07/06 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
2019/04/10 PHP
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
javascript判断机器是否联网的2种方法
2013/08/09 Javascript
javascript 判断整数方法分享
2014/12/16 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
jQuery找出网页上最高元素的方法
2015/03/20 Javascript
jQuery使用$获取对象后检查该对象是否存在的实现方法
2016/09/04 Javascript
Canvas + JavaScript 制作图片粒子效果
2017/02/08 Javascript
input输入框内容实时监测(附代码)
2017/08/15 Javascript
react-redux中connect的装饰器用法@connect详解
2018/01/13 Javascript
解析Vue.js中的组件
2018/02/02 Javascript
vue 项目接口管理的实现
2019/01/17 Javascript
使用Node.js实现一个多人游戏服务器引擎
2019/03/13 Javascript
JavaScript实现多文件下载方法解析
2020/08/07 Javascript
基于原生JS封装的Modal对话框插件的示例代码
2020/09/09 Javascript
[37:29]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.19
2020/11/19 DOTA
在Docker上开始部署Python应用的教程
2015/04/17 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
将Dataframe数据转化为ndarry数据的方法
2018/06/28 Python
flask-restful使用总结
2018/12/04 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
2018/12/17 Python
python将类似json的数据存储到MySQL中的实例
2019/07/12 Python
Python 支持向量机分类器的实现
2020/01/15 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
2020/11/13 Python
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
美国著名的户外用品品牌:L.L.Bean
2018/01/05 全球购物
运动会广播稿100字
2014/09/14 职场文书
人生哲理妙语30条:淡写流年,笑过人生
2019/09/04 职场文书
Nginx配置https原理及实现过程详解
2021/03/31 Servers
golang http使用踩过的坑与填坑指南
2021/04/27 Golang
浅谈Laravel中使用Slack进行异常通知
2021/05/29 PHP
原生JS实现分页
2022/04/19 Javascript