python selenium 点击表格中的一系列按钮并输出弹窗内容到csv

news/2025/2/12 4:00:53/

一个python selenium的实用实例,比demo重,但也不算太复杂。
trick总结如下:

最新chromedriver的地址,https://googlechromelabs.github.io/chrome-for-testing,这很重要,不然就要处理chrome自动更新之类的烦人问题。很多下载来源都有点过时。
用options配置webdriver的地址,以及socks5代理。
driver.page_source可以打印当前html,可以辅助判断执行进度。
XPath (XML Path Language) 是一门在 XML 文档中通过元素和属性进行导航的语言,属于w3c标准。HTML是标准的XML,所以HTML也可以使用XPath。XPATH选择器的发挥比较稳定。
python有个traceback模块,print(traceback.format_exc())可以原样raise exception的同时,忽略exception。

爬虫项目,遇到了element not interactable,可能是尝试点击的时候元素还未可见。
解决办法就是在 until.elementLocated 之后再添加一个 until.elementIsVisible 的判断。
我这的原因是,网页没有做页面适配,如果窗口太小,按钮是看不见的。所以治本的解决方案是把窗口最大化,上面的判断只能起到问题诊断的作用而非治疗作用。
把sleep都换成until,优雅一点。

# 如果前端页面改了的话,需要修改相应xpath,页面改动大的话需要修改代码import selenium.common.exceptions
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.wait import WebDriverWait
# 根据网页标题、网址以及元素是否存在/可见/可点击等条件来决定我们是否需要继续等待
from selenium.webdriver.support import expected_conditions as EC
import configparser
import csvclass Spider:def __init__(self):self.config = configparser.ConfigParser()self.config.read('config.ini')options = Options()options.binary_location = self.config['envs']['chrome_driver_location']options.add_argument('--proxy-server=' + self.config['envs']['proxy'])options.add_argument('--start-maximized')self.driver = webdriver.Chrome(options)def request(self, url):self.driver.get(url)def test_page(self):print(self.driver.page_source)def login(self):wait = WebDriverWait(self.driver, 10)username = self.config['envs']['username']password = self.config['envs']['password']xpath_username = self.config['xpath']['username_input']xpath_password = self.config['xpath']['password_input']xpath_login = self.config['xpath']['login_button']username_input = wait.until(EC.presence_of_element_located((By.XPATH, xpath_username)))password_input = wait.until(EC.presence_of_element_located((By.XPATH, xpath_password)))username_input.send_keys(username)password_input.send_keys(password)signin_button = self.driver.find_element(By.XPATH, xpath_login)signin_button.click()def close(self):self.driver.quit()def export_running_job(self):login = Falsewait = WebDriverWait(self.driver, 10)xpath_table = self.config['xpath']['table_body']xpath_template = self.config['xpath']['detail_button']xpath_groupid = self.config['xpath']['groupid_input']xpath_topiclist = self.config['xpath']['topiclist_pre']xpath_next = self.config['frontend']['next_button']xpath_close = self.config['xpath']['close_button']for key in self.config['urls']:url_login = self.config['login'][key]url_flink = self.config['urls'][key]if not login:self.request(url_login)self.login()login = Trueself.request(url_flink)self.driver.maximize_window()# print(xpath_template)rows = wait.until(EC.presence_of_all_elements_located((By.XPATH, xpath_table)))groupid_ls, topic_ls = [], []while True:segments = xpath_template.split('/')for i in range(1, len(rows) + 1):segments[-3] = 'tr[' + str(i) + ']'xpath_item = '/'.join(segments)# print(xpath_item)detail_button = wait.until(EC.visibility_of_element_located((By.XPATH, xpath_item)))detail_button.click()groupid = wait.until(EC.presence_of_element_located((By.XPATH, xpath_groupid)))self.driver.execute_script("arguments[0].removeAttribute('disabled')", groupid)groupid_ls.append(groupid.get_attribute("value"))topiclist = wait.until(EC.presence_of_element_located((By.XPATH, xpath_topiclist)))topic_ls.append(topiclist.get_attribute("innerHTML"))close_button = wait.until(EC.visibility_of_element_located((By.XPATH, xpath_close)))close_button.click()if len(rows) == int(self.config['frontend']['table_maxsize']):next_button = self.driver.find_element(By.XPATH, xpath_next)next_button.click()else:breakwith open(key+'.csv', 'wt') as f:cw = csv.writer(f, lineterminator='\n')for i in range(len(groupid_ls)):cw.writerow([groupid_ls[i], topic_ls[i]])self.close()if __name__ == '__main__':spider = Spider()spider.export_running_job()

http://www.ppmy.cn/news/1203931.html

相关文章

算法通过村第十八关-回溯|白银笔记|经典问题

文章目录 前言组合总和问题分割回文串子集问题排序问题字母大小写全排列单词搜索总结 前言 提示:我不愿再给你写信了。因为我终于感到,我们的全部通信知识一个大大的幻影,我们每个人知识再给自己写信。 --安德烈纪德 回溯主要解决一些暴力枚举…

解决kubernetes node节点flannel网卡始终不能添加成功的问题

因为kubernetes证书过期,续签证书以后就出现了这问题: node节点报错日志如下: 该节点上flannel网络始终不能初始化成功,始终报错:CrashLoopBackOff。 查了很多资料,尝试过很多方法,包括&#x…

阿里云大模型环境依赖安装

安装遇到这个报错 ERROR: Could not build wheels for healpy, which is required to install pyproject.toml-based projects 解决方法: 执行命令: pip3 install setuptools wheel

【JS进阶】纯函数 + 高阶函数 + 函数柯里化

纯函数 高阶函数 函数柯里化 1.纯函数 纯函数 (Pure Function) 是函数式编程中一个非常重要的概念。 纯函数是一个定义,对于一个纯函数,执行它不会产生不可预料的行为,也不会对外部产生影响。 如果一个函数是纯函数,其必须符…

南昌大学漏洞报送证书

获取来源:edusrc(教育漏洞报告平台) url:https://src.sjtu.edu.cn/ 兑换价格:20金币 获取条件:南昌大学任意中危或以上级别漏洞

华为李鹏:到 2025 年智能算力需求将达到目前水平的 100 倍

在第十四届全球移动宽带论坛上,华为高级副总裁、运营商 BG 总裁李鹏表示,大模型为代表的 AI 应用发展带来对智能算力的爆发式需求。 李鹏在题为《加速 5G 商业正循环,拥抱更繁荣的 5.5G》的讲话中表示,「5G 已经走在商业成功的正确…

如何开始使用RACE模型?

覆盖、行动、转化和参与 (RACE) 框架是关键方法之一,可帮助您在数字营销活动(例如 Google 每次点击付费广告)中获得天文数字回报。 为什么? 该模型可以帮助您在成为客户和品牌传播者之前跟踪在线用户的旅程。 RACE 营销模型的每…

ESP32网络开发实例-Web服务器发送事件

Web服务器发送事件 文章目录 Web服务器发送事件1、服务器发送事件(SSE)介绍2、应用程序介绍3、软件准备4、硬件准备5、代码实现在本文中,我们将介绍如何构建 ESP32 服务器发送事件 (Server Sent Event,SSE)。 使用这种技术,我们将构建一个 ESP32 控制的 Web 服务器,该服务…