前言

文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取
python免费学习资料以及群交流解答点击即可加入


从 QQ 到微信,表情包一直都是中国互联网用户的「心头好」,时至今日,甚至发展到了「无表情包不聊天」的地步。

无论是正事儿还是闲侃,表情包都必不可少。聊天到一半发现表情包不够用怎么办?今天正心老师带你彻底解决这个问题!

知识点:

  1. requests
  2. css选择器

开发环境:

  1. 版 本:anaconda5.2.0(python3.6.5)
  2. 编辑器:pycharm

第三方库:

  1. requests
  2. parsel

进行网页分析

目标站点

  • 开发者工具的使用

    • network
    • element

concurrent.futures

Python3.2带来了 concurrent.futures 模块,这个模块具有线程池和进程池、管理并行编程任务、处理非确定性的执行流程、进程/线程同步等功能。

此模块由以下部分组成:

  • concurrent.futures.Executor: 这是一个虚拟基类,提供了异步执行的方法。
  • submit(function, argument): 调度函数(可调用的对象)的执行,将 argument 作为参数传入。
  • map(function, argument): 将 argument 作为参数执行函数,以 异步 的方式。
  • shutdown(Wait=True): 发出让执行者释放所有资源的信号。
  • concurrent.futures.Future: 其中包括函数的异步执行。Future对象是submit任务(即带有参数的functions)到executor的实例。

Executor是抽象类,可以通过子类访问,即线程或进程的 ExecutorPools 。因为,线程或进程的实例是依赖于资源的任务,所以最好以“池”的形式将他们组织在一起,作为可以重用的launcher或executor。

使用线程池

线程池或进程池是用于在程序中优化和简化线程/进程的使用。通过池,你可以提交任务给executor。池由两部分组成,一部分是内部的队列,存放着待执行的任务;另一部分是一系列的进程或线程,用于执行这些任务。池的概念主要目的是为了重用:让线程或进程在生命周期内可以多次使用。它减少了创建创建线程和进程的开销,提高了程序性能。重用不是必须的规则,但它是程序员在应用中使用池的主要原因。

current.Futures 模块提供了两种 Executor 的子类,各自独立操作一个线程池和一个进程池。这两个子类分别是:

  • concurrent.futures.ThreadPoolExecutor(max_workers)
  • max_workers 参数表示最多有多少个worker并行执行任务。

下面的示例代码展示了线程池和进程池的功能。这里的任务是,给一个list number_list ,包含1到10。

  • 通过有5个worker的线程池执行

线程池运行

然后,我们使用了 futures.ThreadPoolExecutor 模块的线程池跑了一次::

if __name__ == "__main__":start_time_1 = time.time()with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:for item in number_list:executor.submit(evaluate_item, item)print("线程池计算的时间:" + str(time.time() - start_time_1), "秒")# executor1 = concurrent.futures.ThreadPoolExecutor(max_workers=5)# for item in number_list:#     executor1.submit(evaluate_item, item)# executor1.shutdown()# print("线程池计算的时间:" + str(time.time() - start_time_1), "秒")

ThreadPoolExecutor 使用线程池中的一个线程执行给定的任务。池中一共有5个线程,每一个线程从池中取得一个任务然后执行它。当任务执行完成,再从池中拿到另一个任务。

当所有的任务执行完成后,打印出执行用的时间:

print("线程池计算的时间:" + str(time.time() - start_time_1), "秒")

最终实现效果


完整代码

# -*- coding: utf-8 -*-
import time
import os
import concurrent.futuresimport requests
import parsel"""图片保存文件夹"""
dir_name = 'images'
if not os.path.exists(dir_name):os.mkdir(dir_name)os.chdir(dir_name)
else:os.chdir(dir_name)def get_img_urls(url):"""下载图片"""response = requests.get(url)html = response.text# print(html)"""解析网页中的内容"""sel = parsel.Selector(html)divs = sel.css('.tagbqppdiv')for div in divs:link = div.css('img.ui::attr(data-original)').extract_first()name = div.css('a::attr(title)').extract_first()yield link, namedef download_img(link: str, name: str):"""下载并保存图片"""try:suffix = link.split('.')[-1]response = requests.get(link)with open(name + '.' + suffix, mode='wb') as f:f.write(response.content)except OSError:print('文件名非法')def main():url = 'https://fabiaoqing.com/biaoqing/lists/page/2.html'links = get_img_urls(url)for link in links:download_img(*link)if __name__ == '__main__':executor1 = concurrent.futures.ThreadPoolExecutor(max_workers=10)url = 'https://fabiaoqing.com/biaoqing/lists/page/{page}.html'links = get_img_urls(url)start_time = time.time()for link in links:executor1.submit(download_img, *link)executor1.shutdown()# main()print(time.time() - start_time)

Python多线程爬取表情包,1秒下载五十张表情包相关推荐

  1. Python多线程爬取表情包,1秒下载五十张表情包!

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:私信博主01  领取此项目完整代码! Python学习资料免费领取 从 ...

  2. python多线程爬取斗图啦数据

    python多线程爬取斗图啦网的表情数据 使用到的技术点 requests请求库 re 正则表达式 pyquery解析库,python实现的jquery threading 线程 queue 队列 ' ...

  3. python多线程爬取妹子图

    python多线程爬取妹子图 python使用版本: 3.7 目的: 自己选择下载目录,逐个将主题图片保存到选定目录下. 效果: 一秒钟左右下载一张图片,下了七八十组图片暂时没什么问题,不放心的话,可 ...

  4. python多线程爬取ts文件并合成mp4视频

    python多线程爬取ts文件并合成mp4视频 声明:仅供技术交流,请勿用于非法用途,如有其它非法用途造成损失,和本博客无关 目录 python多线程爬取ts文件并合成mp4视频 前言 一.分析页面 ...

  5. Python 多线程爬取西刺代理

    西刺代理是一个国内IP代理,由于代理倒闭了,所以我就把原来的代码放出来供大家学习吧. 镜像地址:https://www.blib.cn/url/xcdl.html 首先找到所有的tr标签,与class ...

  6. python3爬虫系列16之多线程爬取汽车之家批量下载图片

    python3爬虫系列16之多线程爬取汽车之家批量下载图片 1.前言 上一篇呢,python3爬虫系列14之爬虫增速多线程,线程池,队列的用法(通俗易懂),主要介绍了线程,多线程,和两个线程池的使用. ...

  7. Python多线程爬取表情包,代码都放在最后了

    文章目录 一.写在前面 二.步骤解析 三.效果展示 一.写在前面 从老马的两大聊天软件,到其它的各种软件,表情包一直都是中国互联网用户的「心头好」,时至今日,表情包已然成为必不可少的聊天方式. 无论是 ...

  8. 斗图斗不过小伙伴?python多线程爬取斗图网表情包,助你成为斗图帝!

    最近python基础课讲到了多线程,老师让交个多线程的实例练习.于是来试试多线程爬虫,正好复习一下mooc上自学的嵩天男神的爬虫知识.想法很美好,过程却很心酸,从早上开始写,每次出现各种奇怪问题,到现 ...

  9. Python多线程爬取斗图啦表情包

    斗图啦表情包多线程爬取-撸代码 首先快速的导入我们需要的模块,和其他文章不同,我把相同的表情都放在了同一个文件夹下面,所以需要导入os模块 import asyncio import aiohttp ...

最新文章

  1. 金融业加速智能化,解析360金融AI基础架构和应用
  2. java测试不成功_为什么我的Java布尔测试总是失败?
  3. webstorm基础使用总结
  4. 阻止地图的放大和缩小_Arcgis画地图详细步骤(真的!!)
  5. netty5.0通过LineBasedFrameDecoder和StringDecoder解决粘包
  6. 【公共类库】加密解密
  7. Install Google Chrome using Apt-Get in Ubuntu
  8. Pem私钥pkcs1和pkcs8之间互转
  9. CAD交互绘制虚线(网页版)
  10. 班主任工作总结中职计算机网络,中职班主任工作总结(精选5篇)
  11. java开发app_使用java制作app教程
  12. 【Pyhton TurtleArt】画一幅极简渐变风景图
  13. 魔兽铃声(适合做短信铃声)铃声 魔兽铃声(适合做短信铃声)手机...
  14. 喜欢的歌——时间煮雨(郁可唯)
  15. 保存数据时报:Incorrect string value: '\xF0\x9F\x91\x8D' for column 'f_char_name' at row 1
  16. 【高手分享:拼音/五笔输入法通用使用技巧】
  17. springboot毕业设计 基于springboot在线视频点播系统毕业设计设计与实现参考
  18. 数据结构 第一章:绪论
  19. c++ SFML ftp删除文件
  20. 面向对象(四)——继承多态

热门文章

  1. 数学建模笔记-第七讲-回归分析
  2. 大白话说float型的精度和范围
  3. 【转】爱普生打印机L358
  4. 【Java】apache CommandLine 使用
  5. 顺丰科技携手飞桨自研“智能外呼机器人”,为客户打造优质服务体验
  6. 通过控制面板调用计算机,电脑打开控制面板的几种方法
  7. 显示器屏幕偏色原因及解决方案
  8. 降噪耳机哪家强?南卡A2降噪耳机上手体验测评
  9. Qt + halcon混合编程 相机标定
  10. NtLmSsp 登录爆破防御办法踩的坑-网络安全:LAN管理器身份验证级别设置还原