项目介绍
前几天受师兄所托,批量下载GOCI数据,本以为会比较简单,结果还是颇费了一些功夫。
思路:用Python爬取GOCI数据下载链接,然后导入下载器进行下载。
改进:后来发现python中有一个wget模块可以直接来下载数据
下载链接爬取:
代码比较简单,不多说,直接上代码:
# -*- coding: utf-8 -*-
# Python 3.6.6
# 模块:requests,re,BeautifulSoup
import requests,re
from bs4 import BeautifulSoup as bs
START_URL = 'https://oceandata.sci.gsfc.nasa.gov/GOCI/L2/' #level 0
BASE_URL = 'https://oceandata.sci.gsfc.nasa.gov'
START_TIME = 2011
END_TIME = 2019
def Get_level1(url): #https://oceandata.sci.gsfc.nasa.gov/GOCI/L2/2011/
resp = requests.get(url)
pattern = r'<td><a href=\'(.*?)\'>'
url_list = re.findall(pattern,resp.text)
return url_list
def Get_download_url(url_list,file):
for url in url_list:
url = BASE_URL + url
resp = requests.get(url)
pattern = r'<td><a href=\'(.*?)\'>'
down_url_list = re.findall(pattern,resp.text) #用正则提取下载地址
for down_url in down_url_list:
text = down_url + '\n'
print(text)
file.write(text)
file.flush()
if __name__=='__main__':
for year in range(START_TIME,END_TIME):
#每一年的下载链接存为一个文件
filename = 'GOCI_L2_' + str(year) + '.txt'
file = open(filename,'w')
url = START_URL + str(year)
url_list = Get_level1(url)
Get_download_url(url_list,file)
file.close()
下载器选择
首先选择的IDM,但文件死活下载不了,弃之;
接下来使用的是FDM,连接成功,下载成功,但为什么改不了同时下载数,我把同时最大下载数都改为1了,结果每次还是一大把文件同时下载,果然不一会IP就被封了;
最后选了BitComet作为下载器,限制同时下载数为2,可。
Python中下载
后来发现了一个wget的第三方模块,可以直接在Python中下载文件。
# -*- coding: utf-8 -*-
# Python 3.6.6
# 模块:time,os,wget
import time,os,wget
filename='GOCI_L2_2012.txt'
#读取下载地址
def get_d_urls(filename):
d_urls = []
with open(filename,'r',encoding='utf-8') as f:
for line in f:
line = line.replace('\n','')
d_urls.append(line)
return d_urls
#下载文件
def get_file(d_url):
name = d_url.split('/')[-1]
if os.path.exists(name):
return 0
print(time.ctime(),": ", name)
wget.download(d_url)
return 1
if __name__=="__main__":
d_urls = get_d_urls(filename)
for d_url in d_urls:
try:
res = get_file(d_url)
except:
continue
新的问题
虽然已经限制了同时下载数,但是每隔两个小时还是会下载不动,需要停个十多分钟才能继续下载。索性学校提供有两个WIFI,只要换个WIFI,IP地址改变后,就可以继续下载。白天还可以手动更改WIFI,但到晚上就比较麻烦了,这里写了个脚本,自动更改WIFI,代码如下:
import os,time
cmd1 = 'netsh wlan connect ssid=eduroam name=eduroam interface="WLAN 3"'
cmd2 = 'netsh wlan connect ssid=ustcnet name=ustcnet interface="WLAN 3"'
Time_Interval1 = 7200
Time_Interval2 = 1200
while True:
time.sleep(Time_Interval1)
os.system(cmd1)
print("EDUROAM:",time.ctime())
time.sleep(Time_Interval2)
os.system(cmd2)
print("USTCNET:",time.ctime())
具体可参考这篇博文:让电脑定时重新连接WIFI的windows脚本
其中ustcnet可以达到10~20M/s,eduroam平均速度在3M/s,所以主要连接ustcnet,两个小时后连接eduroam,再20分钟后换回ustcnet。这样的话平均速度差不多能达到8M/s。