R语言实现下载网站子目录中含Extract关键词的文件方法
实现方案
目标站点已开启目录索引(你已确认根目录下可见日期格式多级子目录),不需要复杂开发,两种方案可直接落地:
方案1:wget 一行命令搞定(优先推荐)
直接在终端执行对应命令即可,会自动遍历所有日期子目录,定位所有名称含Extract的子目录并下载其全部内容:
wget -r -np -nH --cut-dirs=2 -w 1 -R "index.html*" --accept-regex '.*/[^/]*Extract[^/]*/.*' http://69.64.83.144/~fl/download/
参数说明:
-r:开启递归遍历下载-np:禁止向上爬取父目录,不会下载到download目录外的站点内容-nH:不生成以IP命名的根目录文件夹--cut-dirs=2:本地存储时去掉URL前两层路径(对应~fl/download/),不会生成嵌套的无用目录-w 1:每个请求间隔1秒,避免给站点服务器造成过大压力-R "index.html*":下载完成后自动删除wget拉取的目录索引页文件--accept-regex '.*/[^/]*Extract[^/]*/.*':正则匹配规则,只下载路径中存在「名称含Extract的子目录」下的资源,避免误下载其他路径下文件名带Extract的无关文件
正式下载前,可以先在命令里加
--spider参数,该模式下wget只会遍历链接打印待下载列表,不会实际写文件,你可以先核对筛选出的路径是否全为目标Extract目录内容,确认无误再去掉--spider执行正式下载。
如果站点拦截默认wget请求,追加参数-U "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"模拟浏览器UA即可。
方案2:Python 自定义脚本(灵活可控,适合特殊场景)
如果wget的正则筛选不符合实际目录结构(比如存在多层嵌套、需要不区分大小写匹配等情况),可以写简单Python脚本自定义逻辑,先安装依赖:pip install requests beautifulsoup4
脚本内容:
import os import requests from bs4 import BeautifulSoup from urllib.parse import urljoin, unquote ROOT_URL = "http://69.64.83.144/~fl/download/" SAVE_ROOT = "./download_content" HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"} def download_file(url, save_path): os.makedirs(os.path.dirname(save_path), exist_ok=True) if os.path.exists(save_path): return resp = requests.get(url, headers=HEADERS, timeout=30) resp.raise_for_status() with open(save_path, "wb") as f: f.write(resp.content) print(f"下载完成: {save_path}") def crawl_dir(dir_url, local_base, in_extract_dir=False): resp = requests.get(dir_url, headers=HEADERS, timeout=30) resp.raise_for_status() soup = BeautifulSoup(resp.text, "html.parser") for link in soup.find_all("a"): href = link.get("href") if not href or href.startswith("?") or href.startswith("/") or href == "../": continue full_url = urljoin(dir_url, href) rel_path = unquote(href) local_path = os.path.join(local_base, rel_path) if href.endswith("/"): dir_name = rel_path.rstrip("/") # 需要不区分大小写匹配的话,把下一行改成 now_in_extract = in_extract_dir or "extract" in dir_name.lower() now_in_extract = in_extract_dir or "Extract" in dir_name if now_in_extract and not in_extract_dir: print(f"找到目标目录: {full_url}") crawl_dir(full_url, local_path, now_in_extract) else: if in_extract_dir: download_file(full_url, local_path) if __name__ == "__main__": os.makedirs(SAVE_ROOT, exist_ok=True) crawl_dir(ROOT_URL, SAVE_ROOT)
脚本逻辑为从根目录逐层遍历,碰到目录名含Extract的子目录就标记该目录下所有内容为待下载资源,自动保存到本地对应路径,不会下载无关目录内容。
注意事项
- 第一次运行先小范围测试,确认路径筛选逻辑正确再全量执行,避免下载大量无关文件
- 不要开过高并发,个人站点带宽有限,1秒/次的请求频率比较合理,避免被站点封IP
- 如果下载中断,重新运行相同命令/脚本即可,两种方式都会自动跳过已下载完成的文件,支持断点续跑
内容的提问来源于stack exchange,提问作者sd3184
相关产品推荐
相关产品推荐

