微信公众号抓取思路 && 顺便求个职

2015-04-06 12:44:38 +08:00
 givemefive

微信公众号存在不少精彩的文章,如果善于挖掘,可以得到不少的收获。但由于微信对PC端的支持并不友好,虽然有搜狗搜索可以用,但其结果仍然不全,一些公众号发的不是文章类型的只是一段话,搜狗就不收录。想要得到一个账号所有的文章,还是要从爬虫着手。网上对于微信公众号文章爬取的方法几乎没有介绍,不过有几个网站,比如传送门就做出来了。这就告诉我们这个目标是可以达到的。废话不多说,直入主题。
要想得到一个公众号发送的所有文章,需要从微信手机端入手。点击公众号右上角小人图标,会有查看历史消息的链接。点了之后可查看所有历史文章。所以自然要从这里入手了。上抓包工具,Fiddler4,手机和电脑接入同一网络,手机wlan设置代理,指向电脑的ip地址,端口默认8888,这样在电脑上就可以监听手机的http流量了。通过抓包,在点击‘查看历史消息’选项时,请求的地址是

通过对多个账号进行抓包分析,可以确定biz这个14位的字符串是每个公众号的“id”,uin似乎与访问者有关,key也和所访问的公众号有关,可以在下面的抓取中得到这两个参数,其他的查询参数都可以去掉。
所以,必须得到三个参数才可以得到文章列表。这三个参数biz最容易获得,在搜狗的微信平台,搜索目标公众号,会有对应的文章列表,连接到相应的文章页面。解析文章列表,即可得到公共账号的biz。可以通过请求http://weixin.sogou.com/weixin?query=,填入目标账号名称,返回的结果里解析最新文章的url,里面包含biz。当然,模糊搜索会出现多个候选账号,这个就比较难办了。
现在,已知biz,如何继续?我曾经也困扰了好久,也算是偶然发现的。电脑登陆微信,在手机上访问某个公众号的查看历史消息页面,点击右上角,发送给朋友,发送给文件助手即可,电脑上查看。

似乎看到连接了,打开,果然跳转到了文章列表的页面!查看元素,这个存在span标签内,仔细观察,才发现坑爹啊,和刚才抓包看到的url是一样的!继续寻找,这个spana标签的子元素,看这个a标签的href

加上https://wx.qq.com的前缀,就可以访问了,最后301跳转到了span的内容那个url。多看几个不同的公众号,可以发现a标签的内容基本一样,不同的只是biz而已。所以可以把这个url记为raw_url,每次请求时,用不同的biz替换即可。当然,要带上ua,cookie的header。用request.get(url,headers=m_header,verify=False),因为请求的是https域,所以要加上verify=False,返回的内容文章列表的那个页面。分析那个页面,即可以找到uin,key,

可以用正则表达式提取出来。紧接着下面就是这个页面的msgList,类似json的文本,当前页面就是通过这里的文本渲染的。

可以用正则提取出来直接解析出来,然后用json.loads方法就可以得到dict,里面的信息包括content_url,文章发表的datetime时间戳,摘要信息,文章的id编号mid,还有是否是一次发多篇is_multi等。
鼠标向下滚动,可以看到动态请求更久远的文章,抓包可得,是通过json返回的。请求的url就是类似

这种的,前面获取的参数就都派上用场了。只要这几个参数就可以抓取了,后面几个参数不要也可以。要获得一个公众号的全部文章,可以将frommsgid改到比他最新文章的id大一点的数字(实验证明若刚好取最新文章的id,则会忽略最新的那篇),count值设置大一点,比如5000,基本上就会把所有文章信息都返回了。
根据返回的json,从中解析出文章的url,然后就可以去爬取文章了,这个比较常规,貌似连cookie都不用带,就不赘述了。

接下来再说说获取文章点赞数,阅读数的思路。从电脑网页访问是得不到这些数据的,只能从手机上获得。需要的参数还是uin,biz,key,mid以及idx。其中idx是这篇文章所在的编号,比如一个人一天发了3篇文章,idx就分别对应1,2,3。这几个参数的名称可能有些不一样,有时叫mid,有时是appmsgid,是从这样的url里获得的http://mp.weixin.qq.com/s?__biz=MzA3NTEzMTUwNA==&mid=206110593&idx=1&sn=bbebeb601bec2cd9bb576f31601774c5&scene=4#wechat_redirect,可能要进行一些异常处理。提交的地址是http://mp.weixin.qq.com/mp/getappmsgext,参数是上面提到的,提交的header要伪装成手机的,主要是ua,host要不要用我忘记了,之前的代码里是注释掉这句的,
readnum_header={'User-Agent':'Mozilla/5.0 (Linux; Android 4.4.2; sdk Build/KK) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 MicroMessenger/6.0.0.61_r920612.501 NetType/epc.tmobile.com',#'Host':'mp.weixin.qq.com'},然后返回的还是json,进行解析即可。

以上即是爬取的大致思路。


求个职:
我是应届生,属于半路出家型的,实习半年多。技术方向是python,django,目标地区是长三角,当然其他地方也可以考虑。
希望不要加班太多,详情请联系 givemesix.code@gmail.com

27298 次点击
所在节点    Python
9 条回复
gracece
2015-04-06 13:23:26 +08:00
图片地址贴错了
gracece
2015-04-06 13:26:06 +08:00








givemefive
2015-04-06 14:12:45 +08:00
@gracece 多谢。。之前没有贴过图。。不过我是按着faq来的啊
yepinf
2015-04-23 11:02:42 +08:00
这个思路看起来很不错..只是跳转那一块怎么处理?
ulic95
2015-06-18 11:16:30 +08:00
有成品么
est
2015-07-07 10:04:17 +08:00
lazydao
2016-01-26 19:32:11 +08:00
czzsean
2016-03-29 14:52:20 +08:00
我抓包没有看到 span 的父标签 a 是什么样子,是微信更改了吗?
85437898
2017-05-31 09:04:50 +08:00
为什么一定要去 模拟点击呢 这样 一点也不优雅
可以看看 微信热文捕手接口版:wxhand.com.cn

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/181857

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX