如何抓取无对应网页的网站目录下的PDF文件?
批量下载Dotlan EVE地图PDF文件的方案
目标目录没有索引页面,但单个PDF可通过「星域名称+.pdf」的格式访问,核心思路是先获取所有EVE星域名称,再批量生成下载链接完成抓取。以下是三种可行方法:
方法一:使用wget命令行工具
- 先收集所有EVE星域名称,保存为
regions.txt文件,每个名称单独占一行(可从Dotlan的星域列表页面提取)。 - 在终端执行以下命令:
参数说明:wget -i regions.txt -B https://evemaps.dotlan.net/pdf/ --content-disposition-i regions.txt:从指定文件读取要下载的星域名称列表-B:指定基础URL,自动将列表中的名称拼接为完整PDF链接--content-disposition:确保文件以正确的星域名称命名保存
方法二:Python脚本(灵活可控)
步骤1:获取星域名称列表
运行以下脚本爬取完整的星域名称:
import requests from bs4 import BeautifulSoup # 从Dotlan星域页面爬取名称列表 resp = requests.get("https://evemaps.dotlan.net/regions") soup = BeautifulSoup(resp.text, "html.parser") regions = [a.text.strip() for a in soup.select("table.regions a")] print(f"共获取到 {len(regions)} 个星域名称")
步骤2:批量下载PDF
使用获取到的列表循环下载每个文件:
import requests import os base_url = "https://evemaps.dotlan.net/pdf/{}.pdf" save_dir = "eve_map_pdfs" # 创建保存目录(不存在则自动创建) os.makedirs(save_dir, exist_ok=True) for region in regions: pdf_url = base_url.format(region) try: # 流式下载避免内存占用过高 resp = requests.get(pdf_url, stream=True) resp.raise_for_status() save_path = os.path.join(save_dir, f"{region}.pdf") with open(save_path, "wb") as f: for chunk in resp.iter_content(chunk_size=8192): f.write(chunk) print(f"已完成:{region}.pdf") except Exception as e: print(f"下载失败 {region}.pdf:{str(e)}")
方法三:浏览器控制台脚本(无需额外工具)
- 打开Dotlan的星域列表页面,按
F12打开开发者工具,切换到「控制台」标签。 - 粘贴以下代码并回车,浏览器会自动触发所有PDF的下载(需允许浏览器的下载弹窗):
// 提取页面上的所有星域名称 const regionNames = Array.from(document.querySelectorAll('table.regions a')).map(el => el.textContent.trim()); const baseUrl = 'https://evemaps.dotlan.net/pdf/{}.pdf'; // 批量生成下载链接并触发下载 regionNames.forEach(name => { const link = document.createElement('a'); link.href = baseUrl.replace('{}', name); link.download = `${name}.pdf`; document.body.appendChild(link); link.click(); document.body.removeChild(link); });
注意事项
- 确保星域名称拼写准确,避免因名称错误导致404
- 不要短时间内发起大量请求,避免触发网站的访问限制
- 部分浏览器可能拦截批量下载,需手动允许弹窗
内容的提问来源于stack exchange,提问作者Garrett Payne
相关产品推荐
相关产品推荐

