ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Python+Selenium实现招聘网站页面自动关闭工具

Python+Selenium实现招聘网站页面自动关闭工具 1. 项目背景与需求分析最近在帮朋友研究一个自动化操作的小工具主要解决某招聘网站页面自动关闭的问题。这个需求源于很多求职者每天需要频繁刷新和关闭大量职位页面手动操作既费时又容易遗漏。作为一个经常写自动化脚本的老手我决定用PythonSelenium的方案来实现这个功能。这个工具的核心逻辑其实很简单定时检测页面状态满足条件后自动执行关闭操作。但实际开发中会遇到不少细节问题比如页面元素定位、异常处理、定时器设置等。下面我就把完整的实现过程和踩过的坑分享给大家。2. 技术方案选型2.1 为什么选择Selenium市面上常见的网页自动化方案主要有三种直接调用浏览器API需要特定浏览器支持使用PuppeteerNode.js生态Selenium跨语言支持我选择PythonSelenium组合主要考虑Python语法简单适合快速开发Selenium支持主流浏览器Chrome/Firefox/Edge社区资源丰富遇到问题容易找到解决方案可以方便地结合其他Python库如schedule做定时任务2.2 环境准备需要安装的组件pip install selenium pip install webdriver-manager建议使用webdriver-manager来自动管理浏览器驱动避免手动下载和版本匹配问题from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager driver webdriver.Chrome(ChromeDriverManager().install())3. 核心功能实现3.1 页面状态检测机制要实现智能关闭首先需要定义什么条件下关闭页面。经过分析主要有三种触发条件页面停留时间超过阈值如30秒特定元素出现如职位已关闭提示页面内容发生变化如职位信息被移除实现代码框架def check_close_conditions(driver): # 条件1超时检测 if time.time() - page_open_time TIMEOUT: return True # 条件2特定元素检测 try: if driver.find_element(By.XPATH, //div[contains(text(),职位已关闭)]): return True except: pass # 条件3内容变化检测 current_content get_page_content(driver) if current_content ! original_content: return True return False3.2 多标签页管理实际使用时往往需要同时监控多个标签页这就涉及到窗口句柄的管理# 获取所有窗口句柄 all_handles driver.window_handles for handle in all_handles: driver.switch_to.window(handle) if check_close_conditions(driver): driver.close() print(f已关闭标签页{handle})重要提示关闭标签页后要记得切换回剩余窗口否则后续操作会报错。4. 实战优化技巧4.1 元素定位的稳定性处理招聘网站经常改版直接使用XPath或CSS选择器很容易失效。建议采用以下策略多重定位策略组合def safe_find_element(driver, locators): for locator in locators: try: return driver.find_element(*locator) except: continue return None # 使用示例 locators [ (By.XPATH, //div[classjob-title]), (By.CSS_SELECTOR, .job-header .title), (By.ID, jobTitle) ] title_element safe_find_element(driver, locators)添加显式等待from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC try: element WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, dynamicContent)) ) except TimeoutException: print(元素加载超时)4.2 反检测机制应对很多网站会检测自动化工具我们需要做一些反反检测处理修改WebDriver属性driver.execute_script(Object.defineProperty(navigator, webdriver, {get: () undefined}))添加正常浏览行为模拟import random from selenium.webdriver.common.action_chains import ActionChains def simulate_human_behavior(driver): # 随机移动鼠标 actions ActionChains(driver) for _ in range(random.randint(3,7)): x random.randint(0, 800) y random.randint(0, 600) actions.move_by_offset(x, y).perform() # 随机滚动页面 driver.execute_script(fwindow.scrollBy(0, {random.randint(200,800)})) time.sleep(random.uniform(0.5, 2.0))5. 完整实现代码下面是整合了所有功能的完整示例from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time import random class AutoCloser: def __init__(self): self.driver webdriver.Chrome(ChromeDriverManager().install()) self.page_timeout 30 # 秒 self.check_interval 5 # 秒 def monitor_pages(self): while True: try: self.check_and_close() time.sleep(self.check_interval) except Exception as e: print(f监控出错{str(e)}) self.recover_session() def check_and_close(self): main_window self.driver.current_window_handle for handle in self.driver.window_handles: self.driver.switch_to.window(handle) if self.should_close(): print(f关闭页面{self.driver.title}) self.driver.close() # 确保至少保留一个窗口 if len(self.driver.window_handles) 0: self.driver.switch_to.window(main_window) self.driver.get(about:blank) def should_close(self): current_url self.driver.current_url if about:blank in current_url: return True try: # 条件1检测关闭标志 close_markers [ (By.XPATH, //div[contains(text(),职位已关闭)]), (By.CSS_SELECTOR, .position-closed), (By.ID, jobClosedFlag) ] for marker in close_markers: try: if self.driver.find_element(*marker): return True except: continue # 条件2检测无效页面 if 404 in self.driver.title or 错误 in self.driver.title: return True return False except: return False def recover_session(self): try: self.driver.quit() except: pass self.driver webdriver.Chrome(ChromeDriverManager().install()) if __name__ __main__: closer AutoCloser() closer.monitor_pages()6. 常见问题排查6.1 元素找不到的问题可能原因及解决方案页面加载未完成 → 添加显式等待元素在iframe中 → 先切换iframe上下文页面结构变化 → 更新定位策略被遮挡 → 滚动到元素位置6.2 浏览器意外崩溃处理方案添加异常捕获和自动恢复定期保存会话状态使用try-catch包裹关键操作6.3 被网站屏蔽应对措施降低操作频率使用代理IP轮换模拟人类操作间隔修改浏览器指纹特征7. 扩展优化方向在实际使用中我发现还可以做这些改进添加配置系统通过JSON或YAML文件定义关闭条件和参数集成通知功能关闭页面时发送邮件或消息通知日志记录系统详细记录操作过程便于审计可视化监控用Flask等框架做Web监控界面多账号支持使用不同浏览器profile管理多个账号这个项目最让我有成就感的是朋友反馈使用后每天能节省2小时以上的重复操作时间。自动化工具的价值就在于把人们从机械劳动中解放出来把精力用在更有创造性的工作上。
返回列表