前言

昨天跟小伙伴斗图,关于斗图这件事,我表示我从来没有输过。至于为什么不会输,这些都是男人的秘密,今天我想把这个小技

巧告诉大家。学会了记得挑战你最好的朋友,打赌让他输了请你吃大西瓜…

1、介绍

•平台:斗图啦

•语言:python

•技术:python多线程、python安全队列、python之Xpath、正则、request

以上我们使用的技术,都是之前整理过的对不对,那么我们就根据之前的学习内容来进行爬取斗图表情包吧。

2、python爬取流程梳理

我们刚开始学习的时候,是不是每次都需要梳理下爬取的流程呢,那么这次咱们还是和之前一样,首先我们需要找到我们爬取的平台的网址是什么:
https://dou.yuanmazg.com/doutu?page=1

访问这个界面之后,我们可以看到如下显示的内容:

然后我们往下滑之后,可以看到这里一共有1500+的页面,那么我们现在爬取前50页的内容吧,大概流程我觉得应该如下哈:

1.获取每个页面的url;2.将获取到的url放置Queue中;3.从Queue中获取一个Url,使用requests获取内容,使用xpath获取取该Url中每一个图片的Url;4.然后将每个图片中的Url放入到另一个Queue中;5.然后再从第二个Queue中获取图片的url;6.根据Queue来下载并保存即可;7.以上步骤我们使用多线程+Queue的形式来进行。

3、python爬取图片

3.1 框架

老样子,首先我们简简单单写一个框架;

import threadingclass Producter(threading.Thread):passclass Consumer(threading.Thread):passdef main():passif __name__ == '__main__':main()

然后我们一步一步进行;

3.2 初步获取页面有效信息

python学习交流Q群:906715085###
import requests
from lxml import etreeUrl = 'https://dou.yuanmazg.com/doutu?page=1'
Header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
Page_get = requests.get(url=Url, headers=Header)
Page_content = Page_get.text
Page_message = etree.HTML(Page_content)
Page_div = Page_message.xpath('//div[@class="page-content"]')[0]
Page_div = etree.tostring(Page_div, pretty_print=True, method='html').decode('utf-8')
print(Page_div)3.3  提取每一个图片的url和name
import requests
from lxml import etreeUrl = 'https://dou.yuanmazg.com/doutu?page=1'
Header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
Page_get = requests.get(url=Url, headers=Header)
Page_content = Page_get.text
Page_message = etree.HTML(Page_content)
Page_div = Page_message.xpath('//div[@class="page-content"]//a//img')
# Page_div = etree.tostring(Page_div, pretty_print=True, method='html').decode('utf-8')
# print(Page_div)
for i in Page_div:# print(etree.tostring(i, pretty_print=True, method='html').decode('utf-8'))Page_url = 'https://dou.yuanmazg.com' + i.xpath("@data-original")[0]Page_name = i.xpath("@alt")[0]print(Page_url)print(Page_name)

输出结果如下:

3.4 优化名字

我们可以看到我们获取的图片的名字中有特殊符号,但是我们的电脑上文件名字是不可以出现特殊符号的,那么我们是不是就需

要把名字给他处理一下呢,优化走起,优化之后的代码如下:

import requests
from lxml import etree
import reUrl = 'https://dou.yuanmazg.com/doutu?page=1'
Header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
Page_get = requests.get(url=Url, headers=Header)
Page_content = Page_get.text
Page_message = etree.HTML(Page_content)
Page_div = Page_message.xpath('//div[@class="page-content"]//a//img')
# Page_div = etree.tostring(Page_div, pretty_print=True, method='html').decode('utf-8')
# print(Page_div)
for i in Page_div:# print(etree.tostring(i, pretty_print=True, method='html').decode('utf-8'))Page_url = 'https://dou.yuanmazg.com' + i.xpath("@data-original")[0]Page_name = i.xpath("@alt")[0]Page_name = re.sub(r'[,。??,/\\·\*\ ]', '', Page_name)print(Page_url)print(Page_name)

随之我们又发现了另一个问题,那就是有些图片他是没有添加描述的,也就是无法获取该图片的名字,那么我们就随机给他一个

名字吧;

import requests
from lxml import etree
import re
import randomUrl = 'https://dou.yuanmazg.com/doutu?page=1'
Header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
Page_get = requests.get(url=Url, headers=Header)
Page_content = Page_get.text
Page_message = etree.HTML(Page_content)
Page_div = Page_message.xpath('//div[@class="page-content"]//a//img')
# Page_div = etree.tostring(Page_div, pretty_print=True, method='html').decode('utf-8')
# print(Page_div)
for i in Page_div:# print(etree.tostring(i, pretty_print=True, method='html').decode('utf-8'))Page_url = 'https://dou.yuanmazg.com' + i.xpath("@data-original")[0]Page_name = i.xpath("@alt")[0]Page_name = re.sub(r'[,。??,/\\·\*\ ]', '', Page_name)if Page_name == "":Page_name = str(random.random())print(Page_url)print(Page_name)

到这里是不是名字这个事儿就完事儿了呢,当然不了,想一下,我们在电脑上创建文件的时候是不是还需要后缀名呢,那我们就

应该也把后缀名获取一下子,再次优化之后,代码如下:

import requests
from lxml import etree
import re
import random
import osUrl = 'https://dou.yuanmazg.com/doutu?page=1'
Header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
Page_get = requests.get(url=Url, headers=Header)
Page_content = Page_get.text
Page_message = etree.HTML(Page_content)
Page_div = Page_message.xpath('//div[@class="page-content"]//a//img')
# Page_div = etree.tostring(Page_div, pretty_print=True, method='html').decode('utf-8')
# print(Page_div)
for i in Page_div:# print(etree.tostring(i, pretty_print=True, method='html').decode('utf-8'))Page_url = 'https://dou.yuanmazg.com' + i.xpath("@data-original")[0]Suffix = os.path.splitext(Page_url)[1]Page_name = i.xpath("@alt")[0]Page_name = re.sub(r'[,。??,/\\·\*\ ]', '', Page_name)if Page_name == "":Page_name = str(random.random()) + Suffixelse:Page_name = Page_name + Suffixprint(Page_url)print(Page_name)

运行之后结果如下:

好的,这样子的话我们就成功的使用python获取了每一个页面中每一个图片的地址和名字

3.5 下载

当我们获取到了图片的下载地址,以及图片名字之后,我们就可以进行下载了,那么我们的代码就变成了下面的内容:

python学习交流Q群:906715085####
import requests
from lxml import etree
import re
import random
import os
from urllib import requestUrl = 'https://dou.yuanmazg.com/doutu?page=1'
Header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
Page_get = requests.get(url=Url, headers=Header)
Page_content = Page_get.text
Page_message = etree.HTML(Page_content)
Page_div = Page_message.xpath('//div[@class="page-content"]//a//img')
# Page_div = etree.tostring(Page_div, pretty_print=True, method='html').decode('utf-8')
# print(Page_div)
for i in Page_div:# print(etree.tostring(i, pretty_print=True, method='html').decode('utf-8'))Page_url = 'https://dou.yuanmazg.com' + i.xpath("@data-original")[0]Suffix = os.path.splitext(Page_url)[1]Page_name = i.xpath("@alt")[0]Page_name = re.sub(r'[,。??,/\\·\*\ ]', '', Page_name)if Page_name == "":Page_name = str(random.random()) + Suffixelse:Page_name = Page_name + Suffix# print(Page_url)# print(Page_name)request.urlretrieve(Page_url, 'doutula/' + Page_name)print("{}下载完成了~~~".format(Page_name))

运行之后会输出哪个下载完成了,如下:
我不想做个肤浅的人.jpg下载完成了~~~
我黑点没事你别绿了.jpg下载完成了~~~
我不想白活一辈子.jpg下载完成了~~~
我妈肚子里有墨水.jpg下载完成了~~~
劳资之前白的后来帅炸了炸黑了.jpg下载完成了~~~
我为了暗中保护你.jpg下载完成了~~~
我晒你家太阳了.jpg下载完成了~~~
黑夜给了我一双黑色的眼睛可我却一不小心按了全选!.jpg下载完成了~~~
— 省略部分内容—

而且会在doutula这个文件夹下将下载的文件进行保存,如下图:

3.6 添加安全队列和多线程

为什么要使用多线程和安全队列都清楚吧,就是为了速度和数据的准确性啊。

既然我们实现了一个页面中的表情包下载,那么我们是不是只需要稍微改动一下,多启动几个线程,添加几个循环,就能搞定了

呢,经过我们的代码优化之后,成了下面的样子:

python学习交流Q群:906715085####
import requests
from lxml import etree
import re
import random
import os
from urllib import request
from queue import Queue
import threading
import timeclass Producer(threading.Thread):Header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}def __init__(self, Page_queue, Photo_queue, *args, **kwargs):super(Producer, self).__init__(*args, **kwargs)self.Page_queue = Page_queueself.Photo_queue = Photo_queuedef run(self):while True:if self.Page_queue.empty():breakurl = self.Page_queue.get()self.photo_down(url)def photo_down(self, url):Page_get = requests.get(url=url, headers=self.Header)Page_content = Page_get.textPage_message = etree.HTML(Page_content)Page_div = Page_message.xpath('//div[@class="page-content"]//a//img')for i in Page_div:Page_url = 'https://dou.yuanmazg.com' + i.xpath("@data-original")[0]Suffix = os.path.splitext(Page_url)[1]Page_name = i.xpath("@alt")[0]Page_name = re.sub(r'[,。??,/\\·\*\ ]', '', Page_name)if Page_name == "":Page_name = str(random.random()) + Suffixelse:Page_name = Page_name + Suffixself.Photo_queue.put((Page_url, 'doutula/' + Page_name))class Consumer(threading.Thread):def __init__(self, Page_queue, Photo_queue, *args, **kwargs):super(Consumer, self).__init__(*args, **kwargs)self.Page_queue = Page_queueself.Photo_queue = Photo_queuedef run(self):while True:if self.Page_queue.empty() is True and self.Photo_queue.empty() is True:breakelse:img_url, img_name = self.Photo_queue.get()print(img_url)print(img_name)request.urlretrieve(img_url, img_name)def main():Page_queue = Queue(maxsize=100)Photo_queue = Queue(maxsize=2000)for i in range(1, 51):  # 下载的页数Page_url = 'https://dou.yuanmazg.com/doutu?page={}'.format(i)Page_queue.put(Page_url)for i in range(5):  # 启动5个消费者t1 = Producer(Page_queue, Photo_queue)t1.start()time.sleep(5)  # 停留5秒是为了避免消费者的第一个页面都没请求下来的时候,生产者就直接判断无数据,从而自行终止程序。for i in range(4):  # 启动5个生产者t2 = Consumer(Page_queue, Photo_queue)t2.start()if __name__ == '__main__':main()

经过实验之后,下载速度快多了,结果如下:

这样子我们就可以实现多线程下载斗图表情包,下一次和朋友斗图,再也不怕没有表情包了。

斗图高手教你用Python批量爬取表情包相关推荐

  1. python爬表情包_教你用Python来爬取表情包网站的所有表情图片

    教你用Python来爬取表情包网站的所有表情图片 配置环境 安装Python 开发环境 3X系列 win + R 打开运行,输入cmd,输入python,进行验证是否安装Python win + R ...

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

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

  3. Python爬虫爬取表情包+Autojs微信自动导入表情包脚本(附源码)

    废话不多说直接开始 Python爬取表情包 一.检查网页源码 发现可以找到图片地址,直接请求图片地址下载图片 二.打开开发者工具(F12) 通过xpath提取p标签下的img标签src属性为图片地址 ...

  4. Python爬虫爬取表情包

    听说你在网上斗图斗输了?听说你连斗图用的弔图也不知道去哪找? 没事啦,你看到这篇文章就证明你找到救星啦!在本篇文章里我会带着大家一起来爬取一下表情包网,从此让你的图库再也不缺弔图,妈妈再也不担心我斗图 ...

  5. python入门爬取表情包

    九年义务教育加三年高考,从来没有过过这么紧张充实的暑假,生怕自己来学校了啥都没学到心慌慌,马上大二了,我慌啊,害怕小学弟学妹们进来了我却当不起这个学姐,到时候别人问我啥我 啥都不会啊:虽然我现在也感觉 ...

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

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

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

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 pyt ...

  8. 【爬虫】Yhen手把手教你爬取表情包,让你成为斗图界最靓的仔!

    以下内容为本人原创,欢迎大家观看学习,禁止用于商业用途,转载请说明出处,谢谢合作! ·作者:@Yhen ·原文网站:CSDN ·原文链接:https://blog.csdn.net/Yhen1/art ...

  9. 我是斗图王之python爬取表情包

    最近在群里看到好多人在斗图,各式各样的,可是自己收藏里面却没有几个,于是就想着去网上找点资源.为了当上斗图王,就百度了些python教程,看着视频敲了些代码. 代码就不讲解了,因为毕竟是看着视频搞得, ...

最新文章

  1. 多级中间表示概述MLIR
  2. mysql 插入指定值_mysql实现随机把字段值插入指定表
  3. XSS 前端防火墙 —— 天衣无缝的防护
  4. 阿里巴巴2021秋招笔试题20211119
  5. 软件测试用例_软件测试用例设计实战场景法
  6. C++类的构造函数、析构函数与赋值函数
  7. 上海python工资一般多少-python数据分析师待遇有多少?工资待遇如何?
  8. 使用多进程、多线程、gevent完成http服务器
  9. 2021-05-14 kk日记,TBASE数据表更换shard key
  10. Mysql中select into from用法
  11. 【论文阅读】GPT系列论文详解
  12. 情感驿站004:我有一壶酒,可以慰风尘
  13. Tsinsen D486 蓝雨
  14. 计算机的文件打开记录怎么删,怎样删除最近使用的文档记录,电脑文档文件怎么删除...
  15. 智能未来:聚焦2018世界人工智能大会
  16. 配置mpls vpn基本组网-intranet
  17. bzoj1758 [Wc2010]重建计划
  18. js省市县三级联动效果实例
  19. C/C++截获腾讯QQ网络聊天系统内容和登录密码,教你做一个黑客!
  20. 基于XC7K325T的FMC接口万兆光纤网络验证卡

热门文章

  1. Altium designer6.9学习笔记一
  2. WIN32下实现输入法所需要的一些必要消息、函数和说明
  3. 苹果批Meta高额抽成行为:暴露了其虚伪面孔
  4. Unity光照效果_自发光动态改变并影响环境
  5. 痞子衡嵌入式:IAR内部C-SPY调试组件配套宏文件(.mac)用法介绍
  6. DC系列:1 (DC-1靶机,初级渗透详细教程)
  7. ubuntu系统dhcp服务器,ubuntu如何启用dhcp服务器配置
  8. 计算机网络专业的自我鉴定,计算机网络专业的自我鉴定
  9. 用户体验的模型:Whitney Quesenbery的5E原则
  10. lag与lead函数