使用Python Beautiful Soup爬取BoardGameGeek如何获取桌游详情页唯一ID
唯一ID的定义
这个数字是BGG平台为每款桌游分配的内部唯一标识,通常称为BGGID。你拼接错误ID仍返回200状态码的原因是,平台做了兜底路由逻辑:只要URL路径格式符合/boardgame/[数字]/[任意字符]的规则,不管对应ID的桌游是否存在,都会返回200状态码,加载的是搜索结果页、不存在提示页或者自动重定向到相似内容页,所以你靠状态码判断URL是否有效的逻辑完全不成立。
另外你当前随机生成ID拼接URL的逻辑本身就有问题:就算你蒙对了正确ID,后面拼接的name[0]如果和官方URL里的名称后缀拼写、格式不一致,同样无法进入正确的详情页。
获取对应桌游ID的方法
你不需要随机生成ID,你正在爬的桌游列表页本身就自带所有桌游的完整详情页链接:
- 解析列表页中每个桌游条目对应的
<a>标签的href属性,属性值本身就是类似/boardgame/174430/gloomhaven的相对路径 - 对这个路径字符串按
/分割,取索引为2的分段,就能直接拿到对应桌游的准确BGGID,或者直接用这个相对路径拼接域名得到完整的详情页URL,完全不需要自行构造。
示例解析逻辑:
# 假设你拿到的a标签href属性值为 href_str href_parts = href_str.split('/') bgg_id = href_parts[2] # 直接生成正确的详情页URL correct_url = f"https://boardgamegeek.com{href_str}"
获取玩家人数的替代方案
- 使用官方API获取结构化数据
BGG提供公开的XML API 2接口,你只需要传入拿到的BGGID,就能直接拿到包含玩家人数在内的全量结构化桌游数据,返回结果中直接包含minplayers(最少玩家数)、maxplayers(最多玩家数)字段,不需要解析HTML页面,效率更高也更稳定。 - 直接爬取详情页解析
如果不想调用API,就用从列表页拿到的正确详情页URL挨个发起请求,解析详情页中玩家人数的展示区块即可,不需要自己构造URL。
内容的提问来源于stack exchange,提问作者Maadhav Padmanabhan
相关产品推荐
相关产品推荐

