常常有 b 友问我

“小帅b,你哪来那么多的表情包”



python爬取 20w 表情包之后,从此你就成为了微信斗图届的高手_java



当然是爬取来的啊

不瞒你说

在我的电脑里面

除了一些老师的教程之外

还有满满当当的表情包



python爬取 20w 表情包之后,从此你就成为了微信斗图届的高手_java_02



每一个表情包都是那么的

生动有趣

是它们拯救了我们人类的尴尬

是它们拯救了多少的直男

是它们...


好吧

编不下去了






答应你们

这次腾出点时间

就来说说

小帅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 globfor name in glob.glob('/home/wistbean/biaoqingbao/*小老弟*.*'):    print(name)


通过 * 这个符号进行模糊匹配

运行一下可以得到所有含有“小老弟”的表情包


python爬取 20w 表情包之后,从此你就成为了微信斗图届的高手_java_03



到这里

已经有了大量的表情包

也可以通过关键词检索到表情包了


那么如何进一步用到微信来呢

嘿嘿,我得意的笑


python爬取 20w 表情包之后,从此你就成为了微信斗图届的高手_java_04


开下脑洞

我们使用微信的接口和 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


搞定

运行之后是这样的





python爬取 20w 表情包之后,从此你就成为了微信斗图届的高手_java_05




ok

以上


当然还可以优化一下

比如每次加载更多同类型的表情包

将表情包发送给特定的人等等

自己去玩吧



python爬取 20w 表情包之后,从此你就成为了微信斗图届的高手_java_06



本篇文章涉及到的源代码已上传

在公众号后台发送“表情包”即可获取


那么

我们下回见

peace



python爬取 20w 表情包之后,从此你就成为了微信斗图届的高手_java_07