> 文档中心 > 国家自然科学基金结题报告下载 python

国家自然科学基金结题报告下载 python


批量下载国家自然科学基金结题报告图片


前言

结题报告作为国家自然科学基金的最终结果,对于搞科研的人来说是很重要的,但是在网页中阅读,总会有一些不方便。本代码实现对单个结题报告的图片爬取。


一、准备工作

安装python3.8
安装requests(用于向服务器发送请求)
安装json库(用来处理动态数据)
本教程要爬取的图片来自
https://kd.nsfc.gov.cn/finalDetails?id=6f8f63e823a10f36598222c5e93555e6

二、分析网页

进入网页后的界面如下
在这里插入图片描述
点击结题报告全文免费阅读
在这里插入图片描述
跳转进入阅读界面
在这里插入图片描述
点击F12打开开发者工具,点击Network---->Fetch/XHR---->F5刷新,会出现一下界面
在这里插入图片描述
再点击页面右边按钮,图片加载的同时,XHR的请求变多
在这里插入图片描述
双击completeProjectReport请求
在这里插入图片描述
在这里插入图片描述
从第一张图获取requests url: https://kd.nsfc.gov.cn/api/baseQuery/completeProjectReport
以及请求类型post

从第二张图获取获取 id 和 index 两个参数
id其实就是https://kd.nsfc.gov.cn/finalDetails?id=6f8f63e823a10f36598222c5e93555e6后面id的部分

index:表示页数

将结题报告中在线阅读中的第一张图片在新的标签打开,上方地址栏有url:https://kd.nsfc.gov.cn/report/51/da1784340c8eec8121f68e67fc1d9970
这才是图片真正的url,我们就要想办法获得这样的url,获取一张图片的url,其他的图片url就可以利用循环来获取获取。
在这里插入图片描述
在这里插入图片描述
获取下图红色的url信息
在这里插入图片描述

三、实战

1.导入要用得第三方库和请求头

import requestsimport jsonimport requests_cacheheaders = {     'User-Agent': 'xxxxxxxxxxxxxx' }

2.发送请求

#初始urlurl='https://kd.nsfc.gov.cn/finalDetails?id=6f8f63e823a10f36598222c5e93555e6'#动态请求时的urlbase_url = 'https://kd.nsfc.gov.cn/api/baseQuery/completeProjectReport'#字符串求片,获取参数idid=url[-32:]data={'id': id,'index': 1}#经过拼接得到新的url:https://kd.nsfc.gov.cn/api/baseQuery/completeProjectReportid=6f8f63e823a10f36598222c5e93555e6&index=1请求response=requests.post(base_url,data=data,headers=headers)print(response)

运行效果如下:
在这里插入图片描述

3.json数据获取及处理

res_json=json.loads(response.text)print(res_json)

运行结果
得到字典类型
{‘code’: 200, ‘message’: None, ‘data’: {‘hasnext’: True, ‘url’: ‘/report/51/da1784340c8eec8121f68e67fc1d9970’}},,,,字典中url的value值为/report/51/da1784340c8eec8121f68e67fc1d9970,,对应第一张图片url:https://kd.nsfc.gov.cn/report/51/da1784340c8eec8121f68e67fc1d9970的后面一部分。
加粗样式
获取url的value值

end_url=res_json.get('data').get('url')print(end_url)new_url='https://kd.nsfc.gov.cn/'+end_urlprint(new_url)

运行结果
在这里插入图片描述
加循环

for i in range(1,100):    id=url[-32:]    data={'id': id,'index': i}    response=requests.post(base_url,data=data,headers=headers)    res_json=json.loads(response.text)    end_url=res_json.get('data').get('url')    new_url='https://kd.nsfc.gov.cn/'+end_url    print(new_url)

运行结果,实现对结题报告中所有图片url的获取
在这里插入图片描述

3.数据存储

data=requests.get(new_url).contentwith open(f'./image1/{i}.png', 'wb') as f:    f.write(data)

完整源码

import requestsimport jsonimport requests_cacheheaders = {     'User-Agent': 'xxxxxxxxxxxxxxxxxxx' }url='https://kd.nsfc.gov.cn/finalDetails?id=6f8f63e823a10f36598222c5e93555e6'base_url = 'https://kd.nsfc.gov.cn/api/baseQuery/completeProjectReport'#获取参数idfor i in range(1,100):    id=url[-32:]    data={'id': id,'index': i}    response=requests.post(base_url,data=data,headers=headers)    res_json=json.loads(response.text)    end_url=res_json.get('data').get('url')    new_url='https://kd.nsfc.gov.cn/'+end_url    data=requests.get(new_url).content    with open(f'./image1/{i}.png', 'wb') as f: f.write(data)

在这里插入图片描述

四、源码获取

以上就是今天要讲的内容,本文仅仅简单介绍了单个结题报告的图片爬取,本案例还有相关的进阶版可以实现多个结题报告爬取,放在不同的文件夹,同时合并成pdf文件(实现命名)。

编程不易,还望支持
本案例进阶版源码付费后可获得
vx:h10061120

帝国技术学习