嫦娥4号是中国国家航天局于2018年12月8日发射的一颗月球探测器,于次年1月3日成功着陆在月球背面的冯·卡门撞击坑内,这是人类历史上第一次在月球背面进行的软着陆任务。
从国家天文台数据网站批量下载科学数据的方法
为什么需要自动化下载程序?
嫦娥工程和天问一号任务的科学数据都可以在月球与行星数据发布系统的官方网站上进行下载,账号用邮箱注册即可,没有特殊要求。科学数据尤其是导航相机、轨道相机的影像数据十分繁多,有上千页上万条数据。
然而,由于网站的设计不是十分的人性化,一次性能够下载的数据非常有限。如果手动下载,那么将会十分浪费时间,嫦娥4号发布的一个月昼的数据都要2个小时的时间去下载。如果只下载特定的一小部分数据还好,否则简直在浪费生命。
有什么方法适合新手操作?
经过一天时间的摸索,终于能够成功自动化下载嫦娥4号任务的导航相机数据。主要是Python+Selenium结合Firfox浏览器实现,主要参考一篇博客,和Selenium官方文档。概括下来分为一下几个步骤:
- 安装Python和Subline Text(编译Python用,也是很好用的txt查看软件)
- 安装Selenium。使用Python的包管理工具pip输入一下安装命令即可:
pip install selenium
- 安装浏览器自动化测试插件,Firefox下载Geckodriver即可,然后配置相应的环境变量。chrome需要下载Chromedrive。不过官方下载网络可能不稳定,有时候可能需要科学上网,可以去第三方下载。
- 检查月球与行星数据发布系统的网页结构。先用浏览器打开网站,然后按F12检查相应的操作按钮代码,为下一步编写自动化浏览器测试程序做准备。
- 编写Python代码,自动化批量下载所需数据: 注意事项:注意在代码执行的时候,把浏览器缩小到一个界面能够显示整个网页内容,不要有一部分在下面没有显示出来需要滚动鼠标,不然在执行click操作的时候,会报错说超出屏幕范围。
批量下载CE4 PCAM数据 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
# 通过模拟控制浏览器的方式进行数据下载
page_n = 90 #下载的页码数量
file_n=0;
browser = webdriver.Firefox() #调用浏览器
browser.get("https://moon.bao.ac.cn/ce5web/searchOrder_dataSearchData.search") #打开数据下载的网址
sleep(40) #sleep的时候,手动登录账号。登录了才能进一步下载数据
for page_i in range(page_n):
# element= browser.find_elements(By.CLASS_NAME, "search-item-title") #解析网页 gridcolumn-1072-triggerEl
elements = browser.find_elements(By.CLASS_NAME, "downloadNow") #查找全部下载按钮
for element_i in elements: #模拟点击全部下载按钮,下载数据,注意浏览器设置为不需要询问下载位置
element_i.click()
file_n=file_n+1
print(file_n)
# sleep(1) # click之后有一定的延迟,这时已经可以进行下一个下载了,不需要sleep
# 1107是CE-4 PCAM的下一页翻页按钮
element= browser.find_element(By.ID, "button-1107-btnIconEl") #下一页
element.click()
sleep(5) #等待刷新网页,加载数据
方法优劣:
好处是,很自动,根本不用管,也不影响对电脑进行其他操作,可以继续搞科研。
缺点是,速度还是比较慢。测试下来,下载嫦娥4号2个月昼共计约900个全景相机文件,运行花费了7000多秒。
是否有其他可以尝试的方法?
- 1.月球与行星数据发布系统可以先将数据加入收藏夹,然后在收藏夹中导出下载链接,最后将链接复制到迅雷等软件中自动化批量下载。这个方法也挺费事。
- 2.先用程序自动化提取下载链接,然后用迅雷下载。
其实下载链接的结构很简单,就是一个头加上文件名,而文件名很容易就可以从网页元素中解析出来,只用Python就可以实现。需要安装BeautifulSoup这个Python工具包,即HTML/XML解析器;或者就用Selenium也可以解析。最后在手动为文件加上下载链接的头部,头部是这样的结构:
https://moon.bao.ac.cn/ce5web/cedownload/CE4ROLL/CE4/PCAML/Q/2B/2023-04/
这里有Selenium提取所有文件名的参考代码:这样的方法虽然快,但是有的链接无法下载,因此不如直接用web控制工具直接批量下载批量提取文件名 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
import numpy as np
# 通过模拟控制浏览器的方式进行数据下载
# 通过下载标题,然后手动填补链接头部。但是有一半以上的文件无法正常下载,这个方法不太奏效
e_all = []
page_n = 90 #页码
page_all = 0
browser = webdriver.Firefox()
browser.get("https://moon.bao.ac.cn/ce5web/searchOrder_dataSearchData.search")
# sleep的时候,手动切换到CE-4界面
sleep(20)
for page_i in range(page_n):
element= browser.find_elements(By.CLASS_NAME, "search-item-title")
for e in element:
print(e.text)
e_all.append(e.text)
page_all=page_all+1
# 下一页, news-title search-item-title
# 1107是CE-4 PCAM的下一页翻页按钮
element= browser.find_element(By.ID, "button-1107-btnIconEl")
element.click()
sleep(8)
np.savetxt('test.txt',e_all,fmt='%s')
print(page_all)
生活不易,您的支持是我最大的动力.