精英联盟总队|带大家写一波微信公众号的爬取!谁说微信爬不了的( 二 )


前面三个可变参数都好解决 , 后面两个参数似乎就比较难办了 。 不过经过测试 , 我们可以发现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格式的文件 。 具体而言 , 核心代码实现如下:


推荐阅读