爬虫笔记——多线程爬取斗图网表情包(threading)
爬虫笔记——多线程爬取斗图网表情包(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)相关推荐
- 斗图斗不过小伙伴?python多线程爬取斗图网表情包,助你成为斗图帝!
最近python基础课讲到了多线程,老师让交个多线程的实例练习.于是来试试多线程爬虫,正好复习一下mooc上自学的嵩天男神的爬虫知识.想法很美好,过程却很心酸,从早上开始写,每次出现各种奇怪问题,到现 ...
- python3爬虫——多线程爬取斗图网表情包
本文用多线程生产者,消费者模式爬取斗图网的表情包,并下载保存到本地,get_page()函数负责获取页面的图片的url链接,downlod_img()函数通过图片url下载保存到本地文件夹中,开启多线 ...
- 多线程爬取斗图网表情包
import requests import re import queue import threading import timeHeaders = {'User-Agent': 'Mozilla ...
- Python多线程爬取斗图啦表情包
斗图啦表情包多线程爬取-撸代码 首先快速的导入我们需要的模块,和其他文章不同,我把相同的表情都放在了同一个文件夹下面,所以需要导入os模块 import asyncio import aiohttp ...
- 爬取斗图网表情包之后斗图会输?不存在的
前言: 本文非常浅显易懂,可以说是零基础也可快速掌握.如有疑问,欢迎留言,笔者会第一时间回复. 一.分析表情包网址 1.进入斗图啦网址,点击**"最新表情"**,再点击第二.第三页 ...
- 熊猫人表情包python 代码_用Python爬取斗图网表情包
一.介绍 用python处理二进制文件的事情做的比较少,虽然之前有写过分析Ajax抓取今日头条街拍美图,但那个爬虫重在分析Ajax,并没有提到文件路径和文件命名,所以就有了这个爬虫 二.流程 流程一般 ...
- Python项目实战:爬取斗图网表情包图片
2019独角兽企业重金招聘Python工程师标准>>> 前言 相信大家在和别人聊天的时候都很喜欢斗图吧,斗着斗着斗忘记睡觉了,哈哈,感情得到了升华,下面来介绍一个利用Python在斗 ...
- python多线程爬取多个网址_【Python爬虫】多线程爬取斗图网站(皮皮虾,我们上车)...
原标题:[Python爬虫]多线程爬取斗图网站(皮皮虾,我们上车) 斗图我不怕 没有斗图库的程序猿是无助,每次在群里斗图都以惨败而告终,为了能让自己在斗图界立于不败之地,特意去网上爬取了斗图包.在这里 ...
- 手把手教学php表情包,手把手教你爬取斗图啦表情包
爬取表情包 闲来无事,突然想到表情包好久没有更新了,正好这几天学了爬虫,利用爬虫来更新一波表情包,哈哈哈. 有一个网站,叫做"斗图啦",网址是:https://www.doutul ...
最新文章
- BZOJ1315 : Ural1557Network Attack
- 单张GPU搞定GPT-3超参数!先训练小模型,再“一键迁移” | 已开源
- CocoaPods使用 主要带图。转载。
- [转]ASP.NET页面生命周期描述
- Hadoop学习笔记-关于Hadoop你不得不知道的12个事实
- web前端学习day_05:Bootstrap
- Column 'Column Name' does not belong to table Table
- 环球网校签约神策数据,数据赋能教育行业创新升级
- SPH(光滑粒子流体动力学)流体模拟实现二:SPH算法(3)-光滑核函数
- cdev_alloc和cdev_init
- html评论和回复评论_佟丽娅“挑衅”贾玲,评论区晒刘德华合照,贾玲高情商回复佩服...
- java算法面试题_Java算法面试题汇总
- 层次分析法和bp神经网络,基于bp的神经网络算法
- 做到这五点,才算是好用户体验 -- 转自周鸿祎在UPA用户体验大会上的演讲
- mkdir 创建目录命令
- 贯穿了易学思想的《大学》与《中庸》
- 实战|使用python推送微信公众号消息(哄女友专用)
- 学了 C 语言到底能做什么, 能从事什么工作?
- 基于Python的五子棋人机对战
- 欧盟ECHA正式公布REACH法规中的SVHC清单为211项。
热门文章
- 在Ubuntu 20.04上安装VSCode
- 佳能5d3右下角红灯一直闪_佳能相机的红灯为什么一直闪 佳能相机为什么拍不了只显示...
- mysql tinyint 1 范围_mysql tinyint 取值范围浅析
- linux服务器shell脚本,分享个简易版Linux服务器初始化Shell脚本
- 2006年德国世界杯日程表(北京时间)
- 艾永亮:一瓶酱油市值超过中石化!海天味业到底有多牛?
- LoadRunner如何确定并发用户数
- 《嵌入式 - Lwip开发指南》第1章 LWIP概述
- 死锁(哲学家进餐问题)基本介绍和解决办法
- 多服务保证订单号唯一