网页表单源数据获取方法咨询及指定网站爬取需求求助
爬取动态表单加载数据的解决方案
先别着急上Webdriver,咱们先从最简单的方法排查——毕竟自动化点击是最后的备选方案,效率低还容易触发反爬机制。
第一步:检查页面是否预加载了所有数据
你猜的方向没错!很多这类「前端切换显示」的网站,会把全量数据提前塞进页面的JS脚本或HTML节点里,只是通过表单选择来切换渲染逻辑。操作步骤很简单:
- 打开目标网站,按下
F12调出开发者工具 - 切换到Elements标签,按下
Ctrl+F(Windows)/Cmd+F(Mac),搜索页面里出现的某个具体数据(比如某月份的基金价格,或是月份名称如「January 2024」) - 如果搜索结果出现在某个
<script>标签里,且看起来是包含所有月份数据的数组/对象,那直接提取这段JS数据转成JSON就能用了(可以用Python的json模块配合re模块匹配提取)
举个直观的例子,假设页面里有这样的脚本:
var allUnitPrices = [{"month":"Jan 2024","data":[...]},{"month":"Feb 2024","data":[...]}];
你只需要用正则匹配出这个数组的内容,转成JSON格式就拿到了所有数据,根本不用反复点击切换。
第二步:抓包分析AJAX请求
如果第一步没找到预加载数据,那大概率是表单提交时触发了AJAX请求,从后台拉取对应月份的数据。操作步骤:
- 打开开发者工具的Network标签,选择XHR分类(过滤掉静态资源,只看异步请求)
- 回到页面,选择一个新月份提交表单
- 观察Network面板里的新请求,点击它查看:
- Request URL:后台接口的真实地址
- Request Method:是POST还是GET请求
- Form Data:提交的参数(比如
month=2024-01这类格式)
找到接口后,你可以直接用requests库循环遍历所有月份的参数,批量请求接口获取数据,这比Webdriver效率高得多。
比如Python示例(假设接口是POST请求,参数为月份):
import requests import json # 替换成抓包得到的真实接口地址 api_url = "https://www.visionsuper.com.au/xxx/unit-price-api" # 生成所有需要的月份格式(根据网站实际格式调整) target_months = [f"2024-{str(i).zfill(2)}" for i in range(1, 13)] + ["2023-12"] all_data = [] for month in target_months: # 从抓包结果里复制完整的请求参数 payload = { "month": month, "option": "com_unitprices", "Itemid": "305" } response = requests.post(api_url, data=payload) all_data.append({"month": month, "content": response.json()}) # 把数据保存到本地文件 with open("unit_prices.json", "w", encoding="utf-8") as f: json.dump(all_data, f, indent=2)
第三步:万不得已才用Webdriver自动化
如果前两种方法都走不通(比如接口有复杂的签名验证,新手难以破解),再考虑用Selenium模拟点击操作。步骤大概是:
- 安装Selenium库和对应浏览器的驱动(比如ChromeDriver)
- 编写代码打开页面,循环遍历所有月份选项,依次选择、提交,再提取页面数据
简单示例:
from selenium import webdriver from selenium.webdriver.support.ui import Select import time import json driver = webdriver.Chrome() driver.get("https://www.visionsuper.com.au/index.php?option=com_unitprices&Itemid=305") # 找到月份下拉框(需要根据页面实际元素ID/类名替换) month_select = Select(driver.find_element_by_id("month")) all_months = [option.text for option in month_select.options] all_data = [] for month in all_months: month_select.select_by_visible_text(month) # 点击提交按钮(替换成实际按钮的选择器) driver.find_element_by_css_selector("button[type='submit']").click() time.sleep(1) # 等待页面渲染完成 # 提取表格数据(根据页面实际结构调整) table_rows = driver.find_elements_by_tag_name("tr") month_data = [row.text.split("\n") for row in table_rows] all_data.append({"month": month, "data": month_data}) driver.quit() # 保存数据到本地 with open("unit_prices_selenium.json", "w", encoding="utf-8") as f: json.dump(all_data, f, indent=2)
总结一下:优先找预加载数据,其次抓AJAX接口,最后才考虑Webdriver。前两种方法不仅效率高,还不容易被网站的反爬机制检测到。
内容的提问来源于stack exchange,提问作者Tommy Mason




