首先来讲下需求,需求很简单(-_-!!), 就是爬指定微信公众号的全部文章并保存为pdf。
看到这个需求的时候正好我用电脑登录着微信,就想着先用电脑抓一下包看可不可行(能少用工具就少用,减小运行依赖),后来发现果真有数据返回。(有搞头!)
下面说下具体分析步骤:web
打开后这样
json
呐,接口已经找到了。微信
因为上面这些参数根本就不知道是怎么生成的,因此就考虑使用mitmdump配合,那如今的关键点由怎么破解这些参数来到了 如何构造下一次请求。经过多下滑几回发现,其它参数都是固定不变的,只是 offset这个关键参数来控制它的翻页。经过观察响应
能够找到 next_offset 这个参数就是下一次请求的 offset参数。那如何知道它已经翻到底了,没有更多内容了呢? 你能够控制滑轮一直下滑,观察最后一个接口的响应体内容,就会发现 can_msg_continue=0 若是能够翻页的话,这个参数的值为1。app
这样就能够获取首次打开公众号的参数(注意: 这些参数就仅对这一个公众号有用,等控制台打印 爬取完毕,再去点击另一个公众号)。 而后交给parse去解析下载svg
import requests import json import time from lxml import etree def parse(__biz, uin, key, pass_ticket, appmsg_token="", offset="0", **kwargs): url = "https://mp.weixin.qq.com/mp/profile_ext" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.901.400 QQBrowser/9.0.2524.400", } params = { "action": "getmsg", "__biz": __biz, "f": "json", "offset": str(offset), "count": "10", "is_ok": "1", "scene": "124", "uin": uin, "key": key, "pass_ticket": pass_ticket, "wxtoken": "", "appmsg_token": appmsg_token, "x5": "0", } proxies = { "https": None, "http": None, } res = requests.get(url, headers=headers, params=params, proxies=proxies, timeout=3) data = json.loads(res.text) msg_list = eval(data.get("general_msg_list")).get("list", []) for i in msg_list: url = i["app_msg_ext_info"]["content_url"] title = i["app_msg_ext_info"]["title"] print(title, url) # 判断是否可继续翻页 1-能够翻页 0-到底了 if 1 == data.get("can_msg_continue", 0): time.sleep(3) parse(__biz, uin, key, pass_ticket, appmsg_token, data["next_offset"]) else: print("爬取完毕")
大致代码就这样了,能够获取到标题和里面的内容了,最后我使用的pdfkit这个包 保存为pdf。函数
这里给你们说下这里面的坑,不知道你们发现没有,开启了mitmdump 是不能抓到 自身电脑的http请求包的,而Fiddler和Charles就能够直接抓到。 mitmdump须要设置代理,具体设置步骤以下:
而后你们确定发现个人parse函数里为何有一行设置代理的参数,而http和https的代理全为None
若是不加上他,它就会走代理,并且报一个 没法链接到代理的错误。具体错误,你们能够尝试一下。除非关闭刚才设置的代理,那若是关闭了, mitmdump就又抓不到电脑的请求包了。。。。因此这里要这样设置。其实还有种方法,下面把这两种代码都贴上
工具
至于说保存为pdf,里面的还有一堆坑,好比保存的文章pdf没有图片等等问
题,这里就不在赘述了!
到这里就结束了。要爬取哪一个公众号,只须要点一点公众号列表的公众号便可!
存在的缺点: 若是要爬取的公众号不少,这种方法可能不太适用!ui