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

爬取维基百科数据时p = wikipedia.page(line)行报ConnectionError,网络正常求协助

解决维基百科爬取时的ConnectionError(BadStatusLine)问题

嘿,我之前也碰到过一模一样的问题——明明网络没问题,但调用wikipedia.page(line)就抛出BadStatusLine的连接错误。其实这大概率不是你的代码逻辑有问题,而是维基百科的反爬机制或者请求规范的问题,给你几个亲测有效的解决方案,按顺序试试:

1. 给请求加个浏览器伪装头

维基百科的服务器很容易识别出非浏览器的请求并拒绝。你可以修改wikipedia库的默认请求头,让请求看起来像是Chrome浏览器发的:

import wikipedia
import requests

# 模拟Chrome浏览器的请求头,直接抄就行
custom_headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
}

# 把这个头塞进wikipedia的session里
wikipedia.session.headers.update(custom_headers)

# 之后再执行你的页面请求
p = wikipedia.page(line)

2. 加延迟+重试,别让服务器觉得你是爬虫

频繁请求会触发维基百科的限流,给请求加个间隔时间,同时给失败的请求加重试机制:

import wikipedia
import time
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

# 设置重试策略:最多重试3次,每次间隔翻倍(1s→2s→4s)
retry_strategy = Retry(
    total=3,
    backoff_factor=1,
    status_forcelist=[429, 500, 502, 503, 504]  # 针对这些状态码重试
)
adapter = HTTPAdapter(max_retries=retry_strategy)
# 给http和https都装上重试适配器
wikipedia.session.mount('https://', adapter)
wikipedia.session.mount('http://', adapter)

# 每次请求前等2秒,别太急
time.sleep(2)
p = wikipedia.page(line)

3. 先确认目标页面真的存在

有时候你传入的line对应的页面可能根本不存在,或者是歧义页面(比如“Apple”既指水果又指公司),先做个校验能避免白忙活:

import wikipedia

try:
    # 先搜索看看有没有匹配的页面
    search_results = wikipedia.search(line)
    if not search_results:
        print(f"找不到和「{line}」匹配的维基百科页面哦")
    else:
        # 取第一个搜索结果来请求页面
        p = wikipedia.page(search_results[0])
except wikipedia.exceptions.PageError:
    print(f「{line}」对应的页面不存在")
except wikipedia.exceptions.DisambiguationError as e:
    print(f「{line}」是歧义页面,请选更准确的名称:{e.options}")
except requests.exceptions.ConnectionError as e:
    print(f"连接出错了:{e}")

4. 实在不行就换个维基镜像站点

如果上面的方法都不管用,可能是你当前网络到维基主站的连接有隐性问题,试试切换到维基的镜像站点:

import wikipedia

# 保持语言不变,比如还是英文
wikipedia.set_lang('en')
# 替换成一个可用的镜像域名(自己找个稳定的就行)
wikipedia.wikipedia.WIKIPEDIA_URL = 'https://en.wikipedia-mirror.org'

# 之后再正常请求页面
p = wikipedia.page(line)

另外提一句,如果你需要批量爬取维基数据,建议直接用维基的官方API,比用wikipedia库更稳定,也更符合维基的使用规范哦。

内容的提问来源于stack exchange,提问作者Nikhil Cheke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:59:57