Python表格数据爬取案例?

wen python案例 3

Python表格数据爬取实战案例全解析(附源代码)

📚 文章目录导读

  1. 为什么选择Python爬取表格数据?
  2. 项目准备:环境搭建与反爬策略
  3. 核心案例一:静态网页表格(HTML table标签)
  4. 核心案例二:动态加载表格(Ajax + JSON)
  5. 核心案例三:Excel/CSV在线表格文件
  6. 常见问题与避坑指南(Q&A)
  7. 数据清洗与结构化存储

为什么选择Python爬取表格数据?

在日常工作和数据分析场景中,表格数据(如股票行情、电商价格表、科研统计表)是最高频的需求之一,手动复制粘贴不仅效率低,且容易出错,Python凭借requestsBeautifulSouppandas等生态库,成为处理表格爬取的首选工具。

核心痛点: 很多表格数据被隐藏在复杂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请求加载)

抓包分析过程

  1. 打开浏览器开发者工具(F12) → 网络(Network) → XHR
  2. 筛选出JSON格式的响应数据
  3. 复制请求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: 使用rowspancolspan属性判断,通过循环展开合并单元格,简单方案:用pandas的read_html()自动解析。

# 一行代码解析HTML表格(包含合并单元格处理)
dfs = pd.read_html(url)
df = dfs[0]  # 返回列表,取第一个表格

Q3:动态表格分页数据一直重复?

A: 检查请求参数中是否有timestamptoken动态验证,需从首页响应中提取,另可能需携带_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接口还是文件下载,核心都是定位数据源并模拟正常用户请求,建议初学者从静态表格案例开始练习,熟练后再挑战动态页面,遇到反爬不必焦虑,因为反爬和反反爬本身就是一场技术博弈——保持更新,不断调试

标签: 数据解析

抱歉,评论功能暂时关闭!