这里要用到两个包:requests和Json。requests使用前得先安装:pip install requests。
In [3]:
进群:548377875 即可获取数十套pdf哦!
import requestsimport Json
打开地理空间数据云的登录页面。按F12进入开发者工具台,在Element栏目,我们找到登录的表单,可以看到提交到后台有6个参数:
csrfmIDdlewaretoken:经过多次测试,该值固定为“mzqcGIDTWJbmIo7UFTGI3gKYEotYMFEh”不变 next:该值为空,但必须要有 userID:为登录账号 password:登录密码 captcha_0:这是一个隐藏的参数,这个参数对应的验证码,可以直接复制过来 captcha_1: 验证码为了防止报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 0if __name__ == '__main__': session=requests.session() login(session)获得指定数据列表
登录成功后,我们就可以下载数据了,下载数据前我们先查询想要的数据 这里我通过行列号来查询Landsat8数据:
tableInfo:表示返回数据的基本配置,其中pagesize表示每页的数量 productID:表示数据类型,Landsat8为411 data:path和row表示数据的行列号范围最后将所有数据名称保存在一个列表中
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']批量下载数据
获得数据列表后,就可以拼接下载链接,然后下载数据了
cloud_cover表示云量,剔除云量过大的数据 d_url:表示下载链接因为遥感影像数据比较大,为了能在控制台看到下载进度,这里可以将下载分段进行,在请求中必须加上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))总结
以上是内存溢出为你收集整理的Python批量下载地理空间数据云数据!Python无所不能!全部内容,希望文章能够帮你解决Python批量下载地理空间数据云数据!Python无所不能!所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)