python爬取 20w 表情包之后,从此你就成为了微信斗图届的高手
常常有 b 友问我
“小帅b,你哪来那么多的表情包”
当然是爬取来的啊
不瞒你说
在我的电脑里面
除了一些老师的教程之外
还有满满当当的表情包
每一个表情包都是那么的
生动有趣
是它们拯救了我们人类的尴尬
是它们拯救了多少的直男
是它们...
好吧
编不下去了
答应你们
这次腾出点时间
就来说说
小帅b是怎么玩表情包的
如何实现的呢?
那么接下来就是
学习 python 的正确姿势
是这样的
有一次小帅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).content
f.write(img)
至此
几行代码就搞定了
先来测试一下
下载一个页面的图片
可以发现
每张图片都获取到了
效果还行
不过
要下载那么多张表情包的话
这样写的代码有点慢了
还是开启多线程吧
对于这种 IO 操作
还是能加快不少下载时间的
queue = Queue()
path = '/home/wistbean/biaoqingbao/'
# 创建线程
for x in range(10):
worker = DownloadBiaoqingbao(queue, path)
worker.daemon = True
worker.start()
# 加入队列
for url in urls:
queue.put(url)
queue.join()
在这里创建了 DownloadBiaoqingbao 这个线程类
然后创建 10 个线程
把 url 添加到队列中
来运行一下
这时候文件夹就写入表情包啦
经过一段时间
小帅b的文件夹就存满了各种表情包了哈哈哈
谁敢跟我斗图
我就砸死他
不过呢
有个问题
文件夹里面的图片太多了
需要检索一下才行
比如我们要找到关于
小老弟
的表情包
那么我们可以使用
glob
import glob
for 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)
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 ,妈妈再也不用担心我的正则表达式了
点个在看啊~~(破音)