selenium的一些要注意的地方

本文记录了使用selenium爬取北邮人论坛时遇到的问题及解决方案,包括'geckodriver'路径问题、TimeoutException错误以及解决办法。还提到了模拟键盘操作和PhantomJS的使用,并给出了python+scrapy+selenium结合爬虫的实践示例。

今天在尝试了一下如何爬取北邮人论坛,最后使用selenium来实现了。

下面记录一下使用selenium要注意的地方。


  • python selenium模块使用出错,错误代码为:Message: ‘geckodriver’ executable needs to be in PATH.
ubuntu16.04环境下 解决方法:
下载 geckodriverckod   
地址: mozilla/geckodriver
解压后将geckodriverckod 存放至 /usr/local/bin/ 路径下即可
sudo mv ~/Downloads/geckodriver /usr/local/bin/

#具体答案可以查看下面的链接

链接:https://www.zhihu.com/question/49568096/answer/131093426


  • 出现错误:selenium.common.exceptions.TimeoutException: Message: Screenshot: available via screen

driver = webdriver.PhantomJS(service_args=[‘–ignore-ssl-errors=true‘, ‘–ssl-protocol=TLSv1‘])

在初始化driver时传入参数”service_args=[‘–ignore-ssl-er

Selenium 中,如果你想**点击网页中所有可以点击的元素**,可以使用以下方法: --- ## ✅ 实现思路 1. **获取页面上所有可点击的元素**; 2. **依次点击这些元素**; 3. **处理点击后可能的页面跳转或弹窗(如 alert)**; 4. **避免重复点击或无效点击**; 5. **添加适当的等待机制,防止页面未加载完成导致找不到元素**。 --- ## ✅ 示例代码(Python + Selenium) ```python 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 from selenium.common.exceptions import ElementClickInterceptedException, TimeoutException, StaleElementReferenceException import time # 初始化浏览器驱动(以Chrome为例) driver = webdriver.Chrome() # 打开目标网页 driver.get("https://example.com") # 等待页面加载完成 wait = WebDriverWait(driver, 10) # 定义可点击的标签名(可以扩展) clickable_elements = driver.find_elements(By.XPATH, '//a | //button | //*[@onclick] | //input[@type="submit"] | //input[@type="button"] | //*[@role="button"]' ) print(f"共找到 {len(clickable_elements)} 个可点击元素") # 用于记录已点击的元素(避免重复点击) clicked_elements = set() # 遍历并点击每个可点击元素 for index, element in enumerate(clickable_elements): try: # 等待元素可点击 wait.until(EC.element_to_be_clickable(element)) # 获取元素的位置信息用于唯一标识(如 tag + text + location) tag_name = element.tag_name text = element.text.strip() location = element.location element_id = f"{tag_name}_{text}_{location['x']}_{location['y']}" if element_id in clicked_elements: print(f"跳过重复元素: {element_id}") continue # 打印点击信息 print(f"正在点击第 {index+1} 个元素:标签={tag_name}, 文本='{text}', 位置={location}") # 滚动到元素位置(防止元素不在可视区域) driver.execute_script("arguments[0].scrollIntoView({ behavior: 'auto', block: 'center' });", element) # 等待一下,防止太快导致点击失败 time.sleep(0.5) # 点击元素 element.click() # 添加到已点击集合 clicked_elements.add(element_id) # 等待页面跳转或加载 time.sleep(1) # 处理弹窗(如 alert) try: alert = driver.switch_to.alert print("检测到弹窗,内容为:", alert.text) alert.accept() except: pass except (ElementClickInterceptedException, StaleElementReferenceException, TimeoutException) as e: print(f"无法点击第 {index+1} 个元素:{e}") continue # 关闭浏览器 driver.quit() ``` --- ## ✅ 可点击元素的定位策略(XPath) 你可以使用以下 XPath 来定位可点击的元素: ```xpath //a | //button | //*[@onclick] | //input[@type="submit"] | //input[@type="button"] | //*[@role="button"] ``` | XPath 表达式 | 含义 | |--------------|------| | `//a` | 所有超链接 | | `//button` | 所有按钮 | | `//*[@onclick]` | 所有带有 onclick 事件的元素 | | `//input[@type="submit"]` | 提交按钮 | | `//input[@type="button"]` | 普通按钮 | | `//*[@role="button"]` | 语义上是按钮的元素(如 div 或 span) | --- ## ✅ 注意事项 1. **元素可能重复出现**:比如“返回顶部”按钮在多个页面都存在,要防止重复点击; 2. **元素可能被遮挡**:使用 `scrollIntoView` 滚动到元素位置; 3. **点击后页面跳转**:点击后页面跳转会导致后续元素失效,可考虑刷新页面或返回上一页; 4. **防止死循环**:某些按钮点击后会再次触发相同的元素列表; 5. **使用 try-except 捕获异常**:如 `ElementClickInterceptedException`、`StaleElementReferenceException`; 6. **添加等待机制**:确保元素加载完成再点击; 7. **处理弹窗**:使用 `switch_to.alert` 捕获并处理弹窗。 --- ## ✅ 可选优化 - 使用 `set` 记录已点击的元素(防止重复); - 使用 `driver.back()` 返回上一页继续点击; - 使用 `BeautifulSoup` 或 `lxml` 分析 DOM,配合 Selenium; - 使用 `headless` 模式运行浏览器(后台静默执行); - 使用 `Selenium Wire` 拦截网络请求,判断是否跳转; - 使用 `ActionChains` 模拟更复杂的点击行为。 --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值