0

0

如何使用 Selenium 自动化抓取动态下拉菜单中的多表格数据

霞舞

霞舞

发布时间:2026-03-10 23:25:17

|

246人浏览过

|

来源于php中文网

原创

本文介绍为何无法仅用 requests + beautifulsoup 抓取 nd dmr 油气井页面的下拉表格数据,并详解如何通过 selenium 模拟用户交互,精准定位、遍历下拉选项并批量提取 html 表格。

本文介绍为何无法仅用 requests + beautifulsoup 抓取 nd dmr 油气井页面的下拉表格数据,并详解如何通过 selenium 模拟用户交互,精准定位、遍历下拉选项并批量提取 html 表格。

在处理类似 North Dakota DMR Bakken Wells 页面 这类前端驱动型网站时,一个常见误区是:认为 requests 获取 HTML 后用 BeautifulSoup 解析即可提取所有数据。但该页面本质上是一个服务端渲染不完整、依赖 JavaScript 动态加载内容的单页应用(SPA)——其下拉菜单(

  • requests.get() 仅返回初始空壳 HTML,不含任何表格;
  • BeautifulSoup 是静态解析器,无法执行 JS、触发事件或等待异步响应;
  • 单纯“解析下拉选项”无法获取实际数据,必须模拟真实浏览器行为。

✅ 正确方案:使用 Selenium WebDriver(配合 Chrome 或 Edge 浏览器),实现以下关键步骤:

  1. 启动浏览器并访问目标页面;
  2. 显式等待下拉菜单元素加载就绪;
  3. 遍历
  4. 等待对应表格出现(如通过 CSS 选择器 table.table 或 ID);
  5. 提取表格 HTML 或结构化数据(如 pandas DataFrame);
  6. 可选:保存为 CSV / Excel 或合并为统一数据集。

以下是可直接运行的完整示例代码(需提前安装 selenium 并配置 ChromeDriver):

Jaaz
Jaaz

开源的AI设计智能体

下载
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait, Select
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
import time

# 初始化 WebDriver(推荐使用 context manager 或显式 quit)
driver = webdriver.Chrome()  # 确保 chromedriver 在 PATH 中
wait = WebDriverWait(driver, 10)

try:
    driver.get("https://www.php.cn/link/5f68d79da98d5ad7e2fa873c8c8c0383")

    # 等待下拉菜单加载(ID 为 'county',根据页面源码确认)
    select_element = wait.until(EC.presence_of_element_located((By.ID, "county")))
    select = Select(select_element)

    # 获取所有选项文本和值
    options = [(opt.get_attribute("value"), opt.text) for opt in select.options[1:]]  # 跳过首项提示(如 "-- Select County --")

    all_dfs = []
    for value, label in options[:3]:  # 建议先测试前3个县,避免超时
        print(f"Processing county: {label} (value={value})")

        # 重新定位 select(DOM 可能重渲染)
        select_element = wait.until(EC.element_to_be_clickable((By.ID, "county")))
        select = Select(select_element)
        select.select_by_value(value)

        # 等待表格出现(页面中表格 class 为 'table',且位于 #results div 内)
        table_elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#results table.table")))

        # 使用 pandas 直接读取 HTML 表格(自动处理 <thead>/<tbody>)
        dfs = pd.read_html(table_elem.get_attribute("outerHTML"), header=0)
        if dfs:
            df = dfs[0]
            df["County"] = label  # 添加来源标识列
            all_dfs.append(df)

        # 可选:添加短暂停顿,降低请求频率
        time.sleep(1)

    # 合并所有表格
    if all_dfs:
        final_df = pd.concat(all_dfs, ignore_index=True)
        final_df.to_csv("bakken_wells_by_county.csv", index=False)
        print(f"✅ Successfully scraped {len(all_dfs)} tables. Total rows: {len(final_df)}")
    else:
        print("⚠️  No tables extracted.")

finally:
    driver.quit()

? 关键注意事项

  • 元素定位需验证:务必查看页面源码(右键 → “查看页面源代码”),确认
  • 显式等待优于 time.sleep():使用 WebDriverWait + expected_conditions 可提升稳定性,避免因网络波动导致的 NoSuchElementException;
  • 反爬与合规性:该网站未明确禁止爬虫,但仍建议设置合理延迟(如 time.sleep(1))、添加 User-Agent 头(可通过 Options.add_argument('--user-agent=...')),并遵守 robots.txt(https://www.php.cn/link/a05def2ffe22028e9db25b4e6e99543d);
  • 异常处理增强:生产环境应包裹 try/except 处理 TimeoutException、NoSuchElementException 等,并记录失败项以便重试;
  • 替代轻量方案?:若页面存在隐藏的 AJAX 接口(如 /api/wells?county=...),可通过浏览器开发者工具(Network → XHR)捕获真实请求,再用 requests 直接调用——但本例中该接口未公开暴露,故 Selenium 是可靠首选。

总结而言,面对 JS 渲染的动态下拉数据,放弃“静态解析幻想”,拥抱浏览器自动化,是稳健抓取的必经之路。Selenium 不仅解决“能不能”,更通过可控交互保障“准不准”与“全不全”。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
ajax教程
ajax教程

php中文网为大家带来ajax教程合集,Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。php中文网还为大家带来ajax的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

166

2023.06.14

ajax中文乱码解决方法
ajax中文乱码解决方法

ajax中文乱码解决方法有设置请求头部的字符编码、在服务器端设置响应头部的字符编码和使用encodeURIComponent对中文进行编码。本专题为大家提供ajax中文乱码相关的文章、下载、课程内容,供大家免费下载体验。

170

2023.08.31

ajax传递中文乱码怎么办
ajax传递中文乱码怎么办

ajax传递中文乱码的解决办法:1、设置统一的编码方式;2、服务器端编码;3、客户端解码;4、设置HTTP响应头;5、使用JSON格式。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

124

2023.11.15

ajax网站有哪些
ajax网站有哪些

使用ajax的网站有谷歌、维基百科、脸书、纽约时报、亚马逊、stackoverflow、twitter、hacker news、shopify和basecamp等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

256

2024.09.24

chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

1053

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

836

2023.11.06

edge是什么浏览器
edge是什么浏览器

Edge是一款由Microsoft开发的网页浏览器,是Windows 10操作系统中默认的浏览器,其目标是提供更快、更安全、更现代化的浏览器体验。本专题为大家提供edge浏览器相关的文章、下载、课程内容,供大家免费下载体验。

1723

2023.08.21

IE浏览器自动跳转EDGE如何恢复
IE浏览器自动跳转EDGE如何恢复

ie浏览器自动跳转edge的解决办法:1、更改默认浏览器设置;2、阻止edge浏览器的自动跳转;3、更改超链接的默认打开方式;4、禁用“快速网页查看器”;5、卸载edge浏览器;6、检查第三方插件或应用程序等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

397

2024.03.05

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号