使用Python-Pyodide编写NFL阵容爬虫遇NetworkError求助
错误原因与解决方法
错误原因
- 浏览器跨域限制(CORS):你使用的Jupyter Labs(Python-Pyodide)运行在浏览器环境中,
requests库在这里底层依赖浏览器的XMLHttpRequest实现请求。而浏览器的CORS策略会阻止从当前域名向footballdb.com发送跨域请求,除非目标网站明确允许你的域名访问,这直接触发了NetworkError。 - 网站基础反爬机制:即使没有CORS限制,
footballdb.com这类数据网站会检测请求来源标识,直接用requests.get()发送的请求缺少浏览器专属的User-Agent头,容易被识别为脚本请求而被拒绝。
解决方法
方法一:切换到本地Python环境运行(最推荐)
本地Python环境不受浏览器CORS限制,同时添加请求头模拟浏览器请求,绕过基础反爬:
import requests from bs4 import BeautifulSoup import pandas as pd from io import StringIO years = list(range(2000, 2024)) # 添加模拟浏览器的请求头 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' } for year in years: url = f'https://www.footballdb.com/teams/nfl/arizona-cardinals/roster/{year}' # 带请求头发送请求 response = requests.get(url, headers=headers) # 解析页面(示例:提取阵容表格) soup = BeautifulSoup(response.text, 'html.parser') # 根据页面结构定位阵容表格(需实际核对页面元素) roster_table = soup.find('table', {'class': 'statistics'}) if roster_table: df = pd.read_html(StringIO(str(roster_table)))[0] # 按需保存或处理数据 print(f'成功获取{year}年阵容数据')
方法二:在Pyodide环境中适配浏览器规则
如果必须在Pyodide环境运行,可使用Pyodide内置的pyodide.http模块替代requests,同时注意:
- 该模块仍受CORS限制,若目标网站不允许跨域,需自行搭建CORS代理(通过服务器端转发请求,规避浏览器跨域限制)
- 示例代码:
import pyodide.http from bs4 import BeautifulSoup import pandas as pd from io import StringIO years = list(range(2000, 2024)) 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' } url = 'https://www.footballdb.com/teams/nfl/arizona-cardinals/roster/2023' # 使用pyodide专属http模块获取内容 response = pyodide.http.open_url(url, headers=headers) soup = BeautifulSoup(response.read(), 'html.parser') # 后续解析逻辑同本地环境
注意:若Pyodide方法仍报错,说明目标网站未开放跨域权限,此时只能通过本地环境或搭建代理解决。
内容的提问来源于stack exchange,提问作者Raul Ojeda
相关产品推荐
相关产品推荐

