Python批量下载地理空间数据云数据!Python无所不能!
模拟登录这里要用到两个包:requests和json。requests使用前得先安装:pip install requests。 In [3]: 进群:548377875 ? 即可获取数十套PDF哦! import requests import json 打开地理空间数据云的登录页面。按F12进入开发者工具台,在Element栏目,我们找到登录的表单,可以看到提交到后台有6个参数:
为了防止报403错误,我们得在请求中加入header和cookie,这个直接从浏览器中复制过来即可,但要把格式改成python字典形式。 数据准备好后,用requests.session()来发送请求,这样的话可以保存登录后的cookies,避免 接下来爬取数重新去拿cookies In [4]: def login(session): url="http://www.gscloud.cn/accounts/validate" # 地理空间数据云的用户验证网址 data={ "csrfmiddlewaretoken":"mzqcGIDTWJbmIo7UFTGI3gKYEotYMFEh",# 在浏览器控制台获得 "next":"",# 在浏览器控制台获得,一定要有 "userid":"123456789@qq.com",# 登陆账户 "password":"123456789",# 登陆密码 "captcha_0":"9a27b5da81e71078d97226fd10ea23b47beb6ba7","captcha_1":"WFJG" } headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/67.0.3396.99 Safari/537.36',"Referer":"http://www.gscloud.cn/accounts/login","Accept": "application/json,text/javascript,*/*; q=0.01" } cookie={"csrftoken":"mzqcGIDTWJbmIo7UFTGI3gKYEotYMFEh","_next_":"/"} r=session.post(url=url,data=data,headers=headers,cookies=cookie) code=json.loads(r.text)['code'] # 0代表登陆成功 if code==0: print("登陆成功") return 1 else: print("登陆失败") return 0 if __name__ == '__main__': session=requests.session() login(session) 获得指定数据列表登录成功后,我们就可以下载数据了,下载数据前我们先查询想要的数据 这里我通过行列号来查询Landsat8数据:
最后将所有数据名称保存在一个列表中 In [5]: url="http://www.gscloud.cn/search/query" data={ "tableInfo": '{"offset":0,"pageSize":100,"totalPage":10,"totalSize":96,"sortSet":[{"id":"datadate","sort":"desc"}],"filterSet":[{"id":"dataexists","value":"1"}]}',"productId": 411,"datatype": "OLI_TIRS","data": '{"path":"121-121","row":"40-40"}'} r = session.post(url,data=data )dicts = json.loads(r.text)['data'] 批量下载数据获得数据列表后,就可以拼接下载链接,然后下载数据了
因为遥感影像数据比较大,为了能在控制台看到下载进度,这里可以将下载分段进行,在请求中必须加上stream=True,然后通过respon.iter_content(chunk_size=chunk_size)设置每次下载的大小 In [ ]: for ds in dicts: cloud_cover = float(ds["cloudcover"]) #云量 if cloud_cover< 20.0: size=0 d_url="http://www.gscloud.cn/sources/download/411/"+ds["dataid"]+"/bj" # 构建下载地址 d = session.get(d_url,stream=True) chunk_size=1024000 #每次下载数据的大小 content_size=int(d.headers['content-length']) #文件总大小 print("文件总大小为:"+str(content_size/1024/1024)) with open("data/"+ds["dataid"]+".tar.gz","wb") as code: for data in d.iter_content(chunk_size=chunk_size): code.write(data) size+=len(data) #已下载文件大小 print('已经下载:%.4f %%' % (size*100.00/content_size)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |