Wikimon.net这是一个由社区维护的数码宝贝维基,但它不提供公共 API,因此网页抓取是提取其可视化列表中结构化数据的最实用方法。在本指南中,您将使用 Requests 和 Beautiful Soup 构建一个可用的 Python 爬虫程序,用于提取数码宝贝名称和图片 URL,然后将结果保存到 CSV 文件或 MySQL 数据库中以供后续使用。

Wikimon是什么?为什么要抓取它的数据?
Wikimon是一个由社区维护的数码宝贝维基网站。它将数码宝贝、其角色、动画、游戏、卡牌以及其他数码宝贝系列相关内容汇集于一处。由于该网站不提供公共API, 刮擦通常来说,这是收集 Wikimon 数据用于研究、分析或个人项目的最实用方法。
最值得抓取的页面之一是 数码宝贝视觉列表它将数码宝贝整理成一个结构化的列表,并附有指向各个页面的链接,这使其成为构建自己的数据集或大规模收集信息的自然起点。
注意:在开始抓取 Wikimon 数据之前,请花几分钟时间阅读其规则,以了解该网站的规定。 robots.txt文件尽量保持合理的请求频率,避免给网站造成流量压力。如果您计划开展大型项目,最好联系网站维护者并尽可能征得他们的许可。这种良好的关系对于确保您的爬虫程序长期稳定运行至关重要。
编写爬虫程序:提取名称和图像 URL
下一步是将你在检查过程中发现的信息转化为可运行的代码。你的爬虫需要完成三件事:抓取页面、解析 HTML 以及遍历每个条目提取名称和图像 URL。
正在获取页面
首先从请求开始。Wikimon 可能无需自定义 User-Agent 即可运行,但设置一个仍然很有必要。它可以在站点日志中识别您的脚本,而且许多其他 MediaWiki 站点会拒绝没有 User-Agent 的请求。
导入请求
from bs4 import BeautifulSoup
from urllib.parse import urljoin
BASE_URL = "https://wikimon.net"
TARGET_URL = f" { BASE_URL } /Visual_List_of_Digimon"
HEADERS = { "User-Agent" : "WikimonScraper/1.0 (个人项目)" }
response = requests.get ( TARGET_URL , headers = HEADERS , timeout = 30 )
response.raise_for_status ( )
soup = BeautifulSoup ( response.text , " html.parser " )
如果 Wikimon 返回404或服务器错误, raise_for_status() 调用 将提前停止脚本 ,这样您就不会解析不存在的页面。
查找条目
视觉列表中的每个数码宝贝都位于各自的小表格中。与其费力寻找可能会更改的表格类别,不如将搜索范围缩小到 MediaWiki 的内容封装层,直接获取图片。
content = soup.select_one ( " div.mw -parser-output " )
images = content.find_all ( " img " )
每个 img 元素同时提供 3 个字段:来自 alt 属性的名称 、来自src 属性 的图像 以及来自 其周围a标签的 wiki 页面链接。
循环遍历并提取
digimon_data = [ ]
seen = set ( )
对于images中的img :
name = ( img . get ( "alt" ) or "" ) . strip ( )
src = img.get ( " src " )
# 防止条目缺少名称或来源
如果名称或来源均为空:
继续
# Wikimon 目前使用占位符表示数码宝贝,尚未添加任何插图。
如果src.lower ( )中包含" noimage " :
继续
# 防止同一数码宝贝出现两次
如果名字在已读:
继续
已查看。添加(名称)
link = img.find_parent ( " a " )
page_url = urljoin ( BASE_URL , link [ "href" ] ) if link and link.get ( " href " ) else None
digimon_data.append ( {
"name" : name ,
"image_url" : urljoin ( BASE_URL , src ) ,
"page_url" : page_url ,
} )
print ( f"提取了{ len ( digimon_data ) }个数码宝贝" )
上面代码中的 ` urljoin()` 函数 处理了一个虽小但很重要的细节。Wikimon 将其图片路径写入为相对 URL,例如*`/images/thumb/2/28/Abbadomon.jpg* /120px-Abbadomon.jpg`。单独使用这个路径是不完整的,因此无法从中下载任何内容。现在,您需要使用 `urljoin()` 函数将其附加到基本 URL,从而获得一个完整的、可用的链接。
运行脚本后,页面上的 1610 个数码宝贝条目中应该会显示第 1591 个:

有些数码宝贝还没有原画。它们都使用一个名为 Digimon_noimage.jpg 的占位符文件,因此循环会跳过它们,这就是为什么你提取的数量略低于总数的原因。
如果返回的计数结果远低于预期,则说明你的选择器可能匹配的是子集而非完整列表。这通常意味着页面结构发生了变化。
获取全尺寸图像
抓取到的URL指向120像素的缩略图。去掉 /thumb/ 部分和尺寸前缀,就得到了原始文件。
def full_size ( thumb_url ) :
如果"/thumb/"不在thumb_url中:
返回thumb_url
return thumb_url.replace ( " / thumb / " , " /").rsplit("/ " , 1 ) [ 0 ]
Wikimon 还为每个缩略图提供了一个 srcset 属性,提供同一张图片的 180px 和 240px 版本。如果您只需要稍大一些的预览图,那么直接读取 srcset 属性 比重写路径要简单得多。
存储抓取的数据:CSV 和数据库选项
目前,你的爬虫程序将所有数据都保存在一个 Python 列表中,脚本停止运行后,该列表就会消失。你需要将提取的数据保存到某个地方,这里有两种切实可行的方案。
保存到 CSV 文件
Python 自带 csv 模块,所以无需额外安装任何软件。只需将以下代码添加到脚本末尾即可:
导入CSV 文件
with open ( "digimon.csv" , "w" , newline = "" , encoding = "utf-8" ) as f :
writer = csv.DictWriter ( f , fieldnames = [ "name" , "image_url" , " page_url " ] )
writer.writeheader ( )
writer.writerows ( digimon_data )
运行它,你就会得到一个 包含你的数码宝贝数据的digimon.csv 文件。
如果你已经安装了 pandas ,那么只需两行代码即可完成同样的工作:
导入pandas as pd
pd.DataFrame ( digimon_data ) .to_csv ( "digimon.csv" , index = False , encoding = " utf - 8" )
除非你想让 pandas 在输出中添加自己的编号列,否则请将index 设置 为 False。
保存到 MySQL 数据库
当你计划查询数据而不仅仅是查看数据时,数据库才有意义。
请先安装连接器:
pip install mysql - connector - python
然后创建数据库和表。您可以在 MySQL shell 中运行此操作,也可以通过 phpMyAdmin 等客户端运行。
id 列会自动递增,因此每行都会获得一个唯一的标识符*,* 无需您自行跟踪。VARCHAR (255) 可以轻松处理数码宝贝名称,而 TEXT 则用于图像 URL,因为它没有长度限制,这很重要,因为 wiki 图像路径可能很长。
现在从 Python 连接并插入您的行:
导入mysql .连接器
conn = mysql.connector.connect (
主机= "localhost" ,
用户= "您的 MYSQL_USER" ,
password = "您的 MySQL 密码" ,
数据库= "数码宝贝数据库"
)
cursor = conn.cursor ( )
查询语句= "INSERT INTO digimon (name, image_url) VALUES (%s, %s)"
rows = [ ( d [ "name" ] , d [ "image_url" ] ) for d in digimon_data ]
cursor.executemany ( query , rows )
conn.commit ( )
print ( f"已插入{ cursor.rowcount }行" )
光标.关闭( )
conn.close ( )
`executemany()` 调用 会一次性插入全部 1591 行数据, `cursor.rowcount` 会告诉你实际插入了多少行。要确认数据确实已写入数据库,你可以打开 MySQL shell 并使用以下命令查询表:
SELECT name , image_url FROM digimon LIMIT 100 ;
您也可以打开 phpMyAdmin,点击 侧边栏中的 digimon_db ,然后点击 digimon 表,您将看到所有 1,591 行数据以网格形式排列:

你应该选哪一个?
如果您只是抓取一次数据、想在电子表格中打开结果,或者只是进行一些实验,那么 CSV 格式是不错的选择。它设置快捷,无需额外的基础设施。
如果您需要按计划重复运行爬虫程序,或者需要按级别或类型等属性筛选数据,又或者计划将此数据与另一个数据集连接,那么 MySQL 是理想之选。此外,数据库还允许您稍后对 名称 列强制执行唯一约束,从而防止重复运行时出现重复数据堆积。
处理分页和扩展爬虫
数码宝贝图鉴虽然只显示在一个页面上,但它并非一个扁平的HTML代码块。Wikimon将其按字母顺序分成A、B、C等几个部分,每个部分都有自己的标题和下方的表格。这种结构让你可以清晰地逐个浏览页面,而不是一次性抓取所有内容。
每个数码宝贝都位于自己独立的小表中,因此单个 `find_next_sibling()` 函数只能找到第一个。你需要不断遍历兄弟姐妹,直到找到下一个标题,就像这样:
for heading in soup.select ( " h2.mw-headline " ) :
letter = heading.get_text ( strip = True )
条目= [ ]
node = heading.find_parent ( " h2 " ) . find_next_sibling ( )
while node and node.name != " h2 " :
entries.extend ( node.select ( " img " ) )
node = node.find_next_sibling ( )
print ( f" { letter } :found { len ( entries ) } entries" )
现在,您的输出将按字母分组返回,如下所示:

这 26 个计数加起来是 1610,与你的主爬虫统计的总数一致。像这样分组有助于在运行过程中出现数据丢失时,找出丢失的数据点。
当你翻到不止一页的时候
可视化列表将所有内容都呈现在一个页面上,但 Wikimon 的分类页面并非如此运作。
打开"数码宝贝"分类,你会看到一次显示 200 条记录,底部有"下一页"链接。你需要翻到下一页,提取所需数据,找到"下一页"链接,然后重复这个过程。当没有"下一页"链接时,就完成了。
导入时间
next_url = "https://wikimon.net/Category:Digimon"
while next_url :
response = requests.get ( next_url , headers = HEADERS , timeout = 20 )
soup = BeautifulSoup ( response.text , " html.parser " )
for link in soup.select ( " #mw-pages li a " ) :
print ( link.get_text ( strip = True ) )
# 查找"下一页"链接(如果存在)
next_link = soup.find ( "a" , string = "下一页" )
next_url = "https://wikimon.net" + next_link [ "href" ] if next_link else None
time.sleep ( 2 ) #在请求之间保持礼貌
运行程序后,你会看到数码宝贝的名字一页一页地打印出来,循环会逐批地遍历该类别,直到没有"下一页"链接为止:

time.sleep(2) 这 行代码有助于在请求之间创建两秒的延迟,以使爬虫程序更加合乎道德,并防止 IP 地址被屏蔽。
单机刮刀在哪里发生故障
一个业余爱好者制作的数码宝贝爬虫程序,每两秒抓取一页数据,运行起来应该没问题,直到你决定扩大规模。当你开始抓取所有已提取数码宝贝的属性和进化信息,或者开始每周运行一次时,你会发现你现在正从一个IP地址发送成千上万个请求。这种请求量可能会触发速率限制,最终导致IP被封禁。
你的脚本也不会崩溃;你只会收到 429 响应代码或加载不完整的 HTML,最终得到一个全是空白的 CSV 文件。
你随时可以动态住宅代理这样你的请求看起来就像来自不同的真实 IP 地址。IPFoxy提供动态住宅代理资源支持粘性/每次请求的IP轮换能力,同时还支持按国家地区定位,能够减少因网络环境因素导致抓取数据失败。

最后想说的
现在您已经拥有一个可用的 Wikimon 数据抓取工具,它可以直接从可视化列表中提取结构化的数码宝贝数据,无需 API。它使用 Requests 抓取页面,使用 Beautiful Soup 解析 HTML,并将整理好的数据行写入 CSV 文件或 MySQL 表中,以便您稍后查询。
一旦基本功能实现,您就可以扩展抓取器以捕获其他字段,例如进化路线、阶段、能力或其他适合您项目的详细信息。
如果你只是抓取一个小型数据集,这种方法通常就足够了。但随着项目规模的扩大,管理请求、处理阻塞以及保持抓取工具的可靠性将需要更多的工作。那时,使用 住宅代理或受管理 网络爬虫 API可以帮助您在不改变爬虫核心逻辑的情况下进行扩展。