You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用API或Python代码获取含指定维基百科链接的文章URL?

解决方案

一、基于MediaWiki API的筛选思路

维基百科的MediaWiki API支持精准获取和筛选页面数据,可按以下步骤实现需求:

  1. 提取目标页面标题:从目标URL中拆分出页面标题(比如从https://en.wikipedia.org/wiki/Yann_LeCun中得到Yann_LeCun),也可通过API的parse接口自动解析URL获取标题。
  2. 获取所有反向链接页面:调用query接口的backlinks参数,批量获取所有指向目标页面的链接列表,这一步类似“What links here”但支持分页获取。
  3. 筛选正文内的链接:对每个反向链接页面,调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 14:10:35