爬取维基百科数据时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
相关产品推荐
相关产品推荐

