利用python下载哨兵1号轨道数据_python下载哨兵数据-程序员宅基地

技术标签: 爬虫  python  chrome  InSAR  url  

python下载哨兵一号轨道数据

最近因为项目需要,突然想起来自己曾写过这么一份脚本,就顺便修改了一下。首先明确一下我们的目标,根据已经下载的哨兵1号影像文件,下载哨兵1号对应的精密轨道数据。哨兵轨道数据下载网站目前用的多的有两个,分别是:
1.欧空局
2.美国earthdata
由于欧空局下载需要科学上网,因此我们这里选用earthdata网站。
在这里插入图片描述


可以看到这里的数据十分齐全,最近的更新日期20230322,最新的轨道日期是20230302的。


这里需要提醒一下,轨道文件的第一个日期为轨道数据更新日期,第二个和第三个日期的中间那一天才是影像的成像日期。


在这里插入图片描述
明确了下载目标,下面我们来研究一下这个网站。打开开发者模式,随机选择其中一条数据。
在这里插入图片描述
可以看到所有的文件都在pre标签下。任意选中一条数据复制其地址如下:https://s1qc.asf.alaska.edu/aux_poeorb/S1A_OPER_AUX_POEORB_OPOD_20140822T122852_V20140731T225944_20140802T005944.EOF
可以看出格式大体相似,接下来我们要做的就是根据我们自己的影像日期利用去寻找出这些链接地址,然后下载。下面来拆分一下任务:
1.下载轨道文件列表集合
2.根据自己的影像文件提取出需要下载的数据
3.下载数据。

1.获取文件列表

request = urllib.request.Request(url=url)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')   #获得源码

mw_list = re.findall(r'"[S1A_OPER_AUX_POEORB_OPOD_].*?[.EOF]">',content)

这里我们采用的方法是先获取该网站下的全部源码,接着使用正则表达式提取出文件列表,该正则表达式可以匹配所有以S1A_OPER_AUX_POEORB_OPOD_开头、以EOF中的任意一个字符结尾,并以">"字符结尾的子串。:
在这里插入图片描述从图片上我们可以看出,已经成功的提取处理所有的轨道文件名称列表。

2.根据自己的影像提取出需要下载的数据文件

这里的思路是首先根据影像日期去遍历文件列表,利用正则表达式提取出对应的文件名称。

2.1提取影像日期

timelist = []
def get_file_list(dir):
    for parent, dirnames, filenames in os.walk(dir):
        for file in filenames:
            result = re.search(r'[2]\d{7}',file)
            timelist.append(result.group())
        return timelist

这里利用的是os.walk函数,该函数可以分类返回文件和文件路径,这里就不详述了。根据返回的文件名称提取,对于给定的正则表达式’[2]\d{7}',含义如下:[2]:匹配数字2;\d{7}:匹配7个任意数字。因此,该正则表达式可以匹配所有以数字2开头,后跟7个任意数字的子串。

2.2匹配轨道文件名称

for i in mw_list: 
            a, filename, c = i.split('"') 
            result = re.search(r'S1A.*[V](\d{8})', filename) 

            dt = datetime.strptime(result.group(1), '%Y%m%d')  # 将字符串转换成 datetime 对象
            one_day = timedelta(days=1)  # 创建一个时间差对象,表示一天
            dt_plus_one_day =  datetime.strptime(time, '%Y%m%d') 

            if dt_plus_one_day == dt + one_day: # 将原始日期加上一天
                srcl = url + filename 

根据轨道文件的第二个日期问影像成像日期的前一天这个特性,我们利用判断语句寻找出所有得文件。

3.下载数据

在这里插入图片描述

该网站得下载需要授权,也就是登录,采用得方法为GET方法。为了防止反爬,我这里使用了代理池和多个浏览器模拟。

3.1 为防止被禁需要使用代理池

这里我介绍一个免费的获取代理的网站,快代理:
在这里插入图片描述
只需要用该网站上的免费代理将下文的ip替换即可。

proxy_list = [
    '117.91.254.237',
    '123.169.124.72',
    '122.143.213.135',
    '112.109.221.50',
    '36.56.101.237',
    '110.242.130.113',
    '113.194.136.201',
    '125.72.106.161',
    '20.86.39.237'
]
proxy = {'http': random.choice(proxy_list)}

3.3 模拟浏览器 定义请求头

header = [
    "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36",
    "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/537.75.14",
    "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)",
    'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11',
    'Opera/9.25 (Windows NT 5.1; U; en)',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
    'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',
    'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12',
    'Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9',
    "Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.04 Chromium/16.0.912.77 Chrome/16.0.912.77 Safari/535.7",
    "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0 "
]

headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'User_agent': random.choice(my_headers),
    'Cookie': 登录asf网站打开检查即可查看,并复制粘贴到此处
}

3.4定义formdata,进行模拟登录

formdata = {
    'redir': 'https://urs.earthdata.nasa.gov/oauth/authorize?response_type=code&client_id=BO_n7nTIlMljdvU6kRRB3g&redirect_uri=https://auth.asf.alaska.edu/login',
    'form_email': username,     #'asf网站的用户名'
    'form_password':  password,   #密码
    'login': u'登陆'
}

3.5获取轨道文件内容

s = requests.session()
response2 = s.get(url=srcl, proxies=proxy, data=formdata, headers=headers)
content = response2.text

3.6 写入文件

file = os.path.join(dir, filename) 
with open(file, 'wb') as wstream: 
      wstream.write(response2.content)

通过逐步得分解,我们摸清了所有得操作流程。下面是完整的代码,有需要的童鞋可以看看,使用的时候清记得替换上自己用户名和密码,以及请求头。

# -*- coding:utf-8 -*-
import urllib.request
import urllib.parse
import re
import requests
import random
import os

url = 'https://s1qc.asf.alaska.edu/aux_poeorb/'

proxy_list = [
    '182.34.17.104',
    '121.13.252.58',
    '116.9.163.205',
    '61.216.185.88',
    '117.114.149.66',
    '183.236.232.160',
    '117.41.38.16',
    '210.5.10.87',
    '121.13.252.60'
]

proxy = {'http': random.choice(proxy_list)}
#print(proxy)
my_headers = [
    "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36",
    "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/537.75.14",
    "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)",
    'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11',
    'Opera/9.25 (Windows NT 5.1; U; en)',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
    'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',
    'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12',
    'Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9',
    "Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.04 Chromium/16.0.912.77 Chrome/16.0.912.77 Safari/535.7",
    "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0 "
]
headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'User_agent': random.choice(my_headers),
    'Cookie':'_ga_XXXXXXXXXX=GS1.1.1648455850850.as3di3qk.1.1.1648455850.0; _gid=GA1.2.1768425303.1679376735; asf-urs=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJmaXJzdF9uYW1lIjoibHVvIiwibGFzdF9uYW1lIjoicWlhbmciLCJ1cnMtdXNlci1pZCI6ImxsbHEiLCJ1cnMtYWNjZXNzLXRva2VuIjoiZXlKMGVYQWlPaUpLVjFRaUxDSnZjbWxuYVc0aU9pSkZZWEowYUdSaGRHRWdURzluYVc0aUxDSnphV2NpT2lKbFpHeHFkM1J3ZFdKclpYbGZiM0J6SWl3aVlXeG5Jam9pVWxNeU5UWWlmUS5leUowZVhCbElqb2lUMEYxZEdnaUxDSmpiR2xsYm5SZmFXUWlPaUpDVDE5dU4yNVVTV3hOYkdwa2RsVTJhMUpTUWpObklpd2laWGh3SWpveE5qZ3hPVFk1TURZeUxDSnBZWFFpT2pFMk56a3pOemN3TmpJc0ltbHpjeUk2SWtWaGNuUm9aR0YwWVNCTWIyZHBiaUlzSW5WcFpDSTZJbXhzYkhFaWZRLlNoZ1hzdHNvS04yT3JoR3dTcXJqSUN0Z0g2V2lORG1IV1FzNGdrQUVKaktVekc2VWVkQmRzbGt3bHAxNGVVRHB5dVpGZlJwUkJBeC01VUpmMk1lLUpRNG5xZGpsMmJ5MHd1STE0SXVJUjlJVENsbEkxLUxPNUxPZHgxTnBfd0VwcEJrSWQ2SkhMUmdfX1doTC0wVklycGhkNkNCWnBzVXEwR1JTYmJoUWZhQWhYQlBaMm5ZMnFnVnJvbzluWHkzandLbWRWR21CY1E0bVV6UkFvdXNRNTZidy1YYmN5UnhUVVFJQUszb0hLek5DQzh6bHh1Q1h4ZWcyNExnd0JiS1pEQ1NQT3NJRXdTa2NsNTBVOEtMOHNKMThya2JlUndSYTZHOVZZV0x1ZXZaZ3BBUzBMY0NEbGFtZXFXYU1ta3ZubldIWW9LeUxMcE0yOHBRNXlQWUo3ZyIsInVycy1ncm91cHMiOltdLCJpYXQiOjE2NzkzNzcwNjMsImV4cCI6MTY3OTk4MTg2M30.T694NhEly5cx5myAWdeqdq2KBxfKoYYGlVjdjnMrlt19z1DhmMXydbb5f6bUB3KL05R56_ifDF5ez3e7dJYaxkIs7uWOY4v5wQ3iVEmkG-m5YkfRJiDwrk_UGfwUvav5dIIud1a2MSnYAZudrKhCFc2WJVfNSJZLJdggAbCv3FPHetJ3bOs4rSltCzfeadG0LDoM9kkJ0z6ABfOblMj3dHee-MoujClrhkI225_dHUqM5jJhPr1JSAOsmEFsCg7Xph7Bti_RbYsRKeNGiWNMNauiKLRtNS5e-MQoXjvpCw9oPxMvlGrsyAP4D78rCspC65l4kgH9Nl_VF3S-HuCR-l1ndyRYdDVVyQz3H12TC0O0SxumaVg1QESRBPMBeJVzd4EVYmINK3s9k8rZgla2NNtYcPLYSCuFzIfvBqTv3ya46UfGwHsT-w2o0oMZnqjp9n0Q__OdONQ4nvxEb2hD3WEWQJ4Z_KDxW-spFlabZ_5l5ZtAHwgAYTN55OWzqwtdk6wD2PiRjlgqYRyTqb8EAPGMfLKXblHnzGis3Y-8ycAyALc4TqXtzahD-T2WWYqI8TtHndy4TbqPPaQ3mViKCIvzfnXlWoVuTRx6_m8fj112lqayFGhIGJmo5wg8IME5q9L3tKjE0Ue21k9kpzEBPcDXW02Y5FnKtH4BKDveeSI; urs-user-id=lllq; urs-access-token=eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIjoiT0F1dGgiLCJjbGllbnRfaWQiOiJCT19uN25USWxNbGpkdlU2a1JSQjNnIiwiZXhwIjoxNjgxOTY5MDYyLCJpYXQiOjE2NzkzNzcwNjIsImlzcyI6IkVhcnRoZGF0YSBMb2dpbiIsInVpZCI6ImxsbHEifQ.ShgXstsoKN2OrhGwSqrjICtgH6WiNDmHWQs4gkAEJjKUzG6UedBdslkwlp14eUDpyuZFfRpRBAx-5UJf2Me-JQ4nqdjl2by0wuI14IuIR9ITCllI1-LO5LOdx1Np_wEppBkId6JHLRg__WhL-0VIrphd6CBZpsUq0GRSbbhQfaAhXBPZ2nY2qgVroo9nXy3jwKmdVGmBcQ4mUzRAousQ56bw-XbcyRxTUQIAK3oHKzNCC8zlxuCXxeg24LgwBbKZDCSPOsIEwSkcl50U8KL8sJ18rkbeRwRa6G9VYWLuevZgpAS0LcCDlameqWaMmkvnnWHYoKyLLpM28pQ5yPYJ7g; _ce.s=v~1afe2267d9729a004013f47f95c41669aa19cccd~vpv~2~v11.rlc~1679446161225; _ga_N5CLEFBXPF=GS1.1.1679446124.3.1.1679446163.0.0.0; _ga_HGQJE87DVC=GS1.1.1679446163.1.0.1679446163.0.0.0; _ga=GA1.2.992160214.1648455100; _ga_XCPHL9DW7E=GS1.1.1679446124.3.1.1679446182.0.0.0'
    }
formdata = {
    'redir': 'https://urs.earthdata.nasa.gov/oauth/authorize?response_type=code&client_id=BO_n7nTIlMljdvU6kRRB3g&redirect_uri=https://auth.asf.alaska.edu/login',
    'form_email': yourusename
    'form_password': password,
    'login': u'登陆'

}
#request = urllib.request.Request(url=url, headers=headers)
request = urllib.request.Request(url=url)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')   #获得源码

pattern = re.compile('"[S1A_OPER_AUX_POEORB_OPOD_].*?[.EOF]">', re.S)
mw_list = pattern.findall(content)
mw_list = re.findall(r'"[S1A_OPER_AUX_POEORB_OPOD_].*?[.EOF]">',content)
print(mw_list)

spath = r'D:\workspace\hubei'  # 哨兵数据目录
dir = r'D:\workspace\hubei\orbit_file'   # 下载数据目录

timelist = []
def get_file_list(dir):
    for parent, dirnames, filenames in os.walk(dir):
        for file in filenames:
            result = re.search(r'[2]\d{7}',file)
            timelist.append(result.group())
        return timelist

    # example srcl   https://s1qc.asf.alaska.edu/aux_poeorb/S1A_OPER_AUX_POEORB_OPOD_20210330T233246_V20190706T225942_20190708T005942.EOF
    #         srcl   https://s1qc.asf.alaska.edu/aux_poeorb/S1A_OPER_AUX_POEORB_OPOD_20210215T121728_V20210125T225942_20210127T005942.EOF

timelist = get_file_list(spath)

from datetime import datetime, timedelta

s = requests.session()

for time in timelist: 
    try: 
        for i in mw_list: 
            a, filename, c = i.split('"') 
            result = re.search(r'S1A.*[V](\d{8})', filename) 

            dt = datetime.strptime(result.group(1), '%Y%m%d')  # 将字符串转换成 datetime 对象
            one_day = timedelta(days=1)  # 创建一个时间差对象,表示一天
            dt_plus_one_day =  datetime.strptime(time, '%Y%m%d') 

            if dt_plus_one_day == dt + one_day: # 将原始日期加上一天
                srcl = url + filename 
                response2 = s.get(url=srcl, proxies=proxy, data=formdata, headers=headers) 
                content = response2.text 
                file = os.path.join(dir, filename) 
                with open(file, 'wb') as wstream: 
                    wstream.write(response2.content) 
                    print('{}已下载完成!'.format(filename)) 
                break
                
    except: 
        print('未找到{}号文件,下载失败'.format(time))
        continue

print('下载完成!')
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45373844/article/details/117035628

智能推荐

java工具类-生成二维码并上传到阿里图片服务器_java 生成二维码保存至服务器-程序员宅基地

文章浏览阅读1.8k次。1.引入jar<!-- https://mvnrepository.com/artifact/com.google.zxing/core --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>cor..._java 生成二维码保存至服务器

ZED2运行ORB-SLAM3 (一、环境搭建)_zed2 slam-程序员宅基地

文章浏览阅读1.2k次。ZED2 SDK3.6 + CUDA10.2 + Ubuntu18.04 + ROS Melodic ——ORB-SLAM3_zed2 slam

6.2.3、备份策略:完全备份、增量备份、差异备份-程序员宅基地

文章浏览阅读242次,点赞3次,收藏6次。常用的备份策略有完全备份和增量备份,增量备份可细分为累计增量备份和差异增量备份。

ReportServer_bi reportserver 登录用户和密码-程序员宅基地

文章浏览阅读1.2k次。Font-Size="8pt" AsyncRendering="False" ShowReportBody="True" SizeToReportContent="True"> //访_bi reportserver 登录用户和密码

模型量化技术在金融领域的实践-程序员宅基地

文章浏览阅读647次,点赞18次,收藏6次。1.背景介绍在过去的几十年里,金融领域经历了巨大的变革。随着计算机科学和人工智能技术的发展,金融市场也逐渐向着数字化和智能化发展。模型量化技术是这一趋势的一个重要体现,它在金融领域中发挥着越来越重要的作用。模型量化技术是指通过数学模型和算法来描述和预测金融市场行为的一种方法。这种技术可以帮助金融机构和投资者更有效地管理风险,提高投资回报,并提高市场操作的效率。在本文中,我们将讨论模型量化技...

Dagger2教程六之Component的组织方法(原)_daggeractivitycomponent-程序员宅基地

文章浏览阅读7.6k次,点赞9次,收藏11次。为了介绍Dagger2的使用,我们搭建了一个Demo来逐步分析,大家可以在这里下载源码(这个源码与之前的五个小节源码不同)(https://github.com/dushaofeng/DaggerDemo2.git)。 上一节我们介绍了《Dagger2教程五之单例模式》,这一节我们来介绍Component的组织方法。 所谓Component组织方法,也就是我们工_daggeractivitycomponent

随便推点

java 渐进式_javaSpringBoot带前后端渐进式开发企业级博客系统-程序员宅基地

文章浏览阅读100次。资源内容:javaSpringBoot带前后端渐进式开发企业级博客系统|____1-1_SpringBoot博客_课程导学.mp4|____1-2-SpringBoot是什么.mp4|____2-1-初始化第一个Web项目.mp4|____2-2-用Gradle编译项目.mp4|____2-3-探索项目.mp4|____3-1-编写项目构建信息.mp4|____3-2-自定义存储库,加速构建.mp..._springboot 渐进式开发企业级博客系统

使用图像直方图方式搜索相似图片_基于直方图的以图搜图-程序员宅基地

文章浏览阅读542次,点赞2次,收藏5次。使用图像直方图方式搜索相似图片该文章仅用于学习~  通常我们搜索图片,都是根据图片的标签搜索的。基于内容的搜索,就是不知道标签,而是直接输入一幅图像,然后搜索到与这幅图像相同或相似的图像(以图搜图)。以图搜图的方法之一就是比较图像直方图。下面我将使用图像直方图形式匹配相似图片:在不同电脑上匹配时要修改3个地方eg:想读到的原图务必在该程序文件夹下存有图片!否则会报错 (1)pa..._基于直方图的以图搜图

HTML、CSS和JS如何变成页面的-程序员宅基地

文章浏览阅读503次,点赞6次,收藏7次。掘金 浏览器 渲染原理 构建DOM树 复制代码。} 掘金 浏览器 渲染原理 构建DOM树

DuiLib属性_c++ duilib vscrollbar设置-程序员宅基地

文章浏览阅读1.7k次。_c++ duilib vscrollbar设置

python怎么使用预训练的模型_PyTorch使用预训练模型-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏19次。PyTorch模型加载的时候,有预训练模型,通过使用预训练模型可以给模型使用带来很多的便捷,对于模型的使用以下给出了一些总结,如有错误恳请指正。一、直接加载预训练模型进行训练1、加载保存的整个模型torch.save(model,'model.pkl')...model = torch.load('model.pkl')2、加载保存的模型参数torch.save(model.state_dict(..._预训练模型 python

华为云云耀云服务器L实例评测| CloudExplorer Lite轻量级云平台管理华为云云耀云服务器L实例-程序员宅基地

文章浏览阅读538次。华为云云耀云服务器L实例评测| CloudExplorer Lite轻量级云平台管理华为云云耀云服务器L实例_cloudexplorer

推荐文章

热门文章

相关标签