# 抓取数位观察中城市的GDP,公交车数量,户籍人口 # url = "https://www.swguancha.com/home/query-city-page" # 1.找数据 # 1.1如果数据在页面源代码里,则访问,在本案例中并没有在源代码中 # 1.2如果数据不在页面源代码里,则要抓包,一般在xhr选项中 # 1.3在XHR与JS中可能占比7:3,如果网站有分页,多点点分页,增加的为需要的包 # 如果参数是以requests payload的形式挂载在请求体上的,此时,请求头中的content-type必须和浏览器一致,否则服务器无法解析你的数据 # 请求头如果以user-agent结尾,则没有什么特殊的,如果后面还有x-什么的一大串,则是自己需要添加的逆向的,不是浏览器自带的。还有deviceType,content-type需要带上。 # requests.post传递参数的时候,如果传的是字典,默认会被处理成form data形式 即current=1&dimensionTime=2019&levelType=2&propertyCode=DISTRICT_PROP_GJ025_RJDQSCZZ&propertyCode=DISTRICT格式 # 但是浏览器传递的是json格式,所以发生了错误,解决的方法,import json,json.dumps(data)转换为json字符串格式,或者在传递参数的时候json = data # 通过访问获取到密文数据UiY3CaV4ZQrQR9/LFH5qq2F4H8zkRn76NFu...接下来就是解密 # 通过观察,该网站多个不同的url都进行了加密,正常情况下应该是用一套加密逻辑的,我们可以直接搜interceptors拦截器
如何搜索呢:
如何弹出控制窗口:
点击三个点,点击Hide console drawer即可
在search下搜索interceptors
这种类型的与解密无关
获取关键代码
t.data是被加密的数据 var n = u.enc.Utf8.parse(l) # 把l处理为编码为utf-8 , r = u.AES.decrypt(t.data, n, { # AES.decrypt AES解密 mode: u.mode.ECB, padding: u.pad.Pkcs7 }) , i = r.toString(u.enc.Utf8) , s = JSON.parse(i); t.data = s ’‘’ 解密方式:AES 密钥:l.encode("utf-8") # 'QV1f3nHn2qm7i3xrj3Y9K9imDdGTjTu9'.encode('utf-8') 模式:ECB padding:PKCS7 ->unpad
如何获取密钥呢?
打断点:
然后点击下一个页面,页面会暂停住
通过console获得密钥,在写代码时,要将密钥转为utf-8的格式
如何干掉填充呢:
ming_bs = unpad(ming_bs,16)
将加密数据转为字节:
base64.b64decode(response.text)
再进行解密:
ming_bs = unpad(ming_bs,16) # AES处理的长度就是16 ming = ming_bs.decode("utf-8")
再将解密的数据转为utf-8格式
ming = ming_bs.decode("utf-8")