Python表格数据爬取实战案例全解析(附源代码)
📚 文章目录导读
- 为什么选择Python爬取表格数据?
- 项目准备:环境搭建与反爬策略
- 核心案例一:静态网页表格(HTML table标签)
- 核心案例二:动态加载表格(Ajax + JSON)
- 核心案例三:Excel/CSV在线表格文件
- 常见问题与避坑指南(Q&A)
- 数据清洗与结构化存储
为什么选择Python爬取表格数据?
在日常工作和数据分析场景中,表格数据(如股票行情、电商价格表、科研统计表)是最高频的需求之一,手动复制粘贴不仅效率低,且容易出错,Python凭借requests、BeautifulSoup、pandas等生态库,成为处理表格爬取的首选工具。
核心痛点: 很多表格数据被隐藏在复杂HTML结构或动态加载的JavaScript中,传统复制无法解决,而Python爬虫可以通过解析DOM树、模拟HTTP请求、处理反爬机制,批量获取结构化数据。
项目准备:环境搭建与反爬策略
1 必要库安装
pip install requests beautifulsoup4 pandas lxml selenium
2 反爬三件套(必知)
| 反爬类型 | 解决策略 | 代码示例 |
|---|---|---|
| User-Agent检测 | 伪装浏览器头部 | headers = {'User-Agent': 'Mozilla/5.0...'} |
| 请求频率限制 | 添加time.sleep随机延迟 | time.sleep(random.uniform(1,3)) |
| Cookie验证 | 使用Session保持会话 | requests.Session() |
核心案例一:静态网页表格(HTML table标签)
场景: 爬取国家统计局某年度经济数据表格
步骤详解
import requests
from bs4 import BeautifulSoup
import pandas as pd
url = 'http://example.com/economic_table'
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'lxml')
# 定位到数据表格(优先使用id或class)
table = soup.find('table', class_='data-table')
# 提取所有行
rows = table.find_all('tr')
data = []
for row in rows:
cols = row.find_all('td')
cols = [col.get_text(strip=True) for col in cols]
data.append(cols)
# 转换为DataFrame并保存
df = pd.DataFrame(data[1:], columns=data[0])
df.to_csv('economic_data.csv', index=False, encoding='utf-8-sig')
关键点: 使用strip=True去除空格,utf-8-sig解决Excel打开乱码。
核心案例二:动态加载表格(Ajax + JSON)
场景: 爬取某证券交易所实时行情表(通过XHR请求加载)
抓包分析过程
- 打开浏览器开发者工具(F12) → 网络(Network) → XHR
- 筛选出JSON格式的响应数据
- 复制请求URL和参数
import requests
import json
import pandas as pd
url = 'https://api.example.com/stock/table?page=1&size=50'
headers = {'User-Agent': 'Mozilla/5.0', 'Referer': 'https://example.com'}
response = requests.get(url, headers=headers)
json_data = response.json()
# 假设JSON结构为:{"data": [{"name":"...", "price":"..."}]}
items = json_data['data']
df = pd.DataFrame(items)
df.to_excel('stock_data.xlsx', index=False)
注意: 动态表格通常需要处理分页——通过循环修改page参数直至返回空数据。
核心案例三:Excel/CSV在线表格文件
场景: 爬取政府公开数据平台提供的Excel下载链接
直接下载并解析
import pandas as pd
import requests
url = 'http://data.gov.cn/resource/2024/sales_list.xlsx'
response = requests.get(url, stream=True)
with open('temp.xlsx', 'wb') as f:
f.write(response.content)
df = pd.read_excel('temp.xlsx', sheet_name=0)
print(df.head())
进阶技巧: 若文件为.csv格式,直接使用pd.read_csv(url, encoding='gbk'),跳过下载过程。
常见问题与避坑指南(Q&A)
Q1:爬取时遇到“403 Forbidden”怎么办?
A: 检查User-Agent和Referer是否完整,尝试添加headers['Cookie'] = 'your_cookie'(从浏览器复制)。
Q2:表格数据存在合并单元格,如何对齐?
A: 使用rowspan和colspan属性判断,通过循环展开合并单元格,简单方案:用pandas的read_html()自动解析。
# 一行代码解析HTML表格(包含合并单元格处理) dfs = pd.read_html(url) df = dfs[0] # 返回列表,取第一个表格
Q3:动态表格分页数据一直重复?
A: 检查请求参数中是否有timestamp或token动态验证,需从首页响应中提取,另可能需携带_csrf令牌。
Q4:反爬升级为CSS或字体反爬?
A: 字体反爬需下载字体文件(.woff或.ttf),通过fonttools库映射字符,CSS反爬则需解析伪类或背景图片定位。
数据清洗与结构化存储
完成爬取后,90%的数据需要清洗,建议使用pandas进行以下操作:
- 删除空行:
df.dropna() - 类型转换:
df['price'] = df['price'].astype(float) - 去重:
df.drop_duplicates()
最终存储推荐:
- 小规模数据:CSV/Excel(兼容性广)
- 大规模数据:写入MySQL或SQLite(支持SQL查询)
成功爬取的本质是理解网页的数据流向,无论表格来自静态HTML、API接口还是文件下载,核心都是定位数据源并模拟正常用户请求,建议初学者从静态表格案例开始练习,熟练后再挑战动态页面,遇到反爬不必焦虑,因为反爬和反反爬本身就是一场技术博弈——保持更新,不断调试。
标签: 数据解析