Skip to content

微博评论抓取分析过程

wpm edited this page May 15, 2017 · 2 revisions

我以微博评论抓取来说明如何做微博数据抓取分析工作。

首先,在登录状态下,找一条评论比较多的微博。为啥要找评论比较多的微博呢?因为这样我们才能反复抓包,确定获取评论url的具体规律。比如这里我以

http://weibo.com/5231788809/EyoDqeEJ0?from=page_1003065231788809_profile&wvr=6&mod=weibotime&type=comment#_rnd1494662953258

这条微博作为例子来说明

首先,我们打开抓包工具(比如charles,fiddler等),然后打开上述微博,然后再清空所有请求,这里清空所有请求是为了专注找评论的请求,请求太多了可能会对我们分析造成一些干扰。我们可以看到评论翻页是以查看更多下拉进行翻页的

然后我们自己动手下拉或者点击查看更多,可以看到抓包工具中有如下的请求

上图显示的就是动态加载评论所用到的url,我们来看看它的构造规律,以

http://weibo.com/aj/v6/comment/big?ajwvr=6&id=4081978523493142&root_comment_max_id=13904565879158327&root_comment_max_id_type=0&root_comment_ext_param=&page=3&filter=hot&sum_comment_number=79&filter_tips_before=1&from=singleWeiBo&__rnd=1494663091448

为例,我们按照参数递减的方式来进行确定,参数递减的意思是我们每次尝试都减少一个参数,看微博系统的响应内容会不会遵照我们的预期。这里我先把&__rnd=1494663091448这个参数删除,发现返回不对!如下图

返回的评论count为0,肯定和预期不符。难道这个参数是不可以删的?一看它就是时间戳,可能标识该请求是否过期或者超时吧。再看看别的参数名,from=singleWeiBo引起了我的注意,它会标识请求是从哪里来的,把这个参数删除会怎么样,于是请求就成了下面的样子了

http://weibo.com/aj/v6/comment/big?ajwvr=6&id=4081978523493142&root_comment_max_id=13904565879158327&root_comment_max_id_type=0&root_comment_ext_param=&page=3&filter=hot&sum_comment_number=79&filter_tips_before=1

然后我把该请求放浏览器中,发现返回了密密麻麻的信息

这肯定就是我们需要的数据了嘛。但是看了一下page字段的totalpage是25页,count只有500,这个count是评论总数?还是当前页展示的评论数,还是一次请求能返回的评论数?不得而知。所以需要先用程序把返回的字符串的html字段提取出来,保存到本地,保存成html文件看看它到底是什么(请注意,这是一个很常用的方法,既可以减少对微博系统的请求,也利于反复做测试)

然后通过程序把html字段的所有字符串都提取出来并保存了,使用chrome打开发现其实就是评论内容。那么count很有可能是系统限制只能查看500条数据。于是我手动点击、、、在25页后还是能请求到数据,但是用刚才精简过后的url就不行了,然后我又通过抓包,把手动点击获取的25页后的评论的url拿出来,通过浏览器访问,发现也返回空,我看了一下,它和25页之前通过手动点击查看评论是一样的请求参数啊,难道那个时间戳是关键?难道它会判断请求过期时间?

于是,我试了带上当前请求时间,其实又回到了最初的请求url的格式,发现果然又可以请求了。

怎么确定第一页的请求呢?因为后面的请求url都是根据前面返回的内容解析获取的。我们再多抓几次包,可以得到第一次请求的url类似于

http://weibo.com/aj/v6/comment/big?ajwvr=6&id=4106326436806494&from=singleWeiBo&__rnd=1494681035184

有心的人可能会看看第一次返回的东西,我发现第一次返回的不是查看更多,而是正在加载,请稍后,所以关于评论一共有两种ajax请求。编码的时候要注意完整性。

至此,所有的分析就完成了。


补充,上面这种方式有的时候(在评论翻了27页后),可能会返回空数据,但实际上是还有评论数据的,后来我发现

base_url = 'http://weibo.com/aj/v6/comment/big?ajwvr=6&id={}&page={}&__rnd={}'

这个是可以请求完数据的(可以查看老一点的微博来得到这个url)