如何获取维基百科页面的最终重定向链接?Python实现问题
获取维基百科最终重定向链接的解决方案
我需要编写Python脚本获取维基百科页面的最终重定向链接,例如访问http://en.wikipedia.org/wiki/Zzzzzz时,应返回https://en.wikipedia.org/wiki/Z_(joke_line)。但现有代码仅能处理普通HTTP 3xx重定向(如YouTube短链接),对维基百科的重定向无效。
现有代码
import requests def get_final_url(url): response = requests.get(url, allow_redirects=False) if response.status_code in (300, 301, 302, 303, 307, 308): return response.headers['Location'] else: return None initial_url = "http://en.wikipedia.org/wiki/Zzzzzz" # 替换为你的URL final_url = get_final_url(initial_url) print("Final URL:", final_url)
测试结果
http://en.wikipedia.org/wiki/Zzzzzz -> http://en.wikipedia.org/wiki/Zzzzzz https://youtu.be/nMFv8YPOQdY -> https://www.youtube.com/watch?v=nMFv8YPOQdY&feature=youtu.be
问题原因
维基百科的页面重定向并非通过HTTP 3xx状态码实现,而是返回200状态码后,通过HTML中的<link rel="canonical">标签或页面内的重定向提示完成跳转,因此仅检查HTTP响应头无法获取最终链接。
解决方案
方案1:解析HTML页面获取规范链接
使用BeautifulSoup解析页面,提取<link rel="canonical">标签的href属性,这是维基百科标注的最终目标页面链接。
先安装依赖:
pip install beautifulsoup4 requests
修改后的代码:
import requests from bs4 import BeautifulSoup def get_wikipedia_final_url(url): response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 提取canonical链接 canonical_link = soup.find('link', rel='canonical') if canonical_link: return canonical_link['href'] # 备用:检查页面内的重定向提示 redirect_msg = soup.find('div', class_='redirectMsg') if redirect_msg: redirect_a = redirect_msg.find('a', href=True) if redirect_a: return f"https://en.wikipedia.org{redirect_a['href']}" # 无重定向则返回原URL return url initial_url = "http://en.wikipedia.org/wiki/Zzzzzz" final_url = get_wikipedia_final_url(initial_url) print("Final URL:", final_url)
方案2:调用MediaWiki API(更高效)
直接使用维基百科的MediaWiki API查询重定向目标,无需下载整个HTML页面,速度更快、更可靠。
代码示例:
import requests def get_wikipedia_final_url_via_api(url): # 从URL中提取页面标题 title = url.split('/wiki/')[-1] # API请求参数 params = { 'action': 'query', 'titles': title, 'redirects': 1, 'format': 'json' } response = requests.get('https://en.wikipedia.org/w/api.php', params=params) data = response.json() # 解析API返回的重定向信息 if 'redirects' in data['query']: final_title = data['query']['redirects'][0]['to'] return f"https://en.wikipedia.org/wiki/{final_title}" # 无重定向则返回原URL对应的规范链接 pages = data['query']['pages'] for page in pages.values(): return f"https://en.wikipedia.org/wiki/{page['title']}" initial_url = "http://en.wikipedia.org/wiki/Zzzzzz" final_url = get_wikipedia_final_url_via_api(initial_url) print("Final URL:", final_url)
测试效果
两种方案都能正确返回:https://en.wikipedia.org/wiki/Z_(joke_line)
内容的提问来源于stack exchange,提问作者Amit Sarussi
相关产品推荐
相关产品推荐

