如何在Wikipedia Pageviews API中处理重定向获取物种浏览量?
濒危物种维基浏览量查询问题与解决方案
问题背景
我有一个包含500种濒危物种的DataFrame,需要通过学名批量获取2015-2020年的Wikipedia页面月浏览量。但查询Panthera tigris这类学名时,浏览量仅300-4000+,远低于用通用名Tiger查询的超70万结果。已知Panthera tigris页面会重定向至Tiger,但不知道如何在API请求中加入重定向参数,也不确定加入后是否仅返回目标页面而非重定向页的浏览量。此外无法仅用通用名查询,因为无法手动确认500余种物种的页面标题是通用名还是学名。当前API请求代码如下:
def WikiPageView(name): # Calling monthly page views of each species address = "https://wikimedia.org/api/rest_v1/metrics/pageviews/per-article/en.wikipedia.org/all-access/user/" + name + "/monthly/2015010100/2020123100" headers = CaseInsensitiveDict() headers["Accept"] = "application/json" # Personal username for identification for the Wikipedia API headers = {'User-Agent': 'username/0.00 (name@email.com)'} resp = requests.get(address, headers=headers) details = resp.json() return details # Loop over the pd series of species names and call the wikipage function for name in species['scientific_name']: # Spaces are replaced with an underscore for the wikipedia API name = name.replace(" ", "_") result = WikiPageView(name)
同时在PageViews Analysis网站查询时存在不一致:单独查询学名时浏览量低,单独查通用名则有2020年3月70万的峰值,同时查询两者时学名的浏览量却与通用名接近。
一、查询数据不一致的原因
- 单独查询学名时,统计的是直接访问重定向页本身的流量(比如用户直接输入学名URL、或从其他外部链接跳转至重定向页的访问),这部分流量占比极低。
- 单独查询通用名时,统计的是目标页面的所有访问量,包括直接访问、从重定向页跳转、其他内链/外链跳转的流量,所以数值远高于学名的单独查询结果。
- 同时查询两者时,PageViews Analysis会自动将重定向页的流量合并到目标页面的统计中,因此显示的学名浏览量会和通用名接近——这是网站为了展示内容的总访问量做的合并处理。
二、API请求中处理重定向的正确方法
1. 启用API的重定向参数
Wikimedia Pageviews API支持redirects=true参数,添加该参数后,请求会自动将重定向页映射到目标页面,并返回目标页面的完整浏览量数据,而非重定向页本身的少量流量。
2. 修改后的代码实现
import requests from requests.structures import CaseInsensitiveDict import pandas as pd def WikiPageView(name): # 构造API地址,添加redirects=true参数 base_url = "https://wikimedia.org/api/rest_v1/metrics/pageviews/per-article/en.wikipedia.org/all-access/user/{}/monthly/2015010100/2020123100?redirects=true" address = base_url.format(name) # 设置请求头,User-Agent必须正确填写个人信息 headers = CaseInsensitiveDict() headers["Accept"] = "application/json" headers["User-Agent"] = 'username/0.00 (name@email.com)' # 替换为你的实际信息 resp = requests.get(address, headers=headers) # 处理请求成功/失败的情况 if resp.status_code == 200: return resp.json() else: # 返回错误信息或空值,避免程序中断 return {"error": f"Request failed with status {resp.status_code}", "name": name} # 批量查询并存储结果 results = [] for name in species['scientific_name']: # 替换空格为下划线,符合维基URL格式 formatted_name = name.replace(" ", "_") page_data = WikiPageView(formatted_name) results.append(page_data) # 将结果转换为DataFrame以便后续分析 results_df = pd.DataFrame(results)
3. 关键说明
redirects=true参数是核心:它会让API自动解析重定向关系,返回目标页面的浏览量,无需手动区分学名/通用名对应的页面类型。- 增加了请求状态码判断:避免因部分物种无维基页面导致程序崩溃,方便后续排查异常数据。
- 必须正确设置
User-Agent:Wikimedia API要求提供有效的身份信息,否则可能被限制访问。
内容的提问来源于stack exchange,提问作者redleesy
相关产品推荐
相关产品推荐

