精英联盟总队|带大家写一波微信公众号的爬取!谁说微信爬不了的( 二 )
前面三个可变参数都好解决 , 后面两个参数似乎就比较难办了 。 不过经过测试 , 我们可以发现pass_ticket其实是一个可有可无的参数 , 所以我们可以不管它 。 而appmsg_token的有效期至少有10几个小时 , 这段时间足够我们爬取目标公众号的所有文章了 , 所以直接复制过来就可以了 , 没必要浪费时间分析这玩意(随便想想也应该知道白嫖腾讯肯定没那么容易的T_T) 。 写个代码简单测试一下:
import requestssession = requests.Session()session.headers.update(headers)session.cookies.update(cookies)profile_url = '前面抓包得到的请求地址'biz = 'MzAwNTA5NTYxOA=='pass_ticket = ''appmsg_token = '1055_YAmuAw2QG7dM3aTwSVZVqgtRdct6ilAMTwlz7g'params = {'action': 'getmsg','__biz': biz,'f': 'json','offset': '0','count': '10','is_ok': '1','scene': '123','uin': '777','key': '777','pass_ticket': pass_ticket,'wxtoken': '','appmsg_token': appmsg_token,'x5': '0'}res = session.get(profile_url, params=params, verify=False)print(res.text)运行之后可以发现返回的数据如下:
看来是没啥问题 , 重新调整封装一下代码 , 就可以爬取该公众号所有文章的链接啦 。 具体而言 , 核心代码实现如下:
'''获得所有文章的链接'''def __getArticleLinks(self):print('[INFO]: 正在获取目标公众号的所有文章链接...')fp = open('links_tmp.json', 'w', encoding='utf-8')article_infos = {}params = {'action': 'getmsg','__biz': self.cfg.biz,'f': 'json','offset': '0','count': '10','is_ok': '1','scene': '123','uin': '777','key': '777','pass_ticket': self.cfg.pass_ticket,'wxtoken': '','appmsg_token': self.cfg.appmsg_token,'x5': '0'}while True:res = self.session.get(self.profile_url, params=params, verify=False)res_json = res.json()can_msg_continue = res_json.get('can_msg_continue', '')next_offset = res_json.get('next_offset', 10)general_msg_list = json.loads(res_json.get('general_msg_list', '{}'))params.update({'offset': next_offset})for item in general_msg_list['list']:app_msg_ext_info = item.get('app_msg_ext_info', {})if not app_msg_ext_info: continuetitle = app_msg_ext_info.get('title', '')content_url = app_msg_ext_info.get('content_url', '')if title and content_url:article_infos[title] = content_urlif app_msg_ext_info.get('is_multi', '') == 1:for article in app_msg_ext_info.get('multi_app_msg_item_list', []):title = article.get('title', '')content_url = article.get('content_url', '')if title and content_url:article_infos[title] = content_urlif can_msg_continue != 1: breakelse: time.sleep(1+random.random())json.dump(article_infos, fp)fp.close()print('[INFO]: 已成功获取目标公众号的所有文章链接, 数量为%s...' % len(list(article_infos.keys())))运行之后 , 我们就可以获得目标公众号的所有文章链接啦:
现在 , 我们只需要根据这些文章链接来爬取文章内容就行啦 。 这里我们借助python的第三方包pdfkit来实现将每篇文章都保存为pdf格式的文件 。 具体而言 , 核心代码实现如下:
推荐阅读
- 骚狐君|他的存在对鲨鱼产生了威胁,和平精英人气榜公布!牧童稳坐第一
- nba|NBA太疯狂!2组1-1,1组2-2,联盟第1最悲惨!黑马逆袭,成赢家
- 大华联盟|朱元璋下令锯开棺材 6个大字朱元璋脸色大变,刘伯温下葬后
- 英雄联盟|余霜分手后开启奔放模式,一天连晒N组自拍,网友直呼太美了!
- 卡玛拉|《复仇者联盟》:不只是游戏,更是一部优秀的电影
- 和平精英|??“吃鸡”体验服已无更新,暗夜危机2.0,或将被1款新游戏代替!
- 英雄联盟|LOL九周年奖励发放,玩家开始“比惨大会”,你是欧皇还是非酋?
- 悠游侠|漫威复仇者联盟装备怎么升级 装备等级提升方法介绍
- 和平精英|和平精英三大一哥宣告诞生:王小歪排名第一,日赚1W3!
- 英雄联盟|LEC解说强行给帽皇树敌:不管你们怎么说,Caps都会打爆左手!
