寻求替代wget的多页面抓取工具(支持镜像及链接转换)
替代wget镜像抓取的工具推荐
以下几种工具/方案可以替代wget的--mirror和--convert-links功能,同时能绕过网站对wget的屏蔽:
1. cURL + Shell脚本组合
既然你已经能用cURL抓取单个页面,可通过简单脚本实现递归抓取与链接转换,完全自定义请求参数(比如修改User-Agent模拟浏览器):
#!/bin/bash # 配置目标网站与存储目录 BASE_URL="https://your-target-site.com" MIRROR_DIR="./site-mirror" mkdir -p "$MIRROR_DIR" cd "$MIRROR_DIR" # 抓取初始页面 curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" -o index.html "$BASE_URL" # 提取相对链接并批量抓取 grep -E 'href="[^"]+"' index.html | sed -E 's/href="([^"]+)"/\1/' | grep -v '^http' | while read -r link; do # 拼接完整URL并抓取 FULL_URL="$BASE_URL/$link" # 创建文件目录(如果需要) mkdir -p "$(dirname "$link")" curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" -o "$link" "$FULL_URL" done # 将页面内的绝对链接转换为本地相对链接 sed -i 's/href="\/\([^"]*\)"/href="\1"/g' *.html
这个方案的优势是轻量、无额外依赖,可根据网站反爬规则灵活调整请求头。
2. httrack
这是一款专门的网站镜像工具,功能与wget的镜像模式高度重合,支持递归抓取、自动转换本地链接,且可自定义请求标识绕过屏蔽:
- 基础镜像命令:
httrack https://your-target-site.com -O ./site-mirror -U "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" -v
参数说明:
-O:指定镜像文件存储目录-U:设置自定义User-Agent,模拟浏览器请求-v:显示抓取进度
httrack还支持设置抓取深度、排除特定文件类型、断点续传等,功能全面,无需自行编写复杂脚本。
3. Python脚本(Requests + BeautifulSoup)
如果你熟悉Python的Requests库,可以编写自定义脚本实现递归抓取与链接转换,完全掌控抓取逻辑,应对复杂反爬场景:
import os import requests from bs4 import BeautifulSoup from urllib.parse import urljoin, urlparse # 配置参数 BASE_URL = "https://your-target-site.com" SAVE_DIR = "./site-mirror" HEADERS = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } crawled_urls = set() os.makedirs(SAVE_DIR, exist_ok=True) def fetch_and_save(url): if url in crawled_urls: return crawled_urls.add(url) # 发送请求 response = requests.get(url, headers=HEADERS) response.raise_for_status() # 解析URL,确定本地存储路径 parsed_url = urlparse(url) file_path = parsed_url.path.lstrip("/") if not file_path: file_path = "index.html" full_save_path = os.path.join(SAVE_DIR, file_path) os.makedirs(os.path.dirname(full_save_path), exist_ok=True) # 转换页面内的链接为本地相对路径 soup = BeautifulSoup(response.text, "html.parser") for tag in soup.find_all(["a", "img", "link", "script"], href=True): original_href = tag["href"] absolute_url = urljoin(url, original_href) if absolute_url.startswith(BASE_URL): # 计算本地相对路径 target_parsed = urlparse(absolute_url) target_path = target_parsed.path.lstrip("/") or "index.html" relative_path = os.path.relpath( os.path.join(SAVE_DIR, target_path), os.path.dirname(full_save_path) ) tag["href"] = relative_path # 保存转换后的页面 with open(full_save_path, "w", encoding="utf-8") as f: f.write(str(soup)) # 递归抓取页面内的其他内部链接 for a_tag in soup.find_all("a", href=True): next_url = urljoin(url, a_tag["href"]) if next_url.startswith(BASE_URL): fetch_and_save(next_url) # 启动抓取 fetch_and_save(BASE_URL)
这个方案适合需要处理复杂反爬(如添加Cookie、使用代理)的场景,可根据需求扩展功能。
内容的提问来源于stack exchange,提问作者Loodle
相关产品推荐
相关产品推荐

