背景
最近朋友让帮忙爬取微信小程序上的内容;于是网上研究了一下,并使用到了Charles、Java调用crul请求的方式去爬取内容。
准备环境
- 拥有Java环境的windows10
- 安装Charles 这篇文章介绍的十分清楚,电脑已经支持微信小程序了所以跟着文章安装完移动端证书就ok了
- 安装crul
- 点击官网(这个是windows的)下载之后解压。
- 配置环境变量。将curl解压后的bin目录配置到系统Path变量中,这样打开命令行就可以直接使用curl命令了(这一步一定要做)。
下面正式开始爬取数据
- 启动charles,然后使用微信小程序或者网页,在网络包列表里找到想爬的数据对应得的请求,这一步如果数据乱码点击这里
- 然后右键复制 crul请求,在cmd窗口尝试一下复制的是否正确
这一步遇到一个问题;复制的crul有个--compressed
的选项,查了一下是使用压缩算法相关的,最新的windows版crul提示不支持这个参数;
这里直接去掉这个选项就可以解决,如下图,可能新版本不需要这个参数咯
crul没问题,就可以开始写程序了 - 这里用Java简单写了个用cmd调用crul获得结果的程序;获得结果后可以用fastJson、Jackson等将结果字符串反序列化成对象,方便后续处理。到这一步数据就爬取成功了
public class SpiderMain {
// 这个是刚才可以正常使用的crul
static String cmds = "curl -H \"Host: webapi2.qmai.cn\" -H \"promotion-code: \" -H \"work-wechat-userid: \" -H \"store-id: 49006\" -H \"accept-language: zh-CN\" -H \"work-staff-id: \" -H \"scene: 1256\" -H \"qm-from-type: catering\" -H \"multi-store-id: \" -H \"qm-user-token: bTuWckVbMHCrVg_gdNBL3fDOoabCg4YGQ60-_0-FzZIR8MLtoAKHZtk8yHQmgL5K\" -H \"work-staff-name: \" -H \"user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090a13) XWEB/9129\" -H \"qz-gtd: \" -H \"qm-from: wechat\" -H \"content-type: application/json\" -H \"accept: v=1.0\" -H \"channelcode: \" -H \"xweb_xhr: 1\" -H \"gdt-vid: \" -H \"sec-fetch-site: cross-site\" -H \"sec-fetch-mode: cors\" -H \"sec-fetch-dest: empty\" -H \"referer: https://servicewechat.com/wxafec6f8422cb357b/167/page-frame.html\" --data-binary \"{\\\"appid\\\":\\\"wxafec6f8422cb357b\\\"}\" \"https://webapi2.qmai.cn/web/catering2-apiserver/user-city/get-city-list-by-sale-type\"";
public static void main(String[] args) {
String res = execCmd(cmds);
System.out.println("httpResponse: " + res);
Response response = JSON.parseObject(res, Response.class);
System.out.println(response.toString());
}
private static String execCmd(String command) {
StringBuilder output = new StringBuilder();
Process p;
try {
p = Runtime.getRuntime().exec(command);
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
output.append(line).append("\n");
}
} catch (Exception e) {
e.printStackTrace();
}
return output.toString();
}
}
这里我用的fastJson,首先定义model类和所需的字段,给字段加上Getter Setter
然后就可以使用这个model类调用JSON的接口,对Http返回的字符串进行反序列化
附上FastJson依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>