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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 00:35:09