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 多进程通信模块的简单实现
Feb 20 Python
python入门之语句(if语句、while语句、for语句)
Jan 19 Python
python去除文件中空格、Tab及回车的方法
Apr 12 Python
Linux RedHat下安装Python2.7开发环境
May 20 Python
Python3 replace()函数使用方法
Mar 19 Python
图文详解python安装Scrapy框架步骤
May 20 Python
python实现得到当前登录用户信息的方法
Jun 21 Python
Python实现FTP文件传输的实例
Jul 07 Python
python运用pygame库实现双人弹球小游戏
Nov 25 Python
python爬虫工具例举说明
Nov 30 Python
PyTorch中的torch.cat简单介绍
Mar 17 Python
Python实现文字pdf转换图片pdf效果
Apr 03 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实现删除字符串中任何字符的函数
2015/08/11 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
JS 有名函数表达式全面解析
2010/03/19 Javascript
简略的前端架构心得&&基于editor为例子的编码小技巧
2010/11/25 Javascript
jQuery的显示和隐藏方法与css隐藏的样式对比
2013/10/18 Javascript
浅析JavaScript中的delete运算符
2013/11/30 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
js中小数转换整数的方法
2014/01/26 Javascript
javascript运行机制之this详细介绍
2014/02/07 Javascript
js获取判断上传文件后缀名的示例代码
2014/02/19 Javascript
jQuery中的编程范式详解
2014/12/15 Javascript
jQuery实现仿新浪微博浮动的消息提示框(可智能定位)
2015/10/10 Javascript
全面解析Bootstrap排版使用方法(标题)
2015/11/30 Javascript
JS实现区分中英文并统计字符个数的方法示例
2018/06/09 Javascript
vue配置接口域名方法总结
2019/05/12 Javascript
了解javascript中变量及函数的提升
2019/05/27 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
[54:51]Ti4 冒泡赛第二轮LGD vs C9 3
2014/07/14 DOTA
[07:59]2014DOTA2叨叨刀塔 林熊猫称被邀请赛现场盛况震撼
2014/07/21 DOTA
跟老齐学Python之编写类之三子类
2014/10/11 Python
python统计字符串中指定字符出现次数的方法
2015/04/04 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
2020/10/28 Python
Restful_framework视图组件代码实例解析
2020/11/17 Python
如何基于Python pygame实现动画跑马灯
2020/11/18 Python
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
制药工程专业应届生求职信
2013/09/24 职场文书
大学毕业感言50字
2014/02/07 职场文书
优秀班主任推荐材料
2014/12/17 职场文书
个性与发展自我评价
2015/03/06 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
体育部部长竞选稿
2015/11/21 职场文书
2016年“12.3”国际残疾人日活动总结
2016/04/01 职场文书
个人的事迹材料怎么写
2019/04/24 职场文书
python爬虫之selenium库的安装及使用教程
2021/05/23 Python