NSFC 数据爬取

398 字
2 分钟
NSFC 数据爬取

需求#

从国家自然科学基金大数据知识管理服务门户爬取论文数据。

搜索API#

  1. 打开浏览器的开发者工具(如 Chrome 的 F12);
  2. 在网络(Network)选项卡中,监控搜索的请求;
  3. 找到接口()[https://kd.nsfc.cn/api/baseQuery/completionQueryResultsData];
  4. 其请求体如下:
{"code":"A01","fuzzyKeyword":"","complete":true,"isFuzzySearch":false,"conclusionYear":"2020","dependUnit":"","keywords":"","pageNum":0,"pageSize":10,"personInCharge":"","projectName":"","projectType":"218","subPType":"","psPType":"","ratifyNo":"","ratifyYear":"","order":"enddate","ordering":"desc","codeScreening":"","dependUnitScreening":"","keywordsScreening":"","projectTypeNameScreening":""}

需要用到的字段只有:

code // 申请代码
conclusionYear // 结题年度
projectType // 资助类别
  1. 观察其返回内容:为一串无规律的长字符串,初步判断是经过了某种加密;

解密#

页面的HTML文件:

<body>
<noscript>
<strong>We're sorry but 国家自然科学基金大数据知识管理服务门户 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<script src="/js/chunk-vendors.559d99e0.js"></script>
<script src="/js/app.17b88e26.js"></script>
</body>

在网页的 JavaScript 文件中,尝试寻找相关的解密代码,最终在app.17b88e26.js中找到以下内容(注释为后期补充):

function g(e) {
// 定义密钥
var t = p.a.enc.Utf8.parse("IFROMC86");
// 使用 DES 解密方法
var n = p.a.DES.decrypt(
{
ciphertext: p.a.enc.Base64.parse(e) // 解析 Base64 编码的密文
},
t, // 解密密钥
{
mode: p.a.mode.ECB, // 使用 ECB 模式
padding: p.a.pad.Pkcs7 // 使用 PKCS7 填充方式
}
);
// 将解密后的内容解析为 UTF-8 字符串并转为 JSON
return JSON.parse(n.toString(p.a.enc.Utf8));
}

使用 Python 的 pycryptodome 库来实现解密:

Terminal window
pip install pycryptodome
from Crypto.Cipher import DES
from Crypto.Util.Padding import unpad
import base64
import json
def decrypt_des_ecb(ciphertext):
# 密钥
key = b"IFROMC86"
# Base64 解码
encrypted_data = base64.b64decode(ciphertext)
# 初始化 DES 解密器
cipher = DES.new(key, DES.MODE_ECB)
# 解密数据并移除填充
decrypted_data = unpad(cipher.decrypt(encrypted_data), DES.block_size)
# 解密后的字符串转为 JSON 格式
return json.loads(decrypted_data.decode('utf-8'))

对网页发送请求,成功得到解密后的JSON文件:

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

NSFC 数据爬取
https://blog.yokumi.cn/posts/nsfc-data-crawling/
作者
Yokumi
发布于
2025-01-22
许可协议
CC BY-NC-SA 4.0
相关文章智能推荐
1
Python 套件管理器 uv 使用介绍
开发心得Python 生态得益于大数据时代和大模型时代蓬勃发展,相应的包管理工具也不断涌现,这篇文章简单记录一下个人上手 Astral 团队开发的 uv 的一些基操和使用一段时间后的体验。当然其实官方文档[^1]已经很详细了。 下表转载自 Shoukai Huang 大佬的博客[^2] 整理的横向对比:
2
浅谈大型项目的模块化开发(Based on Python)
开发心得最近在进行大型项目开发时,自行实现的一些公共模块,包括工具库、API 客户端等,都被扔在一个文件夹下,需要时由该项目的控制代码进行调用,不过因为水平之菜,经过测试没什么问题的代码 PR 上去之后经常会出现需要反复修改的情况。而且另一方面,这些公共模块具有一定的可移植性,但只被一个项目使用,没什么性价比,肯定是需要进一…
3
第一台 VPS 折腾小记
开发心得在使用本项目/教程/脚本之前,请务必仔细阅读以下声明。一旦您开始使用、复制或修改相关内容,即视为您已完全接受并同意本免责声明的所有条款。 请谨记:使用技术时请务必遵守您所在国家和地区的法律法规。 使用 IPv6-only VPS 低成本独享家宽,解锁 ChatGPT 不风控
4
2026.5 Live Repo
生活杂谈翻了翻相册才发现上一次已经是去年 9 月的羊文学了,哎gszm坏事做尽。 这回的出行方式是经典京沪高铁二等座,去年锅贴得意之作绿皮 D9 真给我坐麻了,这次果断 G 系列。不过被课表背刺,本来还可以买早一班(),结果就是快 0 点才到虹桥。好像是第一次这么晚到沪国。
5
在 Linux 下编译安装 Dynamips 和 Dynagen 搭建 Cisco 实验环境
开发心得最终还是花了一点时间把计网实践的实验平台搞到 Linux 下实现了,相比于 Windows,同样配置的路由器,Linux 下 CPU 占用可降低 50% 以上,应该也会更加稳定吧。 本文将详细介绍如何在 Linux (Ubuntu/Debian) 系统下(macOS 等也是类似的,一些依赖的安装略有不同罢了)从源码编…

评论区

文章目录