抓包工具配置
1. Fiddler(windows)
- 安装:
- 配置:
# 1. 允许远程连接Tools > Fiddler Options > Connections > Allow remote computers to connect# 2. 支持 HTTPSTools > Fiddler Options > HTTPS > Decrypt HTTPS traffic# 3. 重启restart Fiddler# 4. 手机配置手机 wifi 设置代理,服务器地址为为电脑 ip 地址 xxx.xxx.xxx.xxx,端口为 8888# 5. 下载根证书safari 打开 xxx.xxx.xxx.xxx:8888, 下载安装根证书# 6. 完全信任证书设置 > 通用 > 关于本机 > 证书信任设置 > 针对根证书启用完全信任复制代码
2.Charles(MacOS)
- 安装:
- 配置:
# 1. 手机配置手机 wifi 设置代理,服务器地址为为电脑 ip 地址 xxx.xxx.xxx.xxx,端口为 8888# 2. 手机安装 SSL 证书Help -> SSL Proxying -> Install Charles Root Certificate on a Mobile Devicesafari 打开地址 chls.pro/ssl,下载根证书# 3. 完全信任证书设置 > 通用 > 关于本机 > 证书信任设置 > 针对根证书启用完全信任# 4. 设置ProxyProxy -> SSL Proxying Settings...,勾选 Enable SSL Proxying# 5. 添加域名Host: https://mp.weixin.qq.com Port: 443复制代码
scrapy(python package) 使用
- 官网介绍:
An open source and collaborative framework for extracting the data you need from websites.In a fast, simple, yet extensible way. 复制代码
- 使用:
# 1. 创建项目 WCSpiderscrapy startproject WCSpider# 2. 切换到项目目录cd WCSpider# 3. 创建爬虫 wechatscrapy genspider wechat mp.qq.com# 4. 设置 Agent在 settings 中打开 Agent 注释# 5. 添加 item在 items.py 中完成 item 创建 name = scrapy.Field age = scrapy.Field ... # 6. 解析 response设置 start_urls在 wechat.py 中解析 response, 返回item res = response.xpath(...) item['name'] = res['_name'] item['age'] = res['_age'] ... yield item # 7. 设置管道文件在 open_spider 初始化数据库等 self.f = open("file.json","w")在 close_spider 关闭数据库等 self.f.close()在 deal_spider 处理 item self.f.write(json.dumps(dict(item)))在 settings 中启用该管道文件复制代码
公众号历史消息抓包
本次抓包以 Charles 为例。
1.获取首页链接
如上图所示,需要的内容在 var msgList = '{...}' 中,由于并不是标准 html,所以这里 xpath 并不好用,可尝试正则表达式快速取出内容。
rex = "msgList = '({.*?})'"pattern = re.compile(pattern=rex, flags=re.S)match = pattern.search(response.text)复制代码
取出并格式化匹配项,本例中公众号中的内容都是以文本的形式发送,所以直接取 comm_msg_info 内容,具体请根据实际情况解析。
if match: data = match.group(1) data = html.unescape(data) data = json.loads(data) articles = data.get("list") item = WechatItem() for article in articles: info = article["comm_msg_info"] content = html.unescape(info["content"]) # 将获取的数据传递给管道 item["content"] = content item["we_id"] = info["id"] item["datetime"] = info["datetime"] item["we_type"] = info["type"] yield item复制代码
2. 获取上拉刷新链接
向上滚动历史列表,当到接近最底部时,会自动获取更多内容,此时可以通过抓包获取内容。
如图所示,返回的是 json 格式内容,通过 can_msg_continue 确定是否有后续内容,general_msg_list 是解析的内容。通过分析多个加载历史可知,offset 控制加载数据的位置。 --本例中使用 python 第三方库 requests 加载数据
def getMore(): # header header = sj_utils.header2dict(base_header) response = requests.get(getUrl(),headers = header, verify = False) js = json.loads(response.text) if js["errmsg"] == "ok": alist = js["general_msg_list"] # 内容是 json 字符串,需要先转为 json alist = json.loads(alist)["list"] for item in alist: # 具体处理 print(item["comm_msg_info"]["content"]) if js["can_msg_continue"]: url_offset += 10 # 设置偏移量 getMore()复制代码
3.处理数据
开头已经介绍了 scrapy 使用,通过管道文件可以轻松处理爬取内容。
# 保存 json 文件self.f.write(json.dumps(dict(item)))复制代码