常常有 b 友问我
“小帅b,你哪来那么多的表情包”

当然是爬取来的啊
不瞒你说
在我的电脑里面
除了一些老师的教程之外
还有满满当当的表情包

每一个表情包都是那么的
生动有趣
是它们拯救了我们人类的尴尬
是它们拯救了多少的直男
是它们...
好吧
编不下去了

答应你们
这次腾出点时间
就来说说
小帅b是怎么玩表情包的
如何实现的呢?
那么接下来就是

是这样的
有一次小帅b想要斗图
配图
就在网上搜索表情包
然后发现了一个表情巨多的网站
不小心动起了邪念
产生了兴趣

那就
把它们存下来吧
用 requests 请求了一下
发现这个网站没有做反爬

小帅b发现这里有 4k+ 的页面

简单的切换一下页面
可以发现
第一页的链接是这样的
https://fabiaoqing.com/biaoqing/lists/page/1.html
所以以此类推
构建一下所有url
_url = 'https://fabiaoqing.com/biaoqing/lists/page/{page}.html'urls = [_url.format(page=page) for page in range(1, 4328+1)
这样我们就可以得到所有表情包的链接了
我们来看一下页面里面的信息

在这里
我们只需要图片的地址和图片的名称即可
所以我们只要获取到每个页面的
所有 img 标签就可以了
可以使用 BeautifulSoup 根据类名获取
response = requests.get(url)soup = BeautifulSoup(response.content, 'lxml')img_list = soup.find_all('img', class_='ui image lazy')
拿到了页面里面的所有 img
那么就可以获取每个图片的地址和名称
从而下载到我们想要的位置
for img in img_list:image = img.get('data-original')title = img.get('title')# print(image)with open(path + title + os.path.splitext(image)[-1], 'wb') as f:img = requests.get(image).contentf.write(img)
至此
几行代码就搞定了
先来测试一下
下载一个页面的图片

可以发现
每张图片都获取到了
效果还行
不过
要下载那么多张表情包的话
这样写的代码有点慢了

还是开启多线程吧
对于这种 IO 操作
还是能加快不少下载时间的
queue = Queue()path = '/home/wistbean/biaoqingbao/'for x in range(10):worker = DownloadBiaoqingbao(queue, path)worker.daemon = Trueworker.start()for url in urls:queue.put(url)queue.join()
在这里创建了 DownloadBiaoqingbao 这个线程类
然后创建 10 个线程
把 url 添加到队列中
来运行一下

这时候文件夹就写入表情包啦

经过一段时间
小帅b的文件夹就存满了各种表情包了哈哈哈
谁敢跟我斗图
我就砸死他

不过呢
有个问题
文件夹里面的图片太多了
需要检索一下才行
比如我们要找到关于
小老弟
的表情包
那么我们可以使用
glob
import globfor name in glob.glob('/home/wistbean/biaoqingbao/*小老弟*.*'):print(name)
通过 * 这个符号进行模糊匹配
运行一下可以得到所有含有“小老弟”的表情包

到这里
已经有了大量的表情包
也可以通过关键词检索到表情包了
那么如何进一步用到微信来呢
嘿嘿,我得意的笑

开下脑洞
我们使用微信的接口和 python 对接一下
比如
我发送给我的微信说
我要关于沙雕的表情包,发 6 张来
这个时候
python接收到指令
然后就去检索表情包
发送回我的微信

哇
岂不美哉~

说干就干
可以使用 itchat 这个模块
使用网页版微信的方式登录
itchat.auto_login(hotReload=True)itchat.run()
运行这段代码可以得到二维码
扫一下就可以登录进去操作微信了
接着就可以根据小帅b发送过来的关键词
进行文件搜索
imgs = []def searchImage(text):print('收到关键词: ', text)for name in glob.glob('/home/wistbean/biaoqingbao/*'+text+'*.jpg'):imgs.append(name)
然后就可以在回复微信的时候发送图片给自己了
在这里就给自己发前 6 张图片吧
@itchat.msg_register([PICTURE, TEXT])def text_reply(msg):searchImage(msg.text)for img in imgs[:6]:msg.user.send_image(img)time.sleep(0.3)print('开始发送表情:', img)imgs.clear()
但这里有个问题
就是 itchat 在发送图片的时候
中文名的文件发了没有反应
后来小帅b发现是 requests 库的问题
修改它的 fields.py
value = email.utils.encode_rfc2231(value, 'utf-8')value = '%s="%s"' % (name, value.encode('utf-8'))
也就是将
value = '%s*=%s' % (name, value)
改成
value = '%s="%s"' % (name, value.encode('utf-8'))
ok
搞定
运行之后是这样的

ok
以上
当然还可以优化一下
比如每次加载更多同类型的表情包
将表情包发送给特定的人等等
自己去玩吧

本篇文章涉及到的源代码已上传
在公众号后台发送“表情包”即可获取
那么
我们下回见
peace
扫一扫
学习 Python 没烦恼
也许你想知道:
长江后浪推前浪,Requests 库把 urllib 库拍在沙滩上
有了 BeautifulSoup ,妈妈再也不用担心我的正则表达式了
点个在看啊~~(破音)

