如何用PyWikiBot统计维基百科页面含前机器人的编辑贡献者?
问题:统计维基百科页面机器人编辑者时遗漏前机器人
我编写了如下PyWikiBot代码,用于统计英文维基百科《Planet_of_the_Apes》页面的机器人编辑贡献者:
import pywikibot import requests import json site = pywikibot.Site("en", "wikipedia") page = pywikibot.Page(site, 'Planet_of_the_Apes') revisions_initial = page.revisions() revisions = list(revisions_initial) bot_contributors_list = [] bot_edits = 0 for Revision in revisions: if Revision.anon == False: user_check = Revision.user.replace(" ", "_") response = requests.get( 'https://en.wikipedia.org/w/api.php?action=query&list=users&ususers=' + user_check + '&usprop=groups&format=json').text response_info = json.loads(response) if 'bot' in response_info['query']['users'][0]['groups']: bot_contributors_list.append(user_check) bot_edits = bot_edits + 1 bot_contributors_set = set(bot_contributors_list)
当前代码返回24个机器人,但实际应包含标注“(Former Bot)”的前机器人,预期总数为31个。需要一个通用方案,让代码适配其他维基百科页面,将前机器人也纳入统计范围。
解决方案
问题根源
原代码仅检查用户当前所属的用户组是否包含bot,但前机器人(Former Bot)的用户组信息里,bot组会被移到**历史用户组(former groups)**中,因此无法被现有逻辑识别。
修改后的代码
import pywikibot def get_bot_contributors(page_title, site_lang="en", site_family="wikipedia"): site = pywikibot.Site(site_lang, site_family) page = pywikibot.Page(site, page_title) # 收集所有非匿名编辑者,去重减少API请求 all_non_anon_users = set() bot_contributors = set() bot_edit_count = 0 for rev in page.revisions(): if not rev.anon: username = rev.user all_non_anon_users.add(username) # 先标记编辑次数,后续统一验证用户身份 bot_edit_count += 1 # 批量验证每个用户是否为机器人(含前机器人) for username in all_non_anon_users: user = pywikibot.User(site, username) # 检查当前组或历史组是否包含bot if 'bot' in user.groups or 'bot' in user.former_groups: bot_contributors.add(username) return bot_contributors, bot_edit_count # 使用示例 page_title = 'Planet_of_the_Apes' bots, edit_count = get_bot_contributors(page_title) print(f"机器人(含前机器人)总数:{len(bots)}") print(f"机器人编辑总次数:{edit_count}")
关键优化点
- 批量去重查询:先收集所有非匿名编辑者并去重,避免重复查询同一用户的信息,提升效率
- 利用PyWikiBot内置方法:通过
pywikibot.User直接获取用户的groups(当前组)和former_groups(历史组),无需手动拼接API请求,减少出错概率 - 通用适配逻辑:函数支持传入不同的页面标题、语言和维基家族,可直接用于其他维基百科页面
内容的提问来源于stack exchange,提问作者Kevin Gonzalez
相关产品推荐
相关产品推荐

