Python操作网页Selenium

165 阅读3分钟

1、环境准备

  1. 安装python和pycharm
  2. 安装浏览器如谷歌
  3. 根据浏览器版本尽量下载大版本相近的浏览器驱动googlechromelabs.github.io/chrome-for-… (可以选择在开始处搜索services.msc 找到 Google更新组件全部禁用)如图:

image.png

  1. 安装selenium工具在左下角的终端中输入pip install selenium -i pypi.tuna.tsinghua.edu.cn/simple (可以输入后面代码验证一下:python -c "import selenium; print(selenium.version)")
  2. 将下载的驱动拖入项目下,并开始写代码
# 导入Selenium WebDriver相关模块
from selenium import webdriver
from selenium.webdriver.chrome.options import Options  # 用于配置Chrome浏览器选项
from selenium.webdriver.chrome.service import Service  # 用于管理ChromeDriver服务

# 创建浏览器选项配置对象
q1 = Options()

# 添加"--no-sandbox"参数:禁用Chrome的沙盒安全模式
# 通常在Linux服务器或无GUI环境下需要此配置
q1.add_argument("--no-sandbox")

# 设置实验性选项"detach"为True:
# 保持浏览器窗口在脚本结束后不自动关闭(便于调试)
q1.add_experimental_option("detach", True)

# 初始化Chrome浏览器实例
# service参数:指定ChromeDriver可执行文件路径(使用原始字符串r前缀避免转义问题)
# options参数:应用上面设置的浏览器选项
a1 = webdriver.Chrome(
    service=Service(r'E:\temp\PythonTemp\Selenium\chromedriver.exe'),
    options=q1
)

# 注意:
# 1. chromedriver.exe需要与已安装的Chrome浏览器版本匹配
# 2. 路径中的r前缀确保Windows路径中的反斜杠被正确解析
# 3. detach=True时,最后需要手动调用a1.quit()关闭浏览器

2、操作练习

  • 函数模版: def main(): return
  • time.sleep(3):强制等待 3 秒(慎用)。注意:使用时需要import time
  • web.close():关闭当前标签页,web.quit() 关闭浏览器。
  • web.maximize_window():最大化
  • web.minimize_window():最小化
  • web.set_window_position(100, 100):设置浏览器位置
  • web.set_window_size(800, 600):设置浏览器大小
  • web.refresh():刷新浏览器
  • web.get_screenshot_as_file("1.png"):截图浏览器并保存成png文件到当前文件夹下
  • 可以在网页F12之后的控制台中输入进行查找元素:document.getElementById("name")
  • 八大定位:可以用find_elements来返回一组值,在使用数组方式来获取其中一个
  1. name1 = web.find_element(By.ID, "loginname"):查找id为loginname的元素,有则返回
  2. name1 = web.find_element(By.NAME, "loginname"):查找name为loginname的元素,有则返回
  3. name1 = web.find_element(By.CLASS_NAME, "el-radio__label"):如果有class可用注意:定位的class值不能有空格,否则报错
  4. name = web.find_elements(By.TAG_NAME, "input"):查找标签名:input的元素,一般要配合数组来使用
  5. name = web.find_element(By.LINK_TEXT, "你好"):通过a标签文本内容来获取元素,它是精确查询,需要模糊查询是PARTIAL_LINK_TEXT
  6. name = web.find_element(By.CSS_SELECTOR, "#loginname"):通过#(id); .(class); 不加标签(标签头);任意类型格式注意是精确值,但在type后加个*表示为模糊值,^是开头值,$是结尾值:name = web.find_element(By.CSS_SELECTOR, "[type='submit']")更简单的做法是直接F12后复制它的selector然后直接使用即可
  7. button1 = web.find_element(By.XPATH, '//button[@type="button"]'):使用属性加路径定位,注意:它也可以在浏览器控制台中复制-XPATH,但有些动态变化的不起作用这时候需要复制完整XPATH
  8. 即5中的模糊查询
  • name1.send_keys(""):输入内容
  • button1.click():点击元素
  • name1.clear():清空
  • web.implicitly_wait(5)#隐式等待:一旦获取到元素即可继续执行
  • 日期类:web.find_element(By.XPATH, "你的XPATH").send_keys("0020251001")
  • 附件:web.find_element(By.XPATH, "/html/body/div[1]/div/div[1]/form/div[4]/div/button").send_keys(r'你文件的绝对路径')
  • webs = web.window_handles:获取全部标签页的句柄
  • web.switch_to.window(webs[0]):切换标签页
  • 处理警告弹窗
方法作用
alert.accept()点击“确定”
alert.dismiss(点击“取消”(Confirm/Prompt)
alert.text获取弹窗文本
alert.send_keys()向Prompt弹窗输入文本
  • iframe处理:先获取iframe元素,之后进入到里面的页面再进行操作。 image.png
  • text = web.find_element(By.XPATH, "").text:获取文本内容
  • web2D.find_element(By.XPATH, "").is_displayed():是否是可见内容
  • web.back():标签页后退
  • web.forward():标签页前进
  • 判断是否可编辑:is_editable = input_element.is_enabled()
  • 创建文件并写入:
with open('new_file.txt', 'w', encoding='utf-8') as f:
    f.write("使用pathlib创建的文件内容")
with file_path.open('a', encoding='utf-8') as f:
  • 抛出错误
try:
    WebDriverWait(web, 1).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, '.search_div_box no_data_text'))
    )
    # 如果1秒内找到元素,会执行到这里(但您没有写任何操作)
except TimeoutException:
    pass  # 1秒内未找到元素,跳过并继续执行后续代码
  • 需要另开一页操作:
# 执行JavaScript代码来打开新标签页并访问指定网址
web.execute_script(
    "window.open('目标网址');")
# 获取所有打开的窗口句柄
tabs = web.window_handles
# 切换到新打开的标签页
web.switch_to.window(tabs[1])
  • 打印所有元素
all_options = web.find_elements(By.CSS_SELECTOR, "div.search_choose_item")
print("所有可用选项:")
for opt in all_options:
    print(opt.text)  
  • 直接执行 JavaScript 点击
driver.execute_script("arguments[0].click();", element)
  • 循环输入执行函数格式:

while True:
    user_input = input("请输入字符串(或输入 'exit' 退出): ").strip()
if user_input.lower() == 'exit':
        print("退出程序")
        break  # 退出循环
    
    if user_input:  # 非空输入才处理
        process_string(user_input)
    else:
        print("输入不能为空!")
  • python中导入其他包方法:
# 从技能包下Skill.py中导入extract_data_from_txt方法
from 技能.Skill import extract_data_from_txt
  • 3ActionChains(web).move_to_element(input_element).click().perform() 是 Selenium 中模拟更真实用户操作的一种方式,它比直接 element.click() 更可靠,特别是在处理复杂网页时。下面详细解释它的作用和原理:
ActionChains(web)          # 创建动作链对象
.move_to_element(input_element)  # 将鼠标移动到目标元素
.click()                   # 执行点击操作
.perform()                 # 执行所有缓存的动作
  • 4 正则表达式测试网站:https://regex101.com/

  • 5 ?:前面的一个字符出现0或1次。* :前面一个字符出现0或多次。+:匹配出现1次以上。{}:匹配几次,也可指定范围:如

    image.png表示匹配出现2次以上的。匹配多个多次出现(元素)+。或:(a|b)匹配a或者b。[]表示所有元素都取自这里面,a-zA-Z0-9表示所有英文和数字。^在[]中表示排除,外面表示匹配行首的元素如^a与此相反匹配行尾的是a$。元字符:\d数字字符;\w单词字符(包含_、英文、数字);\s空白符包含tab和换行符(而\D表示非数字字符、\W非单词字符、\S非空白字符)。任意字符:<.>。

点击按钮(需要滚动到达并等待加载)

# 先滚动到主体表格的第i行
row = web3D.find_element(By.XPATH, f"你的XPATH")
web3D.execute_script("arguments[0].scrollIntoView({block: 'center', inline: 'nearest'});", row)
# 然后等待固定列部分的编辑按钮可点击并点击
button1 = WebDriverWait(web3D, 10).until(EC.element_to_be_clickable(
    (By.XPATH, f"你的XPATH")))
button1.click()