Python 爬虫与 Selenium 动态页面抓取实战
前言
Python 爬虫在数据采集领域非常强大。在处理现代网页时,许多内容是通过 JavaScript 动态加载的,传统的 HTTP 请求无法直接获取这些数据。此时,Selenium 作为自动化测试工具,常被用于模拟浏览器行为,自动操控 DOM 元素和执行 JavaScript 脚本。
本文将深入探讨如何使用 Selenium 执行 JavaScript 程序,解决动态网页中的点击、交互问题,并梳理从入门到进阶的系统学习路径。
核心问题:Selenium 执行 JavaScript 点击失效
在使用 Selenium 抓取数据时,经常遇到需要模拟鼠标点击触发 JS 事件的情况。如果直接使用 execute_script 尝试查找元素并点击,往往会因为作用域或语法错误导致失败。
常见错误示例
以下代码试图直接在 JavaScript 字符串中调用 Python 的 By 类,这是无效的:
# 错误示范
browser.execute_script("document.getElement(By.xpath(\"//div[@class='vbseo_liked']\")").click()")
原因分析:
By是 Python Selenium 库中的类,JavaScript 环境中不存在。execute_script运行在浏览器上下文中,无法直接访问 Python 对象。- 元素定位应在 Python 端完成,再将元素引用传递给 JavaScript。
正确解决方案
正确的流程是:先在 Python 中找到元素对象,然后将其作为参数传递给 execute_script。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 初始化浏览器 (推荐使用 Chrome)
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://example.com")
try:
# 1. 在 Python 端定位元素
link = driver.find_element(By.XPATH, "//div[@class='vbseo_liked']/a[contains(@onclick, 'return vbseoui.others_click(this)')]")
# 2. 使用 execute_script 传递元素进行点击
# arguments[0] 代表传入的第一个参数,即上面的 link 对象
driver.execute_script("arguments[0].click();", link)
Exception e:
()
:
driver.quit()


