文章目录
- Part.I Introduction
- Chap.I 预备知识
- Chap.II URL
- Part.II 下载的方式
- Chap.I Python
- Chap.II Wget
- Chap.III Curl
- Reference
Part.I Introduction
用浏览器下载东西需要一个一个点击,当需要批量下载的时候,这样操作不免有些繁琐。本文整理了常用的一些指令,可以很方便地实现批量下载、多线程下载等提高生产效率。
下面是笔者的使用体会
- curl 最好用
- Windows 下就用 python 即可,没必要配置 curl 环境
- UNIX 下可以使用 curl / wget
Chap.I 预备知识
下面是一些概念汇编
- HTTP(HyperText Transfer Protocol),即超文本传输协议。浏览网页时在浏览器地址栏中输入的URL前面都是以
http://
开始的。HTTP 定义了信息如何被格式化、如何被传输,以及在各种命令下服务器和浏览器所采取的响应。端口号80
- HTTPS(Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版。即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。端口号
443
- TCP(Transmission Control Protocol)是传输控制协议,HTTP 是应用协议。端口号有好多。
- FTP(File Transfer Protocol)即文件传输协议。端口号
21
Chap.II URL
URL(Uniform Resource Locator),即统一资源定位符。URL 无非就是一个给定的独特资源在 Web 上的地址。理论上说,每个有效的 URL 都指向一个唯一的资源。这个资源可以是一个 HTML 页面,一个 CSS 文档,一幅图像,等等。URL 的格式一般为
scheme://domain_name[:port]/[path/file_name]
- 其中
scheme
表示协议名,常见的有 https, http, ftp, gopher, telnet 等等;笔者目前接触到的也只有前三个。 domain_name
表示域名,也可以是ip
;port
表示端口号,一般可以省略- 下面几个很好理解啦~
- 除了上面所说的几个元素外,URL 很多情况下还包含参数(Parameters,
?
后面的东西)、锚点(Anchor,#
后面的东西),有关内容可参看Ref.1
。
Part.II 下载的方式
通过指令下载文件的方式有很多,不同方式有不同的特点,下面针对笔者常用的几种方式做一个简要的介绍。首先是汇总的表格
Method | source Support | System | 备注 |
---|---|---|---|
Python requests | HTTP | WIN / UNIX | 支持分块下载,当下载大文件时可以避免内存被超量占用。 |
Python wget | HTTP / FTP 匿名 | WIN / UNIX | 注意和 wget 区分 |
Python urllib | HTTP / FTP 匿名 | WIN / UNIX | 内置库,不需额外安装 |
Python ftplib | FTP 用户名 | WIN / UNIX | 内置库,不需额外安装 |
WIN wget | HTTP / FTP | WIN | 下载二进制的 GUN wget |
wget | HTTP / FTP | WIN / UNIX | 注意安装 wget |
curl | HTTP / FTP | WIN / UNIX | 注意配置环境 |
注:
- python 和 curl 都是一种脚本语言,只要在操作系统中配置了相应的环境,就可以用。
- GNU wget 既有 UNIX 版本,也有 Windows 版本,只要下载就可以调用相应的指令。
下面每个部分会介绍每种方法是如何使用的。在介绍这些指令如何使用的过程中,示例就是下载这样几个文件(很容易看出来笔者是搞 GNSS 的):
- HTTP:
https://datacenter.iers.org/products/eop/rapid/daily/finals2000A.daily
- FTP:
ftp://igs.gnsswhu.cn/pub/gps/data/daily/2021/brdc/BRDC00IGS_R_20210010000_01D_MN.rnx.gz
- FTP:
ftp://igs.gnsswhu.cn/pub/whu/phasebias/Readme.txt
Chap.I Python
用 Python 下载文件有很多种方式,比如:requests,wget,urllib,ftplib 等等,下面分别加以介绍。
requests ,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。 它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。它是 Pyhton 的三方库,没有安装需要首先 pip install requests
。当下载的文件比较大时,可以分块下载避免内存不足。下面是分块下载的实现并且显示了下载进度:
import os
import time
import requests
from contextlib import closing
def requests_download(url, outPath = ''):
"""
Wget download file.
> @param[in] url: the source
> @param[in] outPath: output filepath
return:
< @param[out] void
"""
tmp = os.path.split(url)
fname = tmp[1]
if len(outPath) != 0:
fname = outPath + '\\' + fname
start_time = time.time() # begin Time
with closing(requests.get(url, stream=True)) as response:
chunk_size = 1024 # MaxSize of Single request
content_size = int(response.headers['content-length']) # The total size
data_count = 0
with open(fname, "wb") as file:
for data in response.iter_content(chunk_size=chunk_size):
file.write(data)
data_count = data_count + len(data)
now_jd = (data_count / content_size) * 100
speed = data_count / 1024 / (time.time() - start_time)
print("\r Download Progress: %03d%% (%d/%d)KB Speed: %dKB/s - %s"
% (now_jd, data_count / 1024, content_size / 1024,
speed, fname), end="")
return 0
wget ,它是 Pyhton 的三方库,没有安装需要首先 pip install wget
。虽然它和 Linux 下的 wget
是一个名字,但是此 wget
非彼 wget
。
import wget
wget.download(url, out=None, bar=bar_adaptive) # 函数声明
wget 有三个参数:
url
:下载源,可以是 HTTP 也可以是 FTPout
:下载后保存的文件路径,可以通过它来指定下载的位置和名称;默认保存在当前工作目录bar_adaptive
:下载进度条样式
def wget_download(url, outPath = ''):
"""
Wget download file.
> @param[in] url: the source
> @param[in] outPath: output filepath
return:
< @param[out] void
"""
fname = wget.filename_from_url(url) # get fileName
if len(outPath) != 0:
fname = outPath + '\\' + fname
wget.download(url, out = fname)
return 0
上面是笔者编写的小函数,可以讲下载的文件保存在指定的目录下,文件名保持不变。
urllib ,它是 Python 内置的库,所以不用安装一看就是下载 http 的。其使用比较简单,下面是一个小函数
import os
import urllib
def urllib_download(url, outPath = ''):
"""
Wget download file.
> @param[in] url: the source
> @param[in] outPath: output filepath
return:
< @param[out] void
"""
tmp = os.path.split(url)
fname = tmp[1] # get fileName
if len(outPath) != 0:
fname = outPath + '\\' + fname
urllib.request.urlretrieve(url, fname)
return 0
ftplib ,它是 Python 内置的库,所以不用安装一看就是下载 ftp 的。其使用略微复杂一点,因为 FTP 大部分需要登陆才可以有访问权限。下面是根据一个大佬的脚本(Ref.2
)做的修改:
import ftplib
def _ftpconnect(host, username, password):
ftp = FTP()
ftp.connect(host, 21)
ftp.login(username, password)
return ftp
def _downloadfile(ftp, remotepath, localpath):
bufsize = 1024
fp = open(localpath, 'wb')
ftp.retrbinary('RETR'+remotepath, fp.write, bufsize)
ftp.set_debuglevel(0)
fp.close()
def _uploadfile(ftp, remotepath, localpath):
bufsize = 1024
fp = open(localpath, 'rb')
ftp.storbinary('STOR'+remotepath, fp, bufsize)
ftp.set_debuglevel(0)
fp.close()
def ftp_download_usr(host, username, password, remotepath, localpath):
"""
Wget download file.
> @param[in] host: IP address
> @param[in] username: user name
> @param[in] password: password
> @param[in] remotepath: remote filePath
> @param[in] localpath: local filePath
return:
< @param[out] void
"""
ftp = _ftpconnect(host, username, password)
_downloadfile(ftp, remotepath, localpath)
ftp.quit()
return 0
def ftp_upload_usr(host, username, password, remotepath, localpath):
"""
Wget download file.
> @param[in] host: IP address
> @param[in] username: user name
> @param[in] password: password
> @param[in] remotepath: remote filePath
> @param[in] localpath: local filePath
return:
< @param[out] void
"""
ftp = _ftpconnect(host, username, password)
_uploadfile(ftp, remotepath, localpath)
ftp.quit()
return 0
Chap.II Wget
wget 在 Linux 系统下最为常见,但是在 Windows 中也有相应的 wget,需要下载。
WIN wget
- 戳我下载;现在最新版本是
1.21.3
,下载zip
即可,安装到一个合适的目录; - 右键『此电脑』(计算机)→属性→右边『高级系统设置』→环境变量→系统变量→path 编辑;把
wget.exe
所在目录加进去。 - 打开
cmd
,输入wget -V
看看是否安装成功
UNIX wget ,调用指令安装
apt-get install wget -y
wget --version # 检查是否安装成功
关于wget
的使用,可以参考Ref.3&4
,下面举个例子:
wget ftp://igs.gnsswhu.cn/pub/whu/phasebias/Readme.txt
Chap.III Curl
curl 是一种脚本语言,第一接触到它是在大四,当时师兄的一个下文件的脚本就是用它写的;然后本来还想好好学习一些这种语言的语法,后来事情很多,被搁置了。
关于wget
的使用,可以参考Ref.5
,下面举个例子:
curl [option] [url] # syntax
# 将网页另存为 tmp.xml
curl https://datacenter.iers.org/products/eop/rapid/daily >> tmp.xml
# 下载 http 中的文件
curl -O https://datacenter.iers.org/products/eop/rapid/daily/finals2000A.daily
# 下载可匿名访问的 ftp 中的文件
curl -O ftp://igs.gnsswhu.cn/pub/gps/data/daily/2021/brdc/BRDC00IGS_R_20210010000_01D_MN.rnx.gz
# 通过用户名和密码下载 FTP 文件
curl -O ftp://usr:password@www.linux.com/dodo1.JPG
# ------------ 复杂的操作 - 需要 cookies 和用户名密码的;
# -c 操作结束后把cookie写入到这个文件中
# -b cookie字符串或文件读取位置
# -n 从netrc文件中读取用户名和密码
# -L 列出ftp目录下的文件名称
# -O 把输出写到该文件中,保留远程文件的文件名
curl -c .urs_cookies -b .urs_cookies -n -L https://files.igs.org/pub/station/general/igs14.atx -O
# -------------------
Reference
- 什么是 URL
- python ftplib模块下载FTP文件
- GNU Wget 1.21.1-dirty Manual
- Wget Options
- Linux curl 命令下载文件