开年表情包局部富有指南,盘它!

500

作为一位不怎么用微信聊天的数据猿,Alfred总是被Erica嘲笑表情包少之又少,用来用去都是那几个。每每在需要斗图的时候,表情包总是捉襟见肘,左支右绌,未战先败。

当然,数据猿总是有自己的解决办法的——我没有表情包我还不能爬咋地?

注:单纯想要表情包的同学,请直接拉到最后。

500

今天的小项目就是,爬取微博博主“别是个沙雕吧” 关于#沙雕表情包大赛#的微博评论图片,里面都是沙雕网友发的各种各样的表情包。当然,你也可以用这个爬虫爬取#最美侧颜照大赛#里面的小哥哥小姐妹、#晒丑手大赛#里的各种丑手(有人有这个癖好吗?Alfred没有哈)。

500

(一)目 标

只需要给出某条微博的网页链接(本项目爬取的链接是:https://weibo.com/2610874582/HdRqGwZNv),便能直接爬取该微博下面的所有评论图片。

(二)爬取思路分析

爬虫最重要的部分不是写程序,而是整个爬取思路的分析。只要明白了数据是如何加载的,每一步的流程是怎么样的,程序便是水到渠成的事情。

500

由于微博在手机网页端比较容易爬取,所以本次的爬取选在了手机网页端(https://m.weibo.cn/)。

01电脑端链接转为手机端链接

探索了一下发现,同一条微博,在电脑网页端和手机网页端的链接结构很不一样:

500

我们容易拿到的链接,都是电脑网页端的链接(9位的字母+数字),如何通过这个链接找到手机网页端的微博id(16位的数字),从而构造手机端的爬取链接,是第一个需要解决的问题。

通过检查电脑端的网页源代码,发现手机端的id就藏在“mblog&act=”之后,而且是唯一标识的,所以先请求电脑端链接,再找到“mblog&act=”的位置,自然就可以把手机端微博id拿到。

500

02评论数据抓包

第二步,由于需要爬取的表情包在微博的评论下面,所以需要对链接进行抓包分析,看评论数据是如何加载的。

打开谷歌浏览器无痕模式——右键“检查”——Network,把Preserve log勾上,打开链接:https://m.weibo.cn/detail/4333036507864049, 选择XHR,发现评论数据就在以“hotflow?id=4333”开头的请求里,而且是很工整的JSON格式,包括20条评论,我们需要的表情包图片链接,就在评论数据里。

500

03模拟登录微博手机端

在Alfred往下滑动看数据是如何翻页的时候,页面跳转到了微博手机端登录页,需要登录之后才能获取到更多的评论,所以,下一个需要解决的问题是模拟登录微博。

模拟登录的方法很简单,我们先填写自己的微博账号和密码,登录之后便可以在所有请求中找到登录的链接(https://passport.weibo.cn/sso/login),可以看到请求方式是POST,通过提交表单数据的形式登录,我们的账号和密码就是这样提交给服务器的。

500

500

所以,用requests库的Session,然后post请求把请求头和表单数据带上,就OK了。

04破译翻页机制

登录了之后,顺利返回了第二页评论的数据,鼠标越往下滑,返回的数据越多。观察了前几个评论数据的请求,发现它并不是通过一般的page参数来控制翻页的,那它是怎么翻页的呢?

500

可以看到,从第二页开始,请求链接多了一个参数“max_id”,如果知道这个max_id参数,便可以顺利实现翻页,可是这个参数藏在哪儿呢?

检查了一遍,发现就藏在前一个请求的JSON数据里,也就是说,第二页的max_id,可以在第一页请求回来的JSON数据里找到。所以,只需要把这个找出来,就可以构造下一页的请求了。

500

另外还有一个参数“max_id_type”(Alfred在这里踩过坑),大家猜猜是干嘛的? (Github代码注释里有解答)

500

至此,我们其实把所需要的数据在流程上全部打通了。下一步需要做的,是从评论数据中提取出表情包图片的链接。

(三)表情包链接提取和保存

 这一步很简单,因为评论数据都是保存在JSON里面的,只需要用for循环就可以提取。链接可以保存在MongoDB里(需要配置一下MongoDB),或者直接保存在本地的txt文件。当然你也可以不保存链接,提取出来之后直接下载图片,但是,这不是一个好的工程习惯。

(四)下载图片

首先读入txt文件里面的表情包链接,for循环下载就可以了。由于表情包的格式有png、jpg和gif等,所以保存的时候需要注意一下命名。

至此,#沙雕表情包大赛#微博下面的几百个表情包就自动下载回来了,什么样的表情包都应有尽有。下一次斗图的时候,就问你们怕不怕?

500

其实,这期的爬虫就是微博评论爬虫的小拓展,只要更改一下爬取链接,你就可以用它爬各种各样的评论图片,比如说,Alfred就爬了#萌宠大赛#里面的很多小可爱,以及#男孩子女装大赛#里面的女装大佬,不说了……

500

1.  微信公众号对话框回复“表情包”,可以获取分享在Github的代码链接(内附详细的注释和说明),以及近千张最具人气的表情包下载链接,让你新的一年从表情包局部富有起来;

2.  如果你需要女装大佬的图片,可以悄悄在微信后台留言

3.  欢迎任何形式的合作,合作请微信后台留言咨询;

4.  《数据爬虫一百式》是新开的一个栏目,持续更新数据爬虫项目,欢迎关注和转发哦。

本文首发于微信公众号“Alfred数据室”,转载请联系原作者!

站务

全部专栏