微信公众号抓取思路 && 顺便求个职 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
givemefive
V2EX    Python

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

  •  
  •   givemefive 2015-04-06 12:44:38 +08:00 27872 次点击
    这是一个创建于 3870 天前的主题,其中的信息可能已经有所发展或是发生改变。

    微信公众号存在不少精彩的文章,如果善于挖掘,可以得到不少的收获。但由于微信对PC端的支持并不友好,虽然有搜狗搜索可以用,但其结果仍然不全,一些公众号发的不是文章类型的只是一段话,搜狗就不收录。想要得到一个账号所有的文章,还是要从爬虫着手。网上对于微信公众号文章爬取的方法几乎没有介绍,不过有几个网站,比如传送门就做出来了。这就告诉我们这个目标是可以达到的。废话不多说,直入主题。
    要想得到一个公众号发送的所有文章,需要从微信手机端入手。点击公众号右上角小人图标,会有查看历史消息的链接。点了之后可查看所有历史文章。所以自然要从这里入手了。上抓包工具,Fiddler4,手机和电脑接入同一网络,手机wlan设置代理,指向电脑的ip地址,端口默认8888,这样在电脑上就可以监听手机的http流量了。通过抓包,在点击‘查看历史消息’选项时,请求的地址是
    抓包1
    通过对多个账号进行抓包分析,可以确定biz这个14位的字符串是每个公众号的“id”,uin似乎与访问者有关,key也和所访问的公众号有关,可以在下面的抓取中得到这两个参数,其他的查询参数都可以去掉。
    所以,必须得到三个参数才可以得到文章列表。这三个参数biz最容易获得,在搜狗的微信平台,搜索目标公众号,会有对应的文章列表,连接到相应的文章页面。解析文章列表,即可得到公共账号的biz。可以通过请求http://weixin.sogou.com/weixin?query=,填入目标账号名称,返回的结果里解析最新文章的url,里面包含biz。当然,模糊搜索会出现多个候选账号,这个就比较难办了。
    现在,已知biz,如何继续?我曾经也困扰了好久,也算是偶然发现的。电脑登陆微信,在手机上访问某个公众号的查看历史消息页面,点击右上角,发送给朋友,发送给文件助手即可,电脑上查看。
    如图
    似乎看到连接了,打开,果然跳转到了文章列表的页面!查看元素,这个存在span标签内,仔细观察,才发现坑爹啊,和刚才抓包看到的url是一样的!继续寻找,这个spana标签的子元素,看这个a标签的href
    a
    加上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,
    uin
    可以用正则表达式提取出来。紧接着下面就是这个页面的msgList,类似json的文本,当前页面就是通过这里的文本渲染的。
    msglist

    可以用正则提取出来直接解析出来,然后用json.loads方法就可以得到dict,里面的信息包括content_url,文章发表的datetime时间戳,摘要信息,文章的id编号mid,还有是否是一次发多篇is_multi等。
    鼠标向下滚动,可以看到动态请求更久远的文章,抓包可得,是通过json返回的。请求的url就是类似
    json
    这种的,前面获取的参数就都派上用场了。只要这几个参数就可以抓取了,后面几个参数不要也可以。要获得一个公众号的全部文章,可以将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,目标地区是长三角,当然其他地方也可以考虑。
    希望不要加班太多,详情请联系 [email protected]

    9 条回复    2017-05-31 09:04:50 +08:00
    gracece
        1
    gracece  
       2015-04-06 13:23:26 +08:00
    图片地址贴错了
    gracece
        2
    gracece  
       2015-04-06 13:26:06 +08:00








    givemefive
        3
    givemefive  
    OP
       2015-04-06 14:12:45 +08:00
    @gracece 多谢。。之前没有贴过图。。不过我是按着faq来的啊
    yepinf
        4
    yepinf  
       2015-04-23 11:02:42 +08:00
    这个思路看起来很不错..只是跳转那一块怎么处理?
    ulic95
        5
    ulic95  
       2015-06-18 11:16:30 +08:00
    有成品么
    est
        6
    est  
       2015-07-07 10:04:17 +08:00
    lazydao
        7
    lazydao  
       2016-01-26 19:32:11 +08:00
    czzsean
        8
    czzsean  
       2016-03-29 14:52:20 +08:00
    我抓包没有看到 span 的父标签 a 是什么样子,是微信更改了吗?
    85437898
        9
    85437898  
       2017-05-31 09:04:50 +08:00
    为什么一定要去 模拟点击呢 这样 一点也不优雅
    可以看看 微信热文捕手接口版:wxhand.com.cn
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2560 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 15:15 PVG 23:15 LAX 07:15 JFK 10:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86