如何用通配符下载域名下非指定URL图片?含807只宝可梦图片批量需求
嘿,很高兴能帮你解决这两个问题!咱们一步步来拆解:
关于通配符批量下载域名下图片的可行性
简单来说:如果目标图片的URL有清晰可遵循的规律(比如固定前缀+递增编号+固定后缀),通配符配合命令行工具(如wget、curl)确实能实现批量下载;但如果URL完全无规律(比如Bulbapedia图片里的随机存储路径),通配符就派不上用场了,这时候需要用爬虫先抓取页面中的图片链接,再批量下载。
举个通配符能用的例子:如果图片URL是https://example.com/pics/animal{001..100}.png,你可以直接在终端运行:
wget https://example.com/pics/animal{001..100}.png
就能一次性下载100张图片。
批量下载Bulbapedia上807只宝可梦展示图片的具体方法
你观察到的URL规律很关键,但要注意:/upload/xx/xx/这部分是图片的随机存储路径,没办法直接通过编号+名字拼接出来,所以需要用爬虫先获取每个宝可梦页面的正确图片链接,再批量下载。下面给你两种实用方案:
方案1:Python爬虫(灵活可控,推荐)
用requests+BeautifulSoup可以轻松实现,步骤是:先抓取宝可梦的英文名列表,再遍历每个宝可梦页面获取图片URL,最后下载保存。
import requests from bs4 import BeautifulSoup import os # 创建图片保存目录 save_folder = "pokemon_images" if not os.path.exists(save_folder): os.makedirs(save_folder) # 第一步:从宝可梦编号列表页抓取807只宝可梦的英文名 list_page_url = "https://bulbapedia.bulbagarden.net/wiki/List_of_Pokémon_by_National_Pokédex_number" list_response = requests.get(list_page_url) list_soup = BeautifulSoup(list_response.text, "html.parser") # 提取表格中的英文名(跳过表头,取前807行) pokemon_name_list = [] table_rows = list_soup.select("table.roundy tr")[1:808] for row in table_rows: name_link = row.select_one("td:nth-child(2) a") if name_link: pokemon_name_list.append(name_link.text) # 第二步:遍历每个宝可梦页面,下载展示图片 for idx, pokemon_name in enumerate(pokemon_name_list): dex_num = idx + 1 dex_num_str = f"{dex_num:03d}" pokemon_page_url = f"https://bulbapedia.bulbagarden.net/wiki/{pokemon_name}_Pokémon)" try: # 获取页面内容 page_response = requests.get(pokemon_page_url) page_response.raise_for_status() page_soup = BeautifulSoup(page_response.text, "html.parser") # 找到信息框里的展示图片 display_img = page_soup.select_one(".infobox img") if display_img and "src" in display_img.attrs: img_url = display_img["src"] # 补全相对路径为完整URL if not img_url.startswith("http"): img_url = f"https:{img_url}" # 下载并保存图片 img_response = requests.get(img_url) img_response.raise_for_status() save_path = os.path.join(save_folder, f"{dex_num_str}{pokemon_name}.png") with open(save_path, "wb") as img_file: img_file.write(img_response.content) print(f"✅ 已下载:{save_path}") else: print(f"⚠️ 未找到{dex_num_str}{pokemon_name}的展示图片") except Exception as e: print(f"❌ 下载{dex_num_str}{pokemon_name}时出错:{str(e)}")
方案2:命令行工具(适合不想写代码的情况)
如果你不想写Python脚本,可以用wget配合一些网页抓取工具(比如lynx)来提取图片链接,再批量下载。比如:
- 先抓取宝可梦列表页的所有页面链接:
lynx -dump "https://bulbapedia.bulbagarden.net/wiki/List_of_Pokémon_by_National_Pokédex_number" | grep "(Pokémon)" | cut -d " " -f 2 > pokemon_links.txt
- 遍历每个链接,提取图片URL并下载:
while read link; do img_url=$(lynx -dump "$link" | grep "cdn.bulbagarden.net/upload" | head -1) if [ ! -z "$img_url" ]; then wget -P pokemon_images "$img_url" fi done < pokemon_links.txt
不过这种方法稳定性稍差,遇到页面结构变化可能会失效,不如Python方案灵活。
内容的提问来源于stack exchange,提问作者Skylar Kennedy
相关产品推荐
相关产品推荐

