最近因为需要建筑行业的企业的数据,就在网上找了一圈,然后看见全国建筑市场监管服务平台,然而访问了一下,平台的验证码不好搞,而且接口返回的数据还是加密的。在网上又看了一下,好像四库一平台还有小程序,研究了一下,小程序没有验证码的问题,决定搞一下,下面是我爬取的一些心得,不喜勿喷,谢谢!
下面是全国建筑市场监管服务平台(四库一平台)小程序的页面
一、使用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)); } }
接口返回:
三、数据做AES解密这是小程序企业列表的请求地址,小程序也是做了防爬手段的,虽然不像PC端那么多,但是也有。这里可以直接获取到接口请求的token的,按照他的请求头就可以直接请求,小程序的列表最多只能返回150条数据,这是个坑,其他详情接口没有这个限制。
当访问量上去之后,IP会被封,想要爬取数据最好还是要使用IP代理。
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。具体怎么 *** 作可以搜索获取小程序源码。
第一次写,有问题大家可以交流,学习。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)