国家自然科学基金结题报告下载 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