浏览器点击下载太 LOW,如何提高下载操作的逼格?

14 篇文章 21 订阅

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 下载的方式

通过指令下载文件的方式有很多,不同方式有不同的特点,下面针对笔者常用的几种方式做一个简要的介绍。首先是汇总的表格

Methodsource SupportSystem备注
Python requestsHTTPWIN / UNIX支持分块下载,当下载大文件时可以避免内存被超量占用。
Python wgetHTTP / FTP 匿名WIN / UNIX注意和 wget 区分
Python urllibHTTP / FTP 匿名WIN / UNIX内置库,不需额外安装
Python ftplibFTP 用户名WIN / UNIX内置库,不需额外安装
WIN wgetHTTP / FTPWIN下载二进制的 GUN wget
wgetHTTP / FTPWIN / UNIX注意安装 wget
curlHTTP / FTPWIN / 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 也可以是 FTP
  • out:下载后保存的文件路径,可以通过它来指定下载的位置和名称;默认保存在当前工作目录
  • 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

  1. 什么是 URL
  2. python ftplib模块下载FTP文件
  3. GNU Wget 1.21.1-dirty Manual
  4. Wget Options
  5. Linux curl 命令下载文件
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流浪猪头拯救地球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值