gues1688 发表于 2024-10-30 15:56:35

如何获取获取服务器脚本中的list数组?

本帖最后由 gues1688 于 2024-10-30 15:57 编辑

网站,https://favor.fund.eastmoney.com/
有如下脚本(片段):
```
<script type="text/template" id="templ_fundlist_kfs">
    <tbody>
      <% for(var j=0,len=list.length;j<len;j++){ %>
            <tr class="<%=j%2==1?'even':''%> fund-row" data-settop="<%=list.setTop%>"
            data-fundtype="<%=list.FUNDTYPE%>" data-fundcode="<%=list.FCODE%>"
            data-fundname="<%=list.SHORTNAME%>">
            ......
</script>
```
我想获取服务器脚本中的list数组,有什么办法吗?
谢谢!

王一之 发表于 2024-10-30 15:56:36

gues1688 发表于 2024-10-31 12:54
大佬的这段回复,信息量超大,我得认真学习、反复琢磨。
初步看来,似乎分两种情况,登陆和不登陆,处理 ...

```js
// ==UserScript==
// @name         New Userscript
// @namespace    https://bbs.tampermonkey.net.cn/
// @version      0.1.0
// @descriptiontry to take over the world!
// @author       You
// @match      https://favor.fund.eastmoney.com/
// @run-at       document-end
// ==/UserScript==

const wrap = ejs.render;
ejs.render = function (a, b, c) {
    console.log(a, b, c);
    return wrap.apply(this, );
}
```

这样就可以劫持到数据了,判断一下入参,拿你想拿的

王一之 发表于 2024-10-30 16:06:56

看起来是通过这个接口获取的数据,调用这个接口就好了

```bash
curl 'https://api.fund.eastmoney.com/favor/GetFundsInfo?' \
-H 'Accept: application/json, text/javascript, */*; q=0.01' \
-H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' \
-H 'Connection: keep-alive' \
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
-H 'Origin: https://favor.fund.eastmoney.com' \
-H 'Referer: https://favor.fund.eastmoney.com/' \
--data-raw 'fcodes='
```

gues1688 发表于 2024-10-30 16:54:26

王一之 发表于 2024-10-30 16:06
看起来是通过这个接口获取的数据,调用这个接口就好了

```bash


谢谢!
不是这个接口,这个接口,fcodes= 本身就需要引用这个list

王一之 发表于 2024-10-30 17:08:08

gues1688 发表于 2024-10-30 16:54
谢谢!
不是这个接口,这个接口,fcodes= 本身就需要引用这个list

你想获取的数据是哪些呢?

网站里面我没有看到你的脚本片段

gues1688 发表于 2024-10-30 17:19:20

王一之 发表于 2024-10-30 17:08
你想获取的数据是哪些呢?

网站里面我没有看到你的脚本片段

可能要先自选一些基金吧,比如收藏下面这些基金
006733
013923
019072
012363
007531
400015
015178
013331
015046
002190
010685
005491
然后,在控制台,输入:
document.querySelectorAll('#templ_fundlist_kfs'),可看到脚本片段,比较长,我节选并格式化了部分片段。
想要获取脚本中的 list 数组

gues1688 发表于 2024-10-30 17:26:48

gues1688 发表于 2024-10-30 17:19
可能要先自选一些基金吧,比如收藏下面这些基金
006733
013923


如果自选的基金,不超过10个,自选列表,似乎保存在 cookie 中,超过10个的话,不知道如何获取。
如果在这个网站平台有注册的话,有个接口可以获取自选列表,
https://fundfavorapi.eastmoney.com/favor/fcode/get2?passportid=......
但获取的自选列表跟 list 顺序
也就是跟网站显示的顺序是不一样的。

王一之 发表于 2024-10-30 21:25:54

gues1688 发表于 2024-10-30 17:26
如果自选的基金,不超过10个,自选列表,似乎保存在 cookie 中,超过10个的话,不知道如何获取。
如果在 ...

是要获取自选基金?

实在不行可以这样去获取

document.querySelectorAll('.em-myfavor-table ')

其他数据我看好像是存cookie里面的,可能先通过api获取一次列表,再通过cookie匹配id提取出来并按id排序这样?

gues1688 发表于 2024-10-30 22:45:12

王一之 发表于 2024-10-30 21:25
是要获取自选基金?

实在不行可以这样去获取


嗯,是要获取自选开放式基金列表,另有用途。
通过网页html获取的代码,我知道,大致如下:
let arr = [];
document.querySelectorAll('#kfsTable a.code').forEach(x => arr.push(x.innerText))
console.log(JSON.stringify(arr, null, 4));

主要目的,如1楼所述,是想知道【如何获取获取网页脚本中的list数组?】

王一之 发表于 2024-10-30 23:29:44

gues1688 发表于 2024-10-30 22:45
嗯,是要获取自选开放式基金列表,另有用途。
通过网页html获取的代码,我知道,大致如下:
let arr = [] ...

说实话,知道获取那个没什么一样,知道这个东西是怎么得来的就行了

我简单看了一下,这个网页也是通过调用`https://api.fund.eastmoney.com/favor/GetFundsInfo?`这个API获取到数据,然后根据cookie里的数据处理得到的。具体的逻辑哥哥还是要搜索一下关键字`url: apiUrl.GetFundsInfo,`,然后去调试一下。

!(data/attachment/forum/202410/30/232253s4y9bwr3eo3j3a8e.png)

var t=I()里面核心的代码就是下面这个,从cookie里面获取到Eastmoney_Fund内容。

```js
utils.getCookie("Eastmoney_Fund");
```

处理完成之后赋值给u.Data,然后这时候的KFS就只有自选的几个了

!(data/attachment/forum/202410/30/232632offz5c41g1hndi58.png)

后面再跟进`z`里面,可以看到渲染逻辑了

!(data/attachment/forum/202410/30/232838rc0s0ssc0xe0vufz.png)

至于想拿到list,就考虑劫持一下`ejs.render`这个方法,从参数里面拿到`list`了,不过说实话,没必要,已经知道这个逻辑了,直接劫持请求,自己处理一下可能更好点
页: [1] 2
查看完整版本: 如何获取获取服务器脚本中的list数组?