批量下载国家自然科学基金结题报告图片
前言
提示:这里可以添加本文要记录的大概内容:
结题报告作为国家自然科学基金的最终结果,对于搞科研的人来说是很重要的,但是在网页中阅读,总会有一些不方便。本代码实现对单个结题报告的图片爬取。
提示:以下是本篇文章正文内容,下面案例可供参考
一、准备工作
安装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 requests
import json
import requests_cache
headers = {
'User-Agent': 'xxxxxxxxxxxxxx'
}
2.发送请求
#初始url
url='https://kd.nsfc.gov.cn/finalDetails?id=6f8f63e823a10f36598222c5e93555e6'
#动态请求时的url
base_url = 'https://kd.nsfc.gov.cn/api/baseQuery/completeProjectReport'
#字符串求片,获取参数id
id=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_url
print(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).content
with open(f'./image1/{i}.png', 'wb') as f:
f.write(data)
完整源码
import requests
import json
import requests_cache
headers = {
'User-Agent': 'xxxxxxxxxxxxxxxxxxx'
}
url='https://kd.nsfc.gov.cn/finalDetails?id=6f8f63e823a10f36598222c5e93555e6'
base_url = 'https://kd.nsfc.gov.cn/api/baseQuery/completeProjectReport'
#获取参数id
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
data=requests.get(new_url).content
with open(f'./image1/{i}.png', 'wb') as f:
f.write(data)
四、源码获取
以上就是今天要讲的内容,本文仅仅简单介绍了单个结题报告的图片爬取,本案例还有相关的进阶版可以实现多个结题报告爬取,放在不同的文件夹,同时合并成pdf文件(实现命名)。
编程不易,还望支持
本案例进阶版源码付费后可获得
vx:h10061120