最近因为需要建筑行业的企业的数据,就在网上找了一圈,然后看见全国建筑市场监管服务平台,然而访问了一下,平台的验证码不好搞,而且接口返回的数据还是加密的。在网上又看了一下,好像四库一平台还有小程序,研究了一下,小程序没有验证码的问题,决定搞一下,下面是我爬取的一些心得,不喜勿喷,谢谢!
下面是全国建筑市场监管服务平台(四库一平台)小程序的页面
一、使用Fiddler爬虫抓包工具抓取小程序访问链接
我比较喜欢使用Fiddler抓包工具,怎么安装和使用我在这里就不介绍了,自己去网上百度。通过Fiddler抓取到小程序的访问链接。
通过分析小程序的接口,我发现我们需要的就两个接口地址: https://sky.mohurd.gov.cn/skyapi/api/statis/getResult https://sky.mohurd.gov.cn/skyapi/api/statis/getExtResult 主要是通过改变keys值得方式去获取不同的数据的。
二、分析接口的请求
1.下面是接口的请求头
GET https://sky.mohurd.gov.cn/skyapi/api/statis/getResult?_t=0.8169400931262218&pageNumber=1&pageSize=10&keys=corp%2Fdata_search%2Fpage HTTP/1.1
Host: sky.mohurd.gov.cn
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat
cityCode: 510107
content-type: application/json
token: t_5fecc09e12534724bf1056f7a083cda5
Referer: https://servicewechat.com/wx8f070e7958a940d1/41/page-frame.html
Accept-Encoding: gzip, deflate, br
2.用Java写的爬取的代码
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSONObject;
public class DemoTest {
public static void main(String[] args) {
String respJson = HttpRequest.get("https://sky.mohurd.gov.cn/skyapi/api/statis/getResult?_t=0.8169400931262218&pageNumber=1&pageSize=10&keys=corp/data_search/page")
.header("content-type", "application/json")
.header("token", "t_5fecc09e12534724bf1056f7a083cda5")
.header("Host", "sky.mohurd.gov.cn")
.header("Referer", "https://servicewechat.com/wx8f070e7958a940d1/41/page-frame.html")
.header("cityCode", "510107")
.header("User-Agen", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat")
.timeout(20000)
.execute().body();
System.out.println(respJson);
JSONObject jsonObject = JSONObject.parseObject(respJson);
String data = jsonObject.getString("data");
System.out.println(DecryptData.decryptData(data));
}
}
接口返回:
这是小程序企业列表的请求地址,小程序也是做了防爬手段的,虽然不像PC端那么多,但是也有。这里可以直接获取到接口请求的token的,按照他的请求头就可以直接请求,小程序的列表最多只能返回150条数据,这是个坑,其他详情接口没有这个限制。 当访问量上去之后,IP会被封,想要爬取数据最好还是要使用IP代理。
三、数据做AES解密
1.接口返回的数据:
{"status":1,"data":"IZgvAGrUV31JJr52HNx0ahGAcuOGR/CyJmx2mLq/hwDhz12YxhKj8lNCLWc9oyTIrTzhQRPbWX5r...............","message":null}
2.需要我们做AES解密,下面是通过写的Java解密代码:
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.AES;
public class DecryptData {
public static void main(String[] args) {
String data = "IZgvAGrUV31JJr52HNx0ahGAcuOGR/CyJmx2mLq/hwDhz12YxhKj8lNCLWc9oyTIrTzhQRPbWX5rFKnyY8pcV+pjJ1IAEkiRSaY.......";
String key = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";
AES aes1 = new AES(Mode.ECB, Padding.PKCS5Padding, hexToByte(key));
System.out.println(aes1.decryptStr(data));
}
public static byte[] hexToByte(String hex) {
int len = hex.length() / 2;
byte[] result = new byte[len];
for (int i = 0; i < len; i++)
result[i] = Integer.valueOf(hex.substring(2 * i, 2 * i + 2), 16).byteValue();
return result;
}
}
3.解密后的数据:
[
{
"data":{
"asc":true,
"current":10,
"limit":15,
"offset":135,
"offsetCurrent":135,
"openSort":true,
"optimizeCount":false,
"pages":14,
"records":[
{
"legalMan":"张三",
"address":"云南省迪庆藏族自治州香格里拉市建塘镇乡巴",
"regionFullname":"云南省-迪庆藏族自治州",
"corpName":"云南XXX建筑工程有限公司",
"id":"002105291321963827",
"corpCode":"91530381MA6P2QDXXX"
},
{
"legalMan":"封于修",
"address":"重庆市九龙坡区滩XXXX",
"regionFullname":"重庆市",
"corpName":"重庆XX建设工程有限公司",
"id":"002105291241608685",
"corpCode":"915001076889206XXK"
}
],
"searchCount":true,
"size":15,
"total":200
}
}
]
由于各种相关原因,我就不把key写在文章中了,我可以大体写下怎么去找key,我是用手机模拟器安装微信和RE文件管理器,访问小程序,模拟器会把小程序的源码包下载到文件中,通过文件管理器找到一个后缀为.wxapkg的文件,反编译后再通过微信开发工具打开就可以找到加密的key。具体怎么操作可以搜索获取小程序源码。
第一次写,有问题大家可以交流,学习。
|