要获取微信上公众号文章的评论,直接在PC上打开相应网页会发现并没有评论内容,这点和微博移动端不同。所以我只能直接截获手机上的包。这里我使用了Fiddler软件。Fiddler的安装和运行并不复杂,有点麻烦的是配置Fiddler的客户端并让手机安装Fiddler的证书。
1、Fiddler客户端的配置:
Tools->Options...->Connections:
1.Fiddler listens on port是手机连接fiddler时的代理端口号,默认8888即可
2.Allow remote computers to connect是允许远程发送请求,需要勾上,会有warning:
意思就是会允许远程客户端的包通过电脑,然后Fiddler必须重启才能生效,重启的过程可能会遇到防火墙要求Remote Access许可。
Tools->Fiddler Options->HTTPS:
勾上Decrypt HTTPS traffic,会抓到手机的https请求,如果想抓到https请求还需要在手机安装证书
2、手机端的配置:
前提:必须确保安装fiddler的电脑和手机在同一个wifi环境下,也就是在同一局域网内。我是通过自己电脑上的共享wifi,这样也可以实现。一般的话只要笔记本和手机在一个路由器下就行。如果台式机的话可能需要一根网线。
步骤:
1、查看电脑ip,只要把鼠标放fiddler右上角的Online处,就可以看到:
此时在手机上查看所连接wifi的ip地址,我这里是:192.168.23.2
可见本机和手机在192.168.23.xxx的局域网中。
2、打开手机浏览器,输入网址:http://xxx.xxx.xxx.xxx:8888,然后前往,可以进入Fiddler的证书下载页面。
如果进不去可能是地址选错了,比如我这里应该是http://192.168.23.1:8888/而不是其他的3个;
也可能是Fiddler没有重启;
3、点击最下端的FiddlerRoot certificate,然后为证书命名后就安装成功了。
如果觉得不安全可以在工作完成后,从手机受信任的凭据里找到DO_NOT_TRUST_FiddlerRoot这个证书并删除。
4、最后在手机的wifi配置里手动设置代理,代理服务器主机名为主机ip,我的是192.168.23.1,代理端口为8888。
这样就可以在Fiddler上抓取手机的包了。
在微信上截获的公众号的评论及其内容,一般微信评论ip都是/mp/appmsg_comment?...如图左侧所示。点击右侧上方Inspector(有个?) -> 下方json 查看解码结果:
接下来就可以保存JSON进行分析,我尝试用Cookie根据网址爬取数据,但我header没设置好,并没有成功爬到数据,可能需要模仿手机的header发送request请求。(要学习的还有很多哇)
右键选中的那一行按如下操作保存Response Body:
得到的应该是一个json文件,可以用记事本打开(如果是乱码,重新保存一次,或者保存Entire Response...然后删掉文件头保留json本体,去掉头就可以吃):
除此之外还能获得该文章的阅读和点赞数:
附,从json中获取评论的python2代码,输出是一个excel表格weixin.csv:
#python2
import json
import csv
import os
import codecs
import sys
import time
reload(sys)
sys.setdefaultencoding('utf8')
#the output of comments is in weixin.csv
path = os.getcwd()+"/weixin.csv"
csvfile = open(path, 'w')
csvfile.write(codecs.BOM_UTF8)
writer = csv.writer(csvfile)
#change the name of 32_.json to your filename
file = open(os.getcwd()+"/31_.json", 'r')
jsondata = json.load(file)
datas = jsondata.get('elected_comment')
for data in datas:
created_at = data.get("create_time")
created_at = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(created_at))
like_counts = data.get("like_num")
username = data.get("nick_name")
comment = data.get("content").decode('utf-8')
#print comment
#print json.dumps(comment, encoding="UTF-8", ensure_ascii=False)
writer.writerow((username,created_at,json.dumps(comment, encoding="UTF-8", ensure_ascii=False),like_counts))
Reference:
[1]http://blog.csdn.net/wnma3mz/article/details/78570580 记一次微信公众号爬虫的经历
[2]https://www.cnblogs.com/meitian/p/4997310.html 使用Fiddler对手机上的程序进行抓包
etc.