嵌套链接爬取:牛津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
相关产品推荐
相关产品推荐

