如何用python自动下载这个数据呢?
http://webapi.cninfo.com.cn/#...
点击 数据下载 ,可以获得一个表格。
我希望自动完成下载。你点击下载,右边的network是一个gif类型。
点击下载文件的copy download url,一个blob:
blob:http://webapi.cninfo.com.cn/3...使用inspect来查看请求:
Request URL: https://hm.baidu.com/hm.gif?cc=1&ck=1&cl=24-bit&ds=1920x1080&vl=970&ep=910*204*63*57*0*%23shengou%3Ediv%5B1%5D%3Ediv%3Ea*112*40*a*&et=2&ja=0&ln=en-gb&lo=0<=1677395526&rnd=879685976&si=489bd07e99fbfc5f12cbb4145adb0a9b&v=1.2.83&lv=2&sn=28414&r=0&ww=1017&u=http%3A%2F%2Fwebapi.cninfo.com.cn%2F%23%2FxinguList
Request Method: GET
Status Code: 200 OK
Remote Address: 111.206.208.102:443
Referrer Policy: strict-origin-when-cross-origin
那个url根本就不是资源的url,网站隐藏了资源地址。请问如何获得资源的url?可否用wireshark来获得资源的实际地址?
回复
1个回答
test
2024-07-09
原来这里还有~
分享下解决思路:
- HTTP接口,只有请求和响应。一般来说查询数据类,都是
幂等
的。相同的输入就会带来相同的输出。 - 在上面的前提下,研究请求参数每个的含义。请求头和请求体。常见的有token,签名,加密等
实在不行就去看页面的JS代码,如:
$.ajax({
type: 'get',
url: env.origin + "/api/" + apiurl + '?scode=' + id,
headers: {"mcode": indexcode.getResCode()},
var indexcode={
getResCode:function(){
var time=Math.floor(new Date().getTime()/1000); return window.JSonToCSV.missjson(""+time);
}
}
window.indexcode = indexcode;
# -*- coding: UTF-8 -*-
__author__ = 'lpe234'
import time
import base64
import requests as r
def gen_mcode():
ts_str = str(int(time.time()))
ts_b64 = base64.b64encode(ts_str.encode()).decode()
return ts_b64
def get_data():
ts_b64 = gen_mcode()
headers = {
'mcode': ts_b64,
'Referer': 'https://webapi.cninfo.com.cn/',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}
url = 'https://webapi.cninfo.com.cn/api/sysapi/p_sysapi1097?timetype=6&market=ALL'
resp = r.post(url, headers=headers)
print(resp.json())
def main():
get_data()
if __name__ == '__main__':
main()
重点在于headers
mcode
: 时间戳 Base64哈希一下Referer
: 应该是用来做一些校验?反正必传User-Agent
: 这个还是拷贝下浏览器的信息吧
必传的请求头就这仨。
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容