Selenium实现绕过登录验证

ShowUNow 发布于 2024-11-06 121 次阅读


很多时候我们想要对网站进行的操作都需要登录才能实现,但是一些网站(尤其是小型网站)对于人机验证非常严格,登录时需要进行人机验证,无法直接通过Selenium来实现操作。

这个时候我们可以事先将登录的cookie保存下来,然后再通过Selenuim自动化程序将保存好的cookie导入进来,实现绕过登录的操作

注意:此方法只适用于cookie有效期较长的网站

假设你已经实现安装好了Chromechromedriver

一、首先在Linux地虚拟机上运行

google-chrome --remote-debugging-port=9222 --user-data-dir=/Browseruser

这行代码的含义

1. google-chrome

这个命令用于启动 Chrome 浏览器。在某些系统中(如 Linux),你可以使用 google-chrome 来调用 Chrome 浏览器。如果你在 Windows 上,可以用 chromechrome.exe

2. --remote-debugging-port=9222

这个选项启用 Chrome 的远程调试功能,并指定一个端口号(9222)。具体功能如下:

  • --remote-debugging-port=9222 启动了 Chrome 的远程调试协议,允许其他应用程序或脚本通过 WebSocket 连接到 Chrome 浏览器进行调试。
  • 端口 9222 是默认端口,您可以使用任何未被占用的端口。

通过这个端口,您可以远程控制浏览器,获取页面内容、执行脚本、调试页面等操作。这是开发者工具的一部分,常用于自动化测试、抓取数据、调试网页等。

3. --user-data-dir=/Browseruser

这个选项指定了一个自定义的用户数据目录(/Browseruser),用来存储 Chrome 的配置和浏览历史等数据。具体功能如下:

  • --user-data-dir=/Browseruser 使 Chrome 使用这个目录来存储所有用户数据(如 cookie、缓存、浏览历史、书签等),而不是使用默认的用户数据目录。
  • 这个目录通常用于分离不同的浏览器配置(例如,您可能希望在不同的环境中使用不同的 cookie 或设置,而不影响主浏览器的设置)。
  • 这样可以避免在同一台计算机上使用多个不同配置时产生冲突,也避免了每次都需要重新登录、设置浏览器等。

然后你就会看到Chrome浏览器被打开了,然后输入你的想要登录的网址URL,并进行登陆操作,登陆完成后

二、执行以下保存Cookie为文件代码

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
import time
import pickle

# 配置远程调试选项
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")  # 附加到远程调试端口

# 使用已有的 Chrome 会话
# driver = webdriver.Chrome(service=Service(r"/Browseruser"), options=chrome_options)
#chrome_options.add_argument(r'--user-data-dir=/Browseruser') # 设置用户文件夹,可免登陆
chrome_options.add_argument("--window-size=1280,720") # 设置窗口大小
chrome_driver = r"/local/user/bin/chromedriver.exe" # 你driver的路径
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)

# 确认 Selenium 附加成功
driver.get("url")  # 或者你想要访问的已登录网站
time.sleep(5)  # 等待页面加载

# 获取登录后的 Cookies
cookies = driver.get_cookies()
print(cookies)

# 将 Cookies 保存到文件
with open("cookies.pkl", "wb") as file:
    pickle.dump(cookies, file)

driver.quit()

之后你就可以看到在当前目录下有一个叫cookies.pkl的文件,这个就是你登录时保存下来的cookie文件,之后需要用到它导入进你需要实现自动化的程序中。

在你的自动化selenium中加入以下代码

三、执行导入Cookie文件的操作。

之后在你的代码中添加以下代码

# 打开网页
    driver.get(url)

    # 加载 Cookies
    try:
        with open("cookies.pkl", "rb") as file:
            cookies = pickle.load(file)

        # 设置 Cookies
        for cookie in cookies:
            if "domain" in cookie:
                del cookie["domain"]  # 删除 domain,避免可能的冲突
            driver.add_cookie(cookie)
    except FileNotFoundError:
        send_telegram_message("无法找到Cookies文件,需手动登录。")
        print("Cookies文件未找到")
        return

    # 刷新页面,等待元素加载
    driver.refresh()

注意:一定要有最后一行的driver.refresh()操作,这样才能正确地加载cookie文件

将代码中地url替换为你的目标网站

然后再执行你的自动化程序就可以看到成功的绕过了网站的登录

临时起意搭建的博客,不知道能坚持下去多久。
最后更新于 2024-11-08