You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套链接爬取:牛津CSLA数据库动态筛选后多层数据采集实现

实现方案

这个站点的筛选功能是通过POST方式提交表单实现的,筛选参数不会拼接在URL中,因此不需要通过模拟浏览器点击的方式操作,直接构造对应表单参数发起POST请求即可获取筛选结果,实现效率更高。

第一步:提交筛选请求获取结果列表

从提供的页面源码可以确认,「Region of Birth/Burial」下拉选择器对应的表单参数名为form[item_89],目标选项「Gaul and Frankish kingdoms」对应的参数值为Gaul。
完整提交时需要携带的核心参数包括:

  • 「Saint」单选选项对应的name和value值
  • 上述地区选择器的参数值Gaul
  • 「Apply Search」提交按钮对应的name和value值
  • 页面源码中所有type为hidden的隐藏表单字段(如果有token、校验类字段必须携带,否则会请求失败)

首次请求先GET打开搜索页,解析出所有需要的表单字段值,和筛选参数拼接后POST到搜索页地址,即可直接拿到筛选后的结果页HTML,无需依赖URL变化。
参考请求代码示例:

import requests
from bs4 import BeautifulSoup
import pandas as pd
import time

# 初始化请求会话,自动维护cookie
sess = requests.Session()
search_path = "/search.php"
record_path = "/record.php"
base_domain = "http://csla.history.ox.ac.uk"

# 先GET访问搜索页,获取隐藏表单字段
init_resp = sess.get(base_domain + search_path)
init_soup = BeautifulSoup(init_resp.text, "html.parser")
form_data = {}
# 提取所有隐藏字段
for hidden_input in init_soup.select("form input[type='hidden']"):
    form_data[hidden_input["name"]] = hidden_input.get("value", "")
# 填充筛选条件
# Saint选项参数,可通过浏览器开发者工具查看实际value,或从页面单选按钮源码中提取
form_data["对应Saint选项的name值"] = "对应Saint选项的value值"
form_data["form[item_89]"] = "Gaul"
# 填充提交按钮参数
form_data["对应Apply Search按钮的name值"] = "Apply Search"

# 提交POST请求获取筛选结果
result_resp = sess.post(base_domain + search_path, data=form_data)
result_soup = BeautifulSoup(result_resp.text, "html.parser")

如果找不到Saint单选按钮、提交按钮对应的参数名和值,不需要逐行翻源码,直接打开浏览器开发者工具的网络面板,手动操作一次筛选流程,查看触发的POST请求的载荷内容,把所有参数照搬即可,能快速避免参数缺失导致的请求失败。

第二步:三层页面遍历爬取

  • 第一层结果页解析:遍历筛选结果页所有链接,提取链接中recid参数为E开头的ID,拼接为记录详情页地址。如果结果存在分页,解析下一页对应的表单参数,循环提交POST请求翻页,直到没有下一页标识为止。
  • 第二层关联页解析:逐个请求E开头ID的详情页,定位到「Related Saint Records」表格,提取表格中所有recid参数为S开头的圣徒ID,提前做去重处理,避免重复请求相同页面。
  • 第三层圣徒信息提取:逐个请求S开头ID的圣徒详情页,按需求提取指定字段:
    • Saint ID:直接从页面URL的recid参数提取即可
    • Name:提取页面中圣徒名称的标题文本
    • Reported Death Not Before、Reported Death Not After、Gender、Type of Saint:通过字段标签定位到相邻的内容文本,做简单数据清洗后留存。

爬取过程中建议每次请求间隔1-2秒,避免触发站点反爬机制。

第三步:结构化存储

每爬取一个圣徒的信息就存为一条字典格式的记录,所有数据爬取完成后,直接传入pandas的DataFrame构造函数即可得到结构化的表格数据,可按需求导出为csv或其他格式。


内容的提问来源于stack exchange,提问作者natalieee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 00:54:33