爬虫笔记——多线程爬取斗图网表情包(threading)

  • 网站观察
  • 爬取框架
  • 具体代码

斗图网网址:斗图网,这里以爬取最新套图为例。

网站观察

在网页翻页操作中可以看到网页是非动态加载的(page为页码),那么通过requests方式爬取要更为快捷。


可以看到每个套图都在分别不同的框中,那么首先就要爬取每个套图的具体链接。


通过检查(f12)可以发现每个套图的链接地址


在每个具体链接中又可以得到具体的套图表情包


同样可以得到每个图片的下载链接

爬取框架

综上分析,可将具体的爬取过程分为:获取每个套图的链接 > 获取每个表情的链接 > 下载,而对于要下载的图片,若此处一个一个下载,则会耗时极长,故此处选择多线程方式进行爬取。

具体代码

import requests
import threading
import time
import os
import re
from urllib import request
from lxml import etree
from queue import Queue# 生产者类用于爬取表情包链接
class Producer(threading.Thread):HEADERS = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}def __init__(self,page_queue,img_queue,*args,**kwargs):super(Producer,self).__init__(*args,**kwargs)self.page_queue = page_queueself.img_queue = img_queuedef run(self):while True:if self.page_queue.empty():print("=="*20)breakurl = self.page_queue.get()self.parse_taotu_links(url)# 套图链接爬取def parse_taotu_links(self,link):resp = requests.get(link,headers=self.HEADERS)text = resp.texthtml = etree.HTML(text)bqb_links = html.xpath('//div[@class="col-sm-9 center-wrap"]/a/@href')for link in bqb_links:self.parse_img_links(link)# 表情包链接爬取def parse_img_links(self,link):resp = requests.get(link,headers=self.HEADERS)text = resp.texthtml = etree.HTML(text)img_titles = html.xpath('//li[@class="list-group-item"]//div[@class="pic-content"]//img/@alt')img_links = html.xpath('//li[@class="list-group-item"]//div[@class="pic-content"]//img/@src')for img_title,img_link in list(zip(img_titles,img_links)):# 去除文件名当中的特殊符号img_title = re.sub(r'[.。*??!!@]','',img_title)# 为文件名加上后缀,后缀在表情包链接当中,为链接的后缀suffix = os.path.splitext(img_link)[1]# 去除后缀当中的特殊字符串suffix = re.sub(r'!dta','',suffix)img_title = img_title + suffixself.img_queue.put((img_title,img_link))# 消费者类线程用于下载
class Consumer(threading.Thread):def __init__(self,page_queue,img_queue,*args,**kwargs):super(Consumer,self).__init__(*args,**kwargs)self.page_queue = page_queueself.img_queue = img_queue# 下载表情包def run(self):# 计算一下程序运行时间start = time.clock()# 这里先暂停一秒,让生产者部分先爬取链接,不然会出现一开始就结束循环的情况time.sleep(1)while True:if self.page_queue.empty() and self.img_queue.empty():end = time.clock()t = end - startprint("所有表情包下载完成!")print("下载共花费时间%.1f分钟"%(t/60))breakimg_title,img_link = self.img_queue.get()request.urlretrieve(img_link,'C:/Users/123/Desktop/bqb/taotu/'+img_title)print(img_title+"       下载完成!")def main():# 网页队列(这里为了方便只爬取30页内容,可以自己设定)page_queue = Queue(100)# 表情包队列img_queue = Queue(100)for page in range(1,11):url = 'https://www.doutula.com/article/list/?page=%d'%page# 将网址放到page_queue队列中page_queue.put(url)# 定义5个爬取表情包链接的线程for producers in range(5):t = Producer(page_queue,img_queue)t.start()# 定义5个下载表情包的线程for consumers in range(5):t = Consumer(page_queue,img_queue)t.start()main()

爬虫笔记——多线程爬取斗图网表情包(threading)相关推荐

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

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

  2. python3爬虫——多线程爬取斗图网表情包

    本文用多线程生产者,消费者模式爬取斗图网的表情包,并下载保存到本地,get_page()函数负责获取页面的图片的url链接,downlod_img()函数通过图片url下载保存到本地文件夹中,开启多线 ...

  3. 多线程爬取斗图网表情包

    import requests import re import queue import threading import timeHeaders = {'User-Agent': 'Mozilla ...

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

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

  5. 爬取斗图网表情包之后斗图会输?不存在的

    前言: 本文非常浅显易懂,可以说是零基础也可快速掌握.如有疑问,欢迎留言,笔者会第一时间回复. 一.分析表情包网址 1.进入斗图啦网址,点击**"最新表情"**,再点击第二.第三页 ...

  6. 熊猫人表情包python 代码_用Python爬取斗图网表情包

    一.介绍 用python处理二进制文件的事情做的比较少,虽然之前有写过分析Ajax抓取今日头条街拍美图,但那个爬虫重在分析Ajax,并没有提到文件路径和文件命名,所以就有了这个爬虫 二.流程 流程一般 ...

  7. Python项目实战:爬取斗图网表情包图片

    2019独角兽企业重金招聘Python工程师标准>>> 前言 相信大家在和别人聊天的时候都很喜欢斗图吧,斗着斗着斗忘记睡觉了,哈哈,感情得到了升华,下面来介绍一个利用Python在斗 ...

  8. python多线程爬取多个网址_【Python爬虫】多线程爬取斗图网站(皮皮虾,我们上车)...

    原标题:[Python爬虫]多线程爬取斗图网站(皮皮虾,我们上车) 斗图我不怕 没有斗图库的程序猿是无助,每次在群里斗图都以惨败而告终,为了能让自己在斗图界立于不败之地,特意去网上爬取了斗图包.在这里 ...

  9. 手把手教学php表情包,手把手教你爬取斗图啦表情包

    爬取表情包 闲来无事,突然想到表情包好久没有更新了,正好这几天学了爬虫,利用爬虫来更新一波表情包,哈哈哈. 有一个网站,叫做"斗图啦",网址是:https://www.doutul ...

最新文章

  1. BZOJ1315 : Ural1557Network Attack
  2. 单张GPU搞定GPT-3超参数!先训练小模型,再“一键迁移” | 已开源
  3. CocoaPods使用 主要带图。转载。
  4. [转]ASP.NET页面生命周期描述
  5. Hadoop学习笔记-关于Hadoop你不得不知道的12个事实
  6. web前端学习day_05:Bootstrap
  7. Column 'Column Name' does not belong to table Table
  8. 环球网校签约神策数据,数据赋能教育行业创新升级
  9. SPH(光滑粒子流体动力学)流体模拟实现二:SPH算法(3)-光滑核函数
  10. cdev_alloc和cdev_init
  11. html评论和回复评论_佟丽娅“挑衅”贾玲,评论区晒刘德华合照,贾玲高情商回复佩服...
  12. java算法面试题_Java算法面试题汇总
  13. 层次分析法和bp神经网络,基于bp的神经网络算法
  14. 做到这五点,才算是好用户体验 -- 转自周鸿祎在UPA用户体验大会上的演讲
  15. mkdir 创建目录命令
  16. 贯穿了易学思想的《大学》与《中庸》
  17. 实战|使用python推送微信公众号消息(哄女友专用)
  18. 学了 C 语言到底能做什么, 能从事什么工作?
  19. 基于Python的五子棋人机对战
  20. 欧盟ECHA正式公布REACH法规中的SVHC清单为211项。

热门文章

  1. 在Ubuntu 20.04上安装VSCode
  2. 佳能5d3右下角红灯一直闪_佳能相机的红灯为什么一直闪 佳能相机为什么拍不了只显示...
  3. mysql tinyint 1 范围_mysql tinyint 取值范围浅析
  4. linux服务器shell脚本,分享个简易版Linux服务器初始化Shell脚本
  5. 2006年德国世界杯日程表(北京时间)
  6. 艾永亮:一瓶酱油市值超过中石化!海天味业到底有多牛?
  7. LoadRunner如何确定并发用户数
  8. 《嵌入式 - Lwip开发指南》第1章 LWIP概述
  9. 死锁(哲学家进餐问题)基本介绍和解决办法
  10. 多服务保证订单号唯一