博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 遍历网页目录并下载满足条件的文件
阅读量:4229 次
发布时间:2019-05-26

本文共 8387 字,大约阅读时间需要 27 分钟。

标题有点夸张,我最终的目的其实是:用 Python 从指定网页下载 centos7.6.1810 所有 src.rpm 源码包(我找过 centos 的镜像,都无一例外没有源码包目录,感觉很不人性化,而且网页上的源码文件也没有统一在一个目录下,手动下载那么多源码包好像也不太现实。不像 openEuler 至少还有个  源码包镜像地址的链接)。

这也是事情的起因。哈哈,这个主题可能不具有普适性(我应该也打上一个 自家用 的标签才好 ^_^),不过刚好是我最近遇到的其中一个问题,于是乎索性写一写罢了。

我能得到的起始的 url 地址是这个:http://mirror.nsc.liu.se/centos-store/7.6.1810/ 。用浏览器打开是下面这丫的样子(可以看到左下角有个 lighttpd 的字样,所以想来应该和 nginx 索引目录列表提供用户下载文件的原理差不多)

程序遍历

所以从这个目录开始,我开始递归往下寻找并下载我需要的 *.src.rpm 源码包文件(效率不是太高,深感惭愧)。

import osimport reimport requestsdef load_url_data(url):    """    从url页面中提取并下载 src.rpm 源码包    """    r = requests.get(url)    raw_list = re.compile(r'
(.*?)').finditer(r.text.strip()) for i in raw_list: x = i.group(1) if x.endswith('.src.rpm'): # src_rpm = os.path.join(url, x) # 没使用 os.path.join 是因为在 Windows 环境下拼接的路径有问题 src_rpm = '/'.join([url, x]) print(src_rpm) if not os.path.exists(x): os.system('wget %s' % src_rpm) else: print('already downloaded %s' % x) elif '.' in x or 'x86_64' in x: # 由于对所有除了 .src.rpm 的其他文件我都不关心,所以直接略过 # x86_64 这个目录主要是放二进制包,我不太需要,所以碰到以后直接略过 pass else: sub_url = '/'.join([url, x]) print(f'scanning {sub_url} ...') load_url_data(sub_url)if __name__ == '__main__': # centos_url = 'https://vault.centos.org/7.6.1810/' centos_url = 'http://mirror.nsc.liu.se/centos-store/7.6.1810/' load_url_data(centos_url)

输出类似于下面这种(单个下载还容易卡住,可能和网速也有一些关系):

[root@localhost centos7.1810_src_packages]# python3 test.py scanning http://mirror.nsc.liu.se/centos-store/7.6.1810//atomic ...scanning http://mirror.nsc.liu.se/centos-store/7.6.1810//atomic/Source ...scanning http://mirror.nsc.liu.se/centos-store/7.6.1810//centosplus ...scanning http://mirror.nsc.liu.se/centos-store/7.6.1810//centosplus/Source ...scanning http://mirror.nsc.liu.se/centos-store/7.6.1810//centosplus/Source/SPackages ...http://mirror.nsc.liu.se/centos-store/7.6.1810//centosplus/Source/SPackages/kernel-plus-3.10.0-957.1.3.el7.centos.plus.src.rpm--2021-03-30 16:52:16--  http://mirror.nsc.liu.se/centos-store/7.6.1810//centosplus/Source/SPackages/kernel-plus-3.10.0-957.1.3.el7.centos.plus.src.rpmResolving mirror.nsc.liu.se (mirror.nsc.liu.se)... 130.236.101.92, 2001:6b0:17:2::1:92Connecting to mirror.nsc.liu.se (mirror.nsc.liu.se)|130.236.101.92|:80... connected.HTTP request sent, awaiting response... 200 OKLength: 100898069 (96M) [application/x-rpm]Saving to: ‘kernel-plus-3.10.0-957.1.3.el7.centos.plus.src.rpm’kernel-plus-3.10.0-957.1.3.el7.centos.pl 100%[==================================================================================>]  96.22M  5.23MB/s    in 21s     2021-03-30 16:52:37 (4.66 MB/s) - ‘kernel-plus-3.10.0-957.1.3.el7.centos.plus.src.rpm’ saved [100898069/100898069]http://mirror.nsc.liu.se/centos-store/7.6.1810//centosplus/Source/SPackages/kernel-plus-3.10.0-957.10.1.el7.centos.plus.src.rpm--2021-03-30 16:52:37--  http://mirror.nsc.liu.se/centos-store/7.6.1810//centosplus/Source/SPackages/kernel-plus-3.10.0-957.10.1.el7.centos.plus.src.rpmResolving mirror.nsc.liu.se (mirror.nsc.liu.se)... 130.236.101.92, 2001:6b0:17:2::1:92Connecting to mirror.nsc.liu.se (mirror.nsc.liu.se)|130.236.101.92|:80... connected.HTTP request sent, awaiting response... 200 OKLength: 100922887 (96M) [application/x-rpm]Saving to: ‘kernel-plus-3.10.0-957.10.1.el7.centos.plus.src.rpm’kernel-plus-3.10.0-957.10.1.el7.centos.p 100%[==================================================================================>]  96.25M  8.52MB/s    in 34s     2021-03-30 16:53:12 (2.82 MB/s) - ‘kernel-plus-3.10.0-957.10.1.el7.centos.plus.src.rpm’ saved [100922887/100922887]...

部分下载结果(还没全部下载完的):

[root@localhost centos7.1810_src_packages]# lltotal 998M-rw-r--r--. 1 root root 4.1M Sep  1  2017 ansible-2.3.0.0-3.el7.src.rpm-rw-r--r--. 1 root root 274K Feb 23  2017 apiextractor-0.10.10-11.el7.src.rpm-rw-r--r--. 1 root root 6.6M Feb 23  2017 babel-2.3.4-1.el7.src.rpm-rw-r--r--. 1 root root 764K Feb 23  2017 bakefile-0.2.9-2.el7.src.rpm-rw-r--r--. 1 root root  72K Feb 23  2017 bandit-0.13.2-1.el7.src.rpm-rw-r--r--. 1 root root 615K Sep  1  2017 blosc-1.11.1-3.el7.src.rpm-rw-r--r--. 1 root root  68M Feb 23  2017 boost159-1.59.0-2.el7.src.rpm-rw-r--r--. 1 root root 1.4M Feb 23  2017 coin-or-Cbc-2.9.8-1.el7.src.rpm-rw-r--r--. 1 root root 953K Feb 23  2017 coin-or-Cgl-0.59.9-1.el7.src.rpm-rw-r--r--. 1 root root 1.9M Feb 23  2017 coin-or-Clp-1.16.10-1.el7.src.rpm-rw-r--r--. 1 root root 965K Feb 23  2017 coin-or-CoinUtils-2.10.13-1.el7.src.rpm-rw-r--r--. 1 root root 736K Feb 23  2017 coin-or-Osi-0.107.8-1.el7.src.rpm-rw-r--r--. 1 root root 350K Feb 23  2017 coin-or-Sample-1.2.10-5.el7.src.rpm-rw-r--r--. 1 root root 476K Feb 23  2017 conntrack-tools-1.4.2-3.el7.src.rpm...

lftp mirror 命令

用 lftp http://mirror.nsc.liu.se/centos-store/7.6.1810/ 命令好像也可以进去(不过这命令用得不多,很尴尬,后面再来研究一下它,说不定有奇效)。

[root@localhost ttt]# lftp http://mirror.nsc.liu.se/centos-store/7.6.1810/cd ok, cwd=/centos-store/7.6.1810                                     lftp mirror.nsc.liu.se:/centos-store/7.6.1810> lsdrwxr-xr-x  --  ..                   drwxr-xr-x               2018-11-29 00:58  atomicdrwxr-xr-x               2018-11-29 16:54  centosplusdrwxr-xr-x               2018-11-28 23:59  clouddrwxr-xr-x               2018-11-29 00:59  configmanagementdrwxr-xr-x               2018-12-02 15:34  crdrwxr-xr-x               2017-09-29 14:33  dotnetdrwxr-xr-x               2018-11-29 16:55  extrasdrwxr-xr-x               2017-09-01 13:08  fasttrackdrwxr-xr-x               2018-11-27 09:05  isosdrwxr-xr-x               2018-11-29 00:59  nfvdrwxr-xr-x               2018-11-29 00:59  opstoolsdrwxr-xr-x               2018-12-10 22:51  osdrwxr-xr-x               2018-11-29 00:58  paasdrwxr-xr-x               2017-02-10 22:18  rtdrwxr-xr-x               2018-11-29 00:56  sclodrwxr-xr-x               2018-11-29 00:58  storagedrwxr-xr-x               2018-11-29 16:57  updatesdrwxr-xr-x               2018-11-29 00:58  virt

后来发现 lftp 好像还真有奇效,用 lftp 的 mirror 命令可以直接把整个需要的目录下载下来,。

lftp mirror.nsc.liu.se:/centos-store/7.6.1810> mirror centosplus/Source/SPackages/ centosplus`kernel-plus-3.10.0-957.12.1.el7.centos.plus.src.rpm' at 9113483 (9%) 601.2K/s eta:2m [Receiving data]
[root@localhost ttt]# cd centosplus/[root@localhost centosplus]# lskernel-plus-3.10.0-957.10.1.el7.centos.plus.src.rpm  kernel-plus-3.10.0-957.12.1.el7.centos.plus.src.rpm  kernel-plus-3.10.0-957.1.3.el7.centos.plus.src.rpm[root@localhost centosplus]# lltotal 246M-rw-r--r--. 1 root root 97M Mar 19  2019 kernel-plus-3.10.0-957.10.1.el7.centos.plus.src.rpm-rw-r--r--. 1 root root 54M Mar 31 09:39 kernel-plus-3.10.0-957.12.1.el7.centos.plus.src.rpm-rw-r--r--. 1 root root 97M Dec  4  2018 kernel-plus-3.10.0-957.1.3.el7.centos.plus.src.rpm

wget

不过说到下载整个 http 目录,wget 其实也是可以做到的(而且中断下载后再次下载不会重复下载已经下载过的文件)。

wget -c -r -np -k -L -p http://mirror.nsc.liu.se/centos-store/7.6.1810/

wget -c -r -np -k -L -p http://mirror.nsc.liu.se/centos-store/7.6.1810/ 

-c 断点续传-r 递归下载,默认深度是5层,可以通过-l参数指定depth。-np --no-parent 递归下载时不访问父级目录,能够有效的控制下载范围。-nd 递归下载时不会递归创建目录,会把所有的文件保存到一个目录里。-k 转换下载网页中的链接,如果下载了链接资源,会转换成相对路径,如果链接是外部资源或者没下载,就会转换成绝对路径。好处是下载后可以脱机浏览,是个比较有用的参数。-L 递归下载时只取同一主机下的相对资源。-p 下载遍历到的网页中所有的文件资源,保证超过深度限制的资源被下载。-P 指定下载目录

执行后 wget 会创建一个该网站名称的目录保存递归下载的全部文件。这种下载的方式的好处是保持原有目录结构,条理清晰。

[root@localhost ttt]# wget -c -r -np -k -L -p http://mirror.nsc.liu.se/centos-store/7.6.1810/ --2021-03-31 10:43:39--  http://mirror.nsc.liu.se/centos-store/7.6.1810/Resolving mirror.nsc.liu.se (mirror.nsc.liu.se)... 130.236.101.92, 2001:6b0:17:2::1:92Connecting to mirror.nsc.liu.se (mirror.nsc.liu.se)|130.236.101.92|:80... connected.HTTP request sent, awaiting response... 200 OKLength: 9009 (8.8K) [text/html]Saving to: ‘mirror.nsc.liu.se/centos-store/7.6.1810/index.html’mirror.nsc.liu.se/centos-store/7.6.1810/ 100%[==================================================================================>]   8.80K  --.-KB/s    in 0s  ...
[root@localhost 7.6.1810]# pwd/root/lukaiyi/ttt/mirror.nsc.liu.se/centos-store/7.6.1810[root@localhost 7.6.1810]# lsatomic  centosplus  cloud  configmanagement  cr  dotnet  extras  fasttrack  index.html  isos  nfv  opstools  os  paas  rt  sclo  storage  updates  virt

lftp mirror 和 wget 命令下载都是会保持目录结构的,而我主要是想将所有的 .src.rpm 文件全部放在同一个目录下(没有嵌套目录),所以还是老老实实的自己写个蹩脚的脚本试试了。

转载地址:http://oijqi.baihongyu.com/

你可能感兴趣的文章
内核态与用户态
查看>>
趣链 BitXHub跨链平台 (4)跨链网关“初介绍”
查看>>
九度OJ 1091:棋盘游戏 (DP、BFS、DFS、剪枝)
查看>>
Openfiler 配置 NFS 示例
查看>>
Oracle 11.2.0.1 RAC GRID 无法启动 : Oracle High Availability Services startup failed
查看>>
Oracle 18c 单实例安装手册 详细截图版
查看>>
Oracle Linux 6.1 + Oracle 11.2.0.1 RAC + RAW 安装文档
查看>>
Oracle 11g 新特性 -- Online Patching (Hot Patching 热补丁)说明
查看>>
Oracle 11g 新特性 -- ASM 增强 说明
查看>>
Oracle 11g 新特性 -- Database Replay (重演) 说明
查看>>
Oracle 11g 新特性 -- 自动诊断资料档案库(ADR) 说明
查看>>
CSDN博客之星 投票说明
查看>>
Oracle wallet 配置 说明
查看>>
Oracle smon_scn_time 表 说明
查看>>
VBox fdisk 不显示 添加的硬盘 解决方法
查看>>
Java多态性理解
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第一篇:互联网时代U盘化生存方式 【张振华.Jack】
查看>>
CentOS6.4配置Hadoop-2.6.0集群配置安装指南(经过实战演练)【张振华.Jack】
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第二篇:专注的力量 [张振华.Jack]
查看>>
BFS——求矩阵中“块”的个数
查看>>