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

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

点击 数据下载 ,可以获得一个表格。
image.png

我希望自动完成下载。你点击下载,右边的network是一个gif类型。
image.png

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

image.png

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

阅读 2.5k
2 个回答

原来这里还有~

分享下解决思路:

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

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

image.png

image.png

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

image.png

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

image.png


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

必传的请求头就这仨。

打开开发者工具后,再刷新一下网页,我看了一下是有的。

这个网站翻页的时候没有请求接口,第一次进入网页的时候就已经把获取数据的接口都请求了一次。

===
下面这个:p_sysapi

===
update
重新看了一下下载功能,基本确定那个下载按钮是不请求接口的,而是前端生成的CSV文件。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题