怎样使用火车头采集微信文章

2015年9月17日 | 分类: 【软件】

意图:

微信公众号如何采集?比如 http://weixin.sogou.com/gzh?openid=oIWsFtyyNse80FUaTBNS00eEpg-0

结果:

仅在火车头论坛找到了采集指定微信文章的采集规则。但未找到有效获取文章列表的方法。

变通:

从知乎的一篇文章《如何收藏或保存微信公众帐号内的文章?》中看到:传送门 http://chuansong.me
如果你关注的账号传送门上没有的话,你可以在这里提交这个账号:http://chuansong.me/submit/account

那么,在没有分析出有效采集微信文章列表的规则之前,可以利用这个传送门服务,以之为桥梁,直接采集传送门中的指定微信公众号。

从V2EX的一篇文章《微信公众号历史文章获取?》中看到《微信公众号抓取思路》

微信公众号存在不少精彩的文章,如果善于挖掘,可以得到不少的收获。但由于微信对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是一样的!继续寻找,这个span是a标签的子元素,看这个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,进行解析即可。

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

另外一篇爬虫策略分析《微信公众平台账号内容搜索引擎爬取技术实现》

有人问:游迹语音助手中的“微信精选”和 www.lewuxian.com 怎样实现对微信公众平台内容进行爬取的,不会是像诸多所谓的微信内容聚合站人工维护的吧。
首先可以肯定的是:游迹团队不是白富美,没有魅力与微信团队勾搭上关系,因此无法获得官方未开放的接口来实现公众号的搜索及爬取。游迹语音助手及 www.lewuxian.com 中所有与微信公众账号相关的内容都是爬虫自动化完成的,这里大致分享一下思路。
由于微信尚未有公开的搜索接口供第三方的搜索引擎爬取,而且微信也未提供官方权威的微信公众号的导航网站或推荐服务,因此指望完成对所有微信公众号的爬取并不现实,只能对指定微信公众号的内容进行爬取。
因此微信公众号的爬取主要分为如下一些步骤:
第一步就是获得需要爬取的微信公众号列表
微信公众号列表可以参考那些微信导航站的做法,人工维护维护行业精品微信号列表。当然也可以直接爬取那些微信导航站,但质量很差。好在真正高质量值得爬取微信公众号也就至多上万个。
第二部就是要获取每一个微信公众号的内容入口页面。
随便留意一下某个微信公众号,会发现每个微信公众号的“查看历史消息”中有此公众号已发布的所有微信内容,剩下的问题是怎样获取这个地址。
聪明的程序猿们肯定会通过抓包、反编译等手段来获取此入口地址。好消息是要获取此微信公众号的入口地址并不复杂,你会欣喜发现此入口地址是一个普通的网页。坏消息是:当你多测试一下,你会悲剧地发现:
1)、此入口地址并不是固定不变的,一天左右就会变化的,主要是里面的key值。因此指望通过人工手工抓包一劳永逸地获取的地址并无太多实用价值
2)、此入口页面对未关注的用户只能看第一页,需要关注后才能看后续页面,要获取后续页面,只能关注此账号,但要人工关注上万个来自更多账号的关注并不现实
3)、微信对一个账号关注的公众号数是有上限限制的
应对此难题最一劳永逸的方案当然是反编译代码,获取微信的通信协议,但就研究结果来看,成本过高,破解的可能性也不大。游迹团队对此也无兴趣。
剩下比较靠谱、可行的方案就是:怎样在需要爬取时候能够获取指定的微信公众号的入口页面的实际地址,然后去爬取其内容;
那怎样实现以上方案呢?具体的方案,你懂的!
概括一下方案:
1)、获得需要爬取的微信公众号列表
2)、自动化获取微信公众号的入口页面实际地址,实施爬取

搜狗微信搜索的URL分析

微信公众号主页URL:http://weixin.sogou.com/gzh?openid=oIWsFt_rkSTCP-ca8pcMNdwjfk8g
列表页微信文章URL:http://weixin.sogou.com/websearch/art.jsp?sg=CBf80b2xkgbZeHWfPcy0uro5n0c0bmkV68ysB1uPDvIFgw3EvCrhMXnKgJvNSBvR99gN6vRgr4_3tZ1-6xkNq_mQRTCQgxJdMbhypLjOyj3g0XV5A2kz-ineanHc8EgDpKupsNTn9TZa8i_hvC38eg..&url=p0OVDH8R4SHyUySb8E88hkJm8GF_McJfBfynRTbN8wh4CimdevN_HV3nFXwSqVGoM-zqhvKlj3fm2EZ3L4U5LGQ3JxMQ3374tc8UKS9o9c4m48dpVZls4BiUNFGblR-XVdhrZ2fbKwlYy-5x5In7jJFmExjqCxhpkyjFvwP6PuGcQ64lGQ2ZDMuqxplQrsbk
实际微信文章URL:http://mp.weixin.qq.com/s?__biz=MzA5NjM0MjMzMQ==&mid=210646739&idx=1&sn=1f623929befc11cd9584c7722ccf9658&3rd=MzA3MDU4NTYzMw==&scene=6#rd

采集微信文章的规则分析

方案下载:

方案A. http://bbs.locoy.com/forum.php?mod=viewthread&tid=140609

方案B. http://bbs.locoy.com/forum.php?mod=viewthread&tid=138973

参考C. http://bbs.locoy.com/forum.php?mod=viewthread&tid=140421

这个规则的格式是.ljobx,是采集规则文件。

导入火车头方法,右键选中分组,弹出对话框,点击最下方“导入任务到该分组”。参考《9SiR火车头采集器教程:[2]怎样导入规则》

采集规则的制作:

参考:《dz3.0免登陆接口使用教程》官方的使用接口:http://faq.locoy.com/q-804

内容采集规则标签务必等于或者多于发布接口的标签。

参考:《添加多级网址之手动填写链接地址规则》 http://faq.locoy.com/q-800

参考:《在线发布模块制作教程》 http://faq.locoy.com/q-726

参考:用抓包工具分析一下 http://www.locoy.com/Down/RelatedSoft/Fiddler

参考:http://bbs.locoy.com/forum.php?mod=viewthread&tid=137418&highlight=%E5%BE%AE%E4%BF%A1

1、可以搜索指定微信公众号的内容;
2、可以搜索包含关键词的微信文章(不指定公众号);

结果页的代码同样是被加密了,列表页没有上一页下一页代码,只有“查看更多”——

<div class="p-more" style="display:none;" id="wxmore"><a href="javascript:"><span>查看更多</span></a></div>

所以难点有两个,一个是解密,看到源代码,能够找到列表(采集源),第二个是能不断的翻页直到结束

下一页不需要从源码中获取哈,用批量页码即可。