Web Scraping:如何爬取带日期选择器的图片格式表格并导入Pandas
问题描述
我是Web Scraping新手,想要提取带日期选择器的网页中的表格数据导入Pandas。但该表格为图片格式,无法右键选中复制粘贴内容;我无法定位到该表格图片,对控制台输出的页面内容执行ctrl+f搜索也无法匹配到表格内的任意数值,请问该如何实现?
当前编写的代码如下:
from bs4 import BeautifulSoup as bs import pandas as pd pd.set_option('display.max_colwidth', 500) import time import requests import pytesseract as pytes import random myURL = "https://www.netztransparenz.de/EEG/Marktpraemie/EPEX-SPOT-Stundenkontrakte" page = requests.get(myURL) print (page) soup = bs(page.content,"html.parser") print(soup) # <--- ctrl + F the result to locate values seen in the table
原因分析
- 你使用的
requests库仅能获取页面初始静态HTML,该站点的表格数据是客户端JavaScript动态加载的,静态源码本身不包含表格内容,所以你无法搜索到对应数值 - 表格为图片格式说明站点大概率用Canvas渲染表格、或是后端直接返回生成好的表格图片,没有暴露原始结构化数据在静态页面中
解决方法
方法1:抓接口拿结构化数据(首选,准确率最高)
- 打开浏览器F12控制台,切换到「网络」面板,选择「Fetch/XHR」筛选,手动选择目标日期触发表格加载,遍历控制台中新增的请求,找到返回内容包含表格数值的接口
- 核对该接口的请求头、请求参数(包含日期参数、User-Agent、校验token等),用
requests模拟该接口请求,直接拿到JSON/CSV格式的原始结构化数据,可直接转换为Pandas的DataFrame,无需后续OCR识别
方法2:动态渲染+OCR识别(适用于无法抓到接口的场景)
如果确认没有暴露数据接口,可通过动态渲染工具加载完整页面后截图做OCR识别:
- 用
Selenium或Playwright这类动态渲染工具,模拟浏览器打开页面、选择目标日期,等待表格完全加载 - 定位到表格元素后单独截图,用支持表格结构化识别的OCR工具(如PaddleOCR表格识别模型)处理截图,将识别到的行列内容整理为DataFrame格式
- 参考代码结构:
# 依赖安装:pip install selenium paddleocr pandas from selenium import webdriver from selenium.webdriver.common.by import By import time import pandas as pd from paddleocr import PaddleOCR # 初始化浏览器 driver = webdriver.Chrome() driver.get("https://www.netztransparenz.de/EEG/Marktpraemie/EPEX-SPOT-Stundenkontrakte") time.sleep(3) # 模拟选择日期操作,替换为对应元素的选择器 date_input = driver.find_element(By.CSS_SELECTOR, "日期选择器元素的CSS选择器") date_input.send_keys("目标日期") search_btn = driver.find_element(By.CSS_SELECTOR, "查询按钮元素的CSS选择器") search_btn.click() time.sleep(2) # 定位表格元素并截图 table_ele = driver.find_element(By.CSS_SELECTOR, "表格元素的CSS选择器") table_ele.screenshot("table.png") # 德语站点加载德语OCR模型识别,准确率更高 ocr = PaddleOCR(use_angle_cls=True, lang='de') ocr_result = ocr.ocr("table.png", cls=True) # 后续处理识别结果,匹配行列关系,整理为DataFrame即可
注意事项
- 若站点有反爬策略,需补充请求头、控制请求频率,必要时使用代理
- OCR识别结果需做数值校验,避免识别误差导致数据错误
内容的提问来源于stack exchange,提问作者OldNick
相关产品推荐
相关产品推荐

