如何用python自动下载这个数据呢?

作者站长头像
站长
· 阅读数 6

http://webapi.cninfo.com.cn/#...

点击 数据下载 ,可以获得一个表格。如何用python自动下载这个数据呢?

我希望自动完成下载。你点击下载,右边的network是一个gif类型。如何用python自动下载这个数据呢?

点击下载文件的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&lt=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

如何用python自动下载这个数据呢?

那个url根本就不是资源的url,网站隐藏了资源地址。请问如何获得资源的url?可否用wireshark来获得资源的实际地址?

回复
1个回答
avatar
test
2024-07-09

原来这里还有~

分享下解决思路:

  • HTTP接口,只有请求和响应。一般来说查询数据类,都是幂等的。相同的输入就会带来相同的输出。
  • 在上面的前提下,研究请求参数每个的含义。请求头和请求体。常见的有token,签名,加密等

实在不行就去看页面的JS代码,如:

answer image

answer image

$.ajax({
    type: 'get',
    url: env.origin + "/api/" + apiurl + '?scode=' + id,
    headers: {"mcode": indexcode.getResCode()},

answer image

var indexcode={
        getResCode:function(){
            var time=Math.floor(new Date().getTime()/1000); return window.JSonToCSV.missjson(""+time);
        }
    }
    window.indexcode = indexcode;

answer image


# -*- 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: 这个还是拷贝下浏览器的信息吧

必传的请求头就这仨。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容