Chenerdy的幻想乡
首页文章归档风说书笔记说说友链项目相册关于
← 全部科目

Python爬虫

课次目录

00开篇01爬虫简介02Requests请求03正则04数据解析05selenium自动化06DrissionPage自动化
笔记/Python爬虫/第 05 课

Python爬虫笔记(05):selenium自动化

2026-09-13 19:00:00

.selenium介绍

Selenium 是一个强大的浏览器自动化工具, 广泛用于网页测试和爬取动态加载内容, (主要是用于自动化测试)

自动化是指使用技术手段模拟人工,执行重复性任务,

安装 pip install selenium

官网: https://www.selenium.dev/zh-cn/documentation/webdriver/browsers/chrome/

浏览器的启动

实例
webdriver.Chrome() ``webdriver.Edge()` `webdriver.Firefox()` `webdriver.Safari()
实例
# 引入webdriver驱动,启动浏览器from selenium import webdriver # 启动浏览器 需要打开对应窗口driver = webdriver.Chrome()     	# 可以设置其他浏览器# 打开网页  打开后浏览器会自动关闭driver.get("https://www.baidu.com")# 打开多个页面# driver.execute_script("window.open('https://www.bilibili.com/');")# 可以设置input()输入内容 停止浏览器关闭input("请输入内容") # 输入内容之后,会自动关闭
  • driver.page_source 获取网页源代码
  • driver.close() 关闭页面
  • driver.quit() 退出浏览器
  • driver.title 获取网页的title标签信息
  • driver.current_url 获取当前网页的url

浏览器配置信息

实例
options = webdriver.ChromeOptions()from selenium.webdriver.chrome.options import Options# 两种使用方式功能一致options = Options()# edge浏览器: webdriver.EdgeOptions()​​
  • ("detach", True) 保持浏览器的打开状态

  • 实例
    ('excludeSwitches', ['enable-automation'])
    • 隐藏浏览器的自动化痕迹,避免被网站检测到是自动化程序在操作
  • --start-maximized 最大化窗口

  • --no-sandbox 禁用沙盒模式, 提高浏览器权限

实例
from selenium import webdriver # 设置浏览器配置信息  options = webdriver.ChromeOptions() # 保持浏览器的打开状态options.add_experimental_option("detach", True)# 隐藏自动化提示栏,并禁用部分自动化检测机制options.add_experimental_option('excludeSwitches', ['enable-automation'])# 最大化窗口options.add_argument("--start-maximized") # 沙盒模式options.add_argument("--no-sandbox")     # 传入配置信息driver = webdriver.Chrome(options=options)driver.get("https://www.baidu.com")# 获取网页的源码print(driver.page_source)print(driver.title)

获取元素

百度首页演示: https://www.baidu.com/index.htm

  • 实例
    浏览器对象.find_element(By.type, "value")
    • type: 选择对应方式定位元素
      • 示例: By.ID 或 By.CLASS_NAME
    • value: 是type方式对应的类名或id名等等
  • 元素节点.get_attribute("outerHTML") 获取元素整体内容

  • 元素节点.text 获取元素文本内容

实例
# 导入By 根据查找网页元素from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()driver.get('https://www.baidu.com')​# 通过ID定位element = driver.find_element(By.ID, "id_value")# 获取element元素完整内容html_content = element.get_attribute("outerHTML")
  • 通过class名定位
    • driver.find_element(By.CLASS_NAME, "class_name")
  • 通过HTML标签名定位
    • driver.find_element(By.TAG_NAME, "input")
  • 通过CSS选择器定位
    • driver.find_element(By.CSS_SELECTOR, "div.login > input")
  • 通过XPath定位
    • driver.find_element(By.XPATH, "//input[@name='email']")
实例
# 通过链接文本定位(完全匹配)<a href="/about">About Us</a>element = driver.find_element(By.LINK_TEXT, "About Us")# 通过链接文本定位(部分匹配)<a href="/about">About Us</a>element = driver.find_element(By.PARTIAL_LINK_TEXT, "About")​# 通过name属性定位<input name="email" type="text">driver.find_element(By.NAME, "email")

获取多个元素

  • find_elements(By.NAME, "username")
  • find_elements(By.XPATH, "//div")
  • find_elements(By.LINK_TEXT, "Login")
  • find_elements(By.PARTIAL_LINK_TEXT, "Log")
  • find_elements(By.TAG_NAME, "a")
  • find_elements(By.CLASS_NAME, "active")
  • find_elements(By.CSS_SELECTOR, ".item")

示例

实例
# browser.find_elements(By.CSS_SELECTOR,'.service-bd li')​element = driver.find_elements(By.CSS_SELECTOR,"#s-top-left a")for i in element:   html_content = i.get_attribute("outerHTML")   print(html_content)   ele_a = driver.find_elements(By.XPATH, '//div[@id="s-top-left"]/a')for i in ele_a:   print(i.text) #获取所有文本内容

元素交互

  • send_keys方法: 用于往元素中输入内容
  • click方法: 点击对应元素(触发点击事件)
  • clear方法: 重置输入框内容
  • text属性: 获取文本值
  • get_attribute方法: 根据属性获取属性值
实例
driver.get('https://www.baidu.com')# 通过id获取网页元素by_id = driver.find_element(By.ID,"kw")# 往input输入框中输入文本内容by_id.send_keys('美食')​# 获取元素的对应属性的属性值result = by_id.get_attribute("class")print(result)​by_id.clear() # 清空by_id.click() # 点击

触发键盘按键

键盘按键操作设置

实例
from selenium import webdriver# 按键方法from selenium.webdriver.common.keys import Keys ​driver = webdriver.Chrome()driver.get('http://news.baidu.com/')​by_id = driver.find_element(By.ID,"kw")by_id.send_keys('美食')# 输入文本后按回车键by_id.send_keys(Keys.ENTER)
按键 常量 描述
回车 Keys.ENTER 回车键
Tab Keys.TAB 制表键
空格 Keys.SPACE 空格键
ESC Keys.ESCAPE 退出键
删除 Keys.DELETE 删除键
退格 Keys.BACKSPACE 退格键
Ctrl Keys.CONTROL Control键
Shift Keys.SHIFT Shift键
Alt Keys.ALT Alt键
实例
# 组合使用  ctrl + Aelement.send_keys(Keys.CONTROL, 'a')

内嵌iframe

内嵌的iframe不能直接的进行获取,需要先获取iframe框架,再获取iframe框架内部容易

豆瓣读书首页的图片是 iframe https://book.douban.com/

  • 具有 id 或 name 属性,则可以使用该属性进行查找
  • switch_to.frame("使用iframe的id或name") 切换为iframe内嵌页面中
实例
# 在文档的交互, Frames位置from selenium import webdriverdriver.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')​# 通过iframe的id名称选择iframe框架,在进行内部选择标签元素driver.switch_to.frame("iframeResult")element = driver.find_element(By.ID, "draggable")print(element)print(element.get_attribute("innerHTML")) #获取元素的文本​# 离开 iframe 切换回默认内容driver.switch_to.default_content()element1 = driver.find_element(By.ID, "submitBTN")print(element1)

Action接口

实现鼠标移动、拖放、按键组合等高级操作

perform方法

执行动作链官网文档: https://www.selenium.dev/zh-cn/documentation/webdriver/actions_api/mouse/

ActionChains(操作的浏览器页面 driver) 操作鼠标行为(事件)

实例
from selenium.webdriver import ActionChains​# 产生一个动作执行器a = driver.find_element(By.ID, "draggable")c = driver.find_element(By.ID, "droppable")# drag_and_drop 设置a元素移动到cactions = ActionChains(driver)actions.drag_and_drop(a,c) # A移动到cactions.perform()  #执行 ​# 滑块移动  鼠标光标不会移动actions = ActionChains(driver)actions.click_and_hold(a)  # 按住滑块actions.move_by_offset(300, 0)  # 向右拖动300像素actions.perform()  #执行 ​# 光标移动到元素上(光标不会真正的移动),只会产生对应的效果driver.get('https://www.mi.com/shop')hoverable = driver.find_element(By.XPATH, '//*[@id="J_siteDownloadApp"]')actions = ActionChains(driver)actions.move_to_element(hoverable) # 移动到对应元素上actions.perform()
实例
actions.click(element)      # 左键单击actions.double_click(element)    # 双击左键actions.context_click(element)  # 右键单击

滚轮操作

实例
from selenium import webdriverimport time​driver = webdriver.Chrome()driver.get('http://news.baidu.com/')time.sleep(2)​#滚动到浏览器底部js = 'window.scrollTo(0,document.body.scrollHeight)'driver.execute_script(js)  # 执行js代码time.sleep(2)​#滚动到顶部js = 'window.scrollTo(0,document.body.scrollTop=0)'driver.execute_script(js)

等待

WebDriverWait用于设置等待网页元素加载或获取时长

实例
from selenium import webdriverfrom selenium.webdriver.common.by import By # 设置等待网页元素加载或获取时长from selenium.webdriver.support.wait import WebDriverWait # 用于与 WebDriverWait 配合使用,实现智能等待页面元素的各种状态from selenium.webdriver.support import expected_conditions as EC​browser = webdriver.Chrome()browser.get('https://www.taobao.com/')​# 创建等待对象,设置最长等待时间为 10秒wait = WebDriverWait(browser,  timeout=10)# 使用wait查询 会等待元素加载成功,最长等待10秒, 超过时间未获取则报错input = wait.until(EC.presence_of_element_located((By.ID,'J_SiteFooter')))print("123123")

补充: 在等待的过程中,后续的程序不会执行

wait没有查询到结果或未超时 print("123123")不会执行

等待条件: 在文档的额外功能, 期望状态位置

实例
# 创建等待对象,设置最长等待时间为 10秒wait = WebDriverWait(driver, timeout=10)​# 等待元素在DOM中存在且可见(宽度/高度>0,非隐藏)visible_element = wait.until(EC.visibility_of_element_located((By.XPATH, "//div")))​# 检查元素是否出现在DOM中hidden_element = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "item")))​# 等待元素可见且可点击(Enabled状态) 用于:提交按钮、超链接等login_button = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, "登录")))​# 验证文本内容success_msg = wait.until(EC.text_to_be_present_in_element((By.ID, "status"), "成功"))​# 等待元素不可见或从DOM中移除(常用于等待加载动画消失)wait.until(EC.invisibility_of_element_located((By.ID, "loading")))

异常处理

异常处理模块所在位置: 故障排除==> 异常位置

  • TimeoutException 等待条件超时
  • NoSuchElementException 找不到元素
实例
# 可以直接到selenium.common.exception源码文件中进行查询from selenium.common.exceptions import TimeoutException, NoSuchElementException​browser = webdriver.Chrome()# 找不到元素try:    ele = driver.find_element(By.ID, 'kw1')except NoSuchElementException:    print('No Element')finally:   #无论try语句中是否抛出异常,finally中的语句一定会被执行    browser.close()    # -----------------------from selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import Byfrom selenium.common.exceptions import TimeoutException​try:    element = WebDriverWait(driver, 2).until(        EC.presence_of_element_located((By.ID, "dynamic_element"))    )except TimeoutException: # 等待条件超时    print("等待超时,元素未出现!")

窗口交互

  • window_handles 查看当前浏览器所有窗口ID
  • switch_to_window(窗口ID) 切换窗口
  • driver.current_window_handle 获取当前窗口的id
  • driver.close() 关闭当前页面

页面前进后退

实例
import timefrom selenium import webdriver​browser = webdriver.Chrome()driver.get('https://www.baidu.com/')time.sleep(1)driver.get('https://www.taobao.com/')time.sleep(1)driver.get('https://www.jd.com/')time.sleep(1)driver.back()   # 后退  淘宝time.sleep(1)driver.forward()  # 前进  京东time.sleep(1)driver.refresh()  # 涮新

选项卡管理(多页管理)

实例
driver = webdriver.Chrome()driver.get('https://www.baidu.com')  # 选项卡0  窗口0time.sleep(1)# 调用原生JavaScript的api接口driver.execute_script('window.open("https://www.taobao.com/")')  # 选项卡1 窗口1time.sleep(1)driver.execute_script('window.open("https://www.jd.com/")')  # 选项卡2 窗口2print(browser.window_handles)  # 查看当前浏览器所有窗口IDtime.sleep(1)​# 选择跳转到对于窗口  3.7 .switch.to.windowdriver.switch_to.window(driver.window_handles[0])driver.page_source # 查看当前页面的源码

注意

实例
# 使用 driver.get()  只能默认打开一个页面xml_ele = etree.HTML(browser.page_source)hrefs = xml_ele.xpath("")for href in hrefs:    browser.get(href)    time.sleep(2)    handler_message(browser)

多页面操作: 案例中有操作

实例
# 打开新页面, 通过browser.get进行多个页面操作,在返回到主页面browser.execute_script('window.open("")')browser.switch_to.window(browser.window_handles[1])time.sleep(2)for href in hrefs:    browser.get(href)    time.sleep(2)    handler_message(browser)browser.close()browser.switch_to.window(browser.window_handles[0])print(browser.title)

浏览器配置

有效降低被网站检测为自动化的风险,适用于爬虫和自动化测试场景

参数 作用 典型应用场景
--start-maximized 启动时最大化窗口 避免元素因窗口太小导致不可见
--headless=new 无头模式(不显示GUI界面) 服务器环境或不需要可视化时节省
--incognito 隐身模式(不读取历史记录,新建临时会话) 确保每次启动都是干净环境
--disable-gpu 禁用GPU加速(旧版无头模式可能需要) 解决无头模式下的兼容性问题
--window-size=1200,800 设置初始窗口大小(宽×高) 需要固定窗口尺寸时使用
--disable-extensions 禁用所有扩展 避免扩展干扰自动化操作
--no-sandbox 禁用沙盒模式(Linux服务器可能需要) 解决权限不足导致的崩溃问题
实例
from selenium.webdriver.chrome.options import Optionsoptions = Options()options.add_argument("--start-maximized")       # 最大化窗口options.add_argument("--headless=new")          # 无头模式  不显示浏览器​# 存储用户数据目录 (保存cookies、缓存等)  使其访问时, 能保持登录状态options.add_argument("user-data-dir=D:/授课/1-15肥虫班/Day8/jd/data") # 必须为绝对路径,且目录需已存在​driver = webdriver.Chrome(options)driver.get('https://www.baidu.com')
← Python爬虫笔记(04):数据解析Python爬虫笔记(06):DrissionPage自动化 →

留言

目录