如何提取无可用API的网页数据并转换为规范Pandas DataFrame
无公开接口的网页数据提取转Pandas DataFrame方案
没有公开JSON接口的静态网页,可以通过HTML解析的方式完成数据提取,新手可以用requests+BeautifulSoup的组合实现,门槛低易上手。
前置依赖安装
首先安装需要的第三方库:pip install requests beautifulsoup4 pandas lxml
实现逻辑
- 用
requests模拟浏览器发起GET请求,拿到目标网页的完整HTML源码 - 用
BeautifulSoup解析HTML结构,定位目标数据对应的标签/表格节点 - 将提取到的结构化数据整理为字典/列表格式,直接传入Pandas生成DataFrame
可直接运行的示例代码(适配你给出的PES2021球员页面)
import requests from bs4 import BeautifulSoup import pandas as pd # 目标网页地址 url = "https://pesdb.net/pes2021/?id=44379" # 配置请求头模拟浏览器,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } # 获取网页源码 response = requests.get(url, headers=headers) response.encoding = "utf-8" soup = BeautifulSoup(response.text, "lxml") # 提取球员基础信息 player_basic = {} player_basic["球员名称"] = soup.select_one("h1").text.strip() basic_rows = soup.select_one("table.player-info").select("tr") for row in basic_rows: cols = row.select("td") if len(cols) == 2: key = cols[0].text.strip() value = cols[1].text.strip() player_basic[key] = value # 提取球员能力数值 player_stats = {} stats_rows = soup.select("table.player-stats tr") for row in stats_rows: cols = row.select("td") if len(cols) == 2: key = cols[0].text.strip() value = cols[1].text.strip() # 数值类型转int方便后续分析 if value.isdigit(): value = int(value) player_stats[key] = value # 合并所有数据 full_data = {**player_basic, **player_stats} # 转换为DataFrame,批量爬取多球员时把多个full_data放入列表再传入即可 df = pd.DataFrame([full_data]) # 验证结果 print(df.head()) # 导出为CSV可执行:df.to_csv("pes_player_44379.csv", index=False, encoding="utf_8_sig")
补充注意事项
- 批量爬取多页面时,每次请求之间加1-2秒的延迟,既避免给服务器造成过大压力,也能降低被封IP的概率
- 不同页面的标签结构可能有差异,可以按F12打开浏览器开发者工具,用元素选择器点选目标内容,复制对应CSS选择器替换代码中的选择器即可
- 如果遇到需要点击、滚动才会加载的动态渲染内容,可以换用Selenium或Playwright模拟浏览器操作拿到完整渲染后的HTML,后续解析逻辑和上述代码一致
内容的提问来源于stack exchange,提问作者Abdul Azeem
相关产品推荐
相关产品推荐

