如何利用API或Python代码获取含指定维基百科链接的文章URL?
解决方案
一、基于MediaWiki API的筛选思路
维基百科的MediaWiki API支持精准获取和筛选页面数据,可按以下步骤实现需求:
- 提取目标页面标题:从目标URL中拆分出页面标题(比如从
https://en.wikipedia.org/wiki/Yann_LeCun中得到Yann_LeCun),也可通过API的parse接口自动解析URL获取标题。 - 获取所有反向链接页面:调用
query接口的backlinks参数,批量获取所有指向目标页面的链接列表,这一步类似“What links here”但支持分页获取。 - 筛选正文内的链接:对每个反向链接页面,调用
parse接口获取页面完整HTML,仅检查正文区域(如mw-content-ltr类的div标签内)是否包含指向目标页面的<a>标签,排除侧边栏、参考资料等非正文区域的链接。
二、Python代码实现示例
import requests import time def get_page_title_from_url(url): # 从维基百科URL中提取页面标题 return url.split('/wiki/')[-1] def get_backlinks(page_title, limit=500): # 分页获取所有反向链接页面标题 session = requests.Session() backlinks = [] continue_param = None while True: params = { 'action': 'query', 'list': 'backlinks', 'bltitle': page_title, 'bllimit': limit, 'format': 'json' } if continue_param: params['blcontinue'] = continue_param response = session.get('https://en.wikipedia.org/w/api.php', params=params) data = response.json() backlinks.extend([page['title'] for page in data['query']['backlinks']]) if 'continue' not in data: break continue_param = data['continue']['blcontinue'] time.sleep(1) # 避免触发API频率限制 return backlinks def has_inline_link(page_title, target_title): # 检查页面正文区域是否包含目标链接 session = requests.Session() params = { 'action': 'parse', 'page': page_title, 'prop': 'text', 'format': 'json' } response = session.get('https://en.wikipedia.org/w/api.php', params=params) data = response.json() if 'parse' not in data: return False page_html = data['parse']['text']['*'] # 定位正文区域,排除非正文内容 content_div_start = page_html.find('<div class="mw-content-ltr') if content_div_start == -1: return False content_html = page_html[content_div_start:] # 检查是否存在目标链接 target_link = f'href="/wiki/{target_title}"' return target_link in content_html def get_inline_backlinks(target_url): target_title = get_page_title_from_url(target_url) all_backlinks = get_backlinks(target_title) inline_backlinks = [] for page_title in all_backlinks: if has_inline_link(page_title, target_title): inline_backlinks.append(f'https://en.wikipedia.org/wiki/{page_title}') print(f'找到符合条件的页面:{page_title}') time.sleep(1) # 控制请求频率 return inline_backlinks # 使用示例 if __name__ == '__main__': target_url = 'https://en.wikipedia.org/wiki/Yann_LeCun' result = get_inline_backlinks(target_url) print(f'\n共找到{len(result)}个符合条件的页面:') for url in result: print(url)
代码说明
get_page_title_from_url:快速提取目标页面的标题,用于后续API调用。get_backlinks:分页获取所有反向链接页面,添加延迟避免触发API限制。has_inline_link:仅检查页面正文区域的HTML,确保链接出现在文章正文中,而非侧边栏、参考资料等区域。get_inline_backlinks:整合所有逻辑,返回最终符合条件的页面URL列表。
注意事项
- API频率限制:维基百科API对请求频率有严格限制,必须添加合理延迟,否则可能被临时封禁。
- HTML结构变更:若维基百科调整页面HTML结构(如正文区域的类名),需同步修改代码中的定位逻辑。
- 性能优化:如果反向链接数量极大,可考虑采用异步请求提升效率,但需严格遵守API的请求规则。
内容的提问来源于stack exchange,提问作者zwlayer
相关产品推荐
相关产品推荐

