【问题标题】:Need guidance on parsing some API data需要有关解析某些 API 数据的指导
【发布时间】:2020-09-17 17:52:05
【问题描述】:

我正在从事一个项目,我正在编写爬虫机器人以直接从网站 api 检索信息。我遇到了一些我以前从未见过的东西,如果可能的话,我可以使用一些帮助来解析数据。

这是我使用 python 请求从 API 检索的数据:https://pastebin.com/LMwNMFUg

headers = {
  'authority': 'www.blacktype.bet',
  'accept': '*/*',
  'dnt': '1',
  'x-requested-with': 'XMLHttpRequest',
  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36',
  'sec-fetch-site': 'same-origin',
  'sec-fetch-mode': 'cors',
  'sec-fetch-dest': 'empty',
  'referer': 'https://www.blacktype.bet/',
  'accept-language': 'en-GB,en-US;q=0.9,en;q=0.8',
  'cookie': 'JSESSIONID="OLSPgxtIG1W2eHIh-sXca80AB1Szr8F0V6J5gMqb.app2.rs.fsbtech.com:app2.rs.fsbtech.com-wildfly-fsbapi-server"; languageId=1; localeKey=en; siteId=1; visid_incap_1054556=uiVi8yfPQpeJHLvPtDckCv7WWV8AAAAAQUIPAAAAAABJt9bOcysr/h1j3vxhYBGi; _ga=GA1.2.1922055854.1599723264; clid=b071ab93-61fa-4c48-d7a0-616daaa095f8; autoPlay=true; sib_cuid=a455abe6-28f3-43bf-a365-6dd94105fc38; currencyCode=GBP; incap_ses_873_1054556=mFJGdXsmIFNrI9aT+YQdDDUNY18AAAAAmN4GnAX9apbD0wxbVt+CJQ==; betslip-notification=0; betslip-clear=0; _gid=GA1.2.1521194465.1600326966; eventCountry=GB; JSESSIONID="CqPav2ZP6d3ytJx4w6BB4fuarMU12_qMViZ_8pET.app1.rs.fsbtech.com:app1.rs.fsbtech.com-wildfly"; JSESSIONID="OLSPgxtIG1W2eHIh-sXca80AB1Szr8F0V6J5gMqb.app1.rs.fsbtech.com:app1.rs.fsbtech.com-wildfly-fsbapi-server"',
  "Accept-Encoding": "gzip"
}
url = "https://www.blacktype.bet/fsb-api-rest/racing/future/5/HORSES.fsb"
response = requests.get(url, headers=headers)

这里是 API URL:https://www.blacktype.bet/fsb-api-rest/racing/future/5/HORSES.fsb

谁能提供一些方向?还能做到吗?

提前谢谢各位!

【问题讨论】:

    标签: python api python-requests


    【解决方案1】:

    该 URL 指向您要下载的文件。要使用 requests 库下载文件,您应该执行以下操作:

    url = 'https://www.blacktype.bet/fsb-api-rest/racing/future/5/HORSES.fsb'
    response = requests.get(url)
    filename = url.rsplit('/', 1)[1]
    with open(filename, 'wb') as f:
        f.write(response.content)
    

    请参考:

    1. https://requests.readthedocs.io/en/latest/api/#requests.Response.content(阅读content 响应的属性)
    2. https://docs.python.org/3/library/functions.html#open(查看wb模式)

    【讨论】:

    • 这样我就可以正确解析文件中的数据而不是不可读?
    • 这将让您“按原样”下载该文件。解析是另一个主题。你知道那个文件格式吗?
    • 只要您知道文件格式 - 您就可以轻松解析它。例如,我发现关于“fsb”文件的第一件事就是这个github.com/HearthSim/python-fsb5
    • 但在你的情况下很可能是不同的东西(文件格式)
    • 这是一个数据文件,fsb5 用于音频文件。后端由 fsbtech.com 提供支持,所以我猜它可能是专有的,无法解码。
    【解决方案2】:

    本网站使用 msgpack javascript 模块来解析此类数据。

    import msgpack from "@msgpack/msgpack";
    import fs from 'fs';
    
    let data = fs.readFileSync('/Users/<username>/Downloads/HORSES.fsb');
    
    let d = msgpack.decode(data);
    let keys = Object.keys(d.__s).reduce((a, c) => (a[c] = d.__s[c].split('|'), a), {});
    const res = d.response;
    
    const recurseArray = (a) => {
        if (Array.isArray(a)) {
            if (a.length && Object.keys(keys).includes(a[0])) {
                const k = a.shift();
                return a.reduce((a, c, ci) => (a[keys[k][ci]] = recurseArray(c), a), {});
            }
            else {
                return a.map(recurseArray);
            }
        }
        else {
            return a;
        }
    };
    
    const dt = recurseArray(res);
    
    console.log(JSON.stringify(dt, null, 2));
    

    使用该代码,您可以将 JSON 文件表示形式转储到您的标准输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多