You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

网页表单源数据获取方法咨询及指定网站爬取需求求助

爬取动态表单加载数据的解决方案

先别着急上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

火山引擎 最新活动