编程学习网 > 编程语言 > Python > Python通过Selenium实现自动登录功能教程(广州摇号系统为例)
2023
11-25

Python通过Selenium实现自动登录功能教程(广州摇号系统为例)


最近在参与广州的小汽车指标摇号,由于系统每次都需要手动输入验证码,突发奇想,能不能用Python实现自动登录呢?答案是可以的。

先来看看广州小汽车摇号系统的登录界面,长这样:

上面的登录界面并不复杂,包含三个要素:手机号码、密码、验证码。

一、实现原理

主要有三个方面:

通过Web自动化框架,对页面指定元素自动填充
正确识别验证码并自动填充
点击提交
二、涉及的Python类库

要想实现上述的自动登录功能,需要用到以下类库:

Web自动化:Selenium,对页面元素定位、填充、点击
图片处理:PIL,对验证码图片进行处理
验证码识别:pytesseract,识别验证码
三、类库安装
安装Selenium库:该类库对浏览器进行操作,如:自动打开浏览器、关闭浏览器、打开网页、输入内容、点击等。

pip install selenium

安装PIL库:处理图片,如:打开图片资源文件等。

pip install pillow

安装pytesseract库:OCR识别,识别图片中的文字,会有误差,不一定百分百准确。

pip install pytesseract

四、安装浏览器驱动由于Selenium不能直接打开浏览器,需要下载一个浏览器对应版本的驱动,Selenium通过这个驱动才能打开浏览器:这里用的是Chrome浏览器版本为118.0.5993.118
下载Chrome驱动,下载地址,注意,要下载对应版本的:

https://googlechromelabs.github.io/chrome-for-testing/#stable


下载下来后,不用打开程序文件,找个文件夹放好,配置Path环境变量:


五、了解登录流程
实现自动登录的前提是要了解页面的登录流程,尝试在摇号系统的登录页面登录时,可以看到:需要输入手机号码、输入密码、输入正码,这里有个地方需要注意的是,验证码输入错误时,会自动刷新验证码图片(不是刷新页面哦)。在验证码输入错误的情况下,需要重试。六、定位元素
了解登录流程后,需要对元素进行定位,Selenium可通过id、xpath等形式定位,此案例通过xpath进行定位,定位元素的方法如下:
定位元素

打开摇号系统登录页面,按F12键打开浏览器控制台,点击左上角的箭头

复制xpath

右键对应的元素,复制xpath即可


密码、验证码输入框定位方法同上。
五、完整Python自动登录代码
from PIL import Image

import pytesseract

from selenium import webdriver

from selenium.webdriver.common.by import By

import time

 

# 不自动关闭浏览器

options = webdriver.ChromeOptions()

options.add_experimental_option('detach', True)

 

# 打开浏览器

driver = webdriver.Chrome(options=options)

 

# 访问网页

driver.get("https://apply.jtj.gz.gov.cn/apply/")

 

# 如果不在标题中表示打开失败

assert u"广州市中小客车指标调控管理信息系统" in driver.title

 

# 找到用户名输入框

elem_mobile = driver.find_element(By.XPATH,

                                  '/html/body/div/div[2]/div/div[2]/div[1]/div[2]/div[1]/form/div[2]/div/div/input')

# 找到密码输入框

elem_pwd = driver.find_element(By.XPATH,

                               '/html/body/div/div[2]/div/div[2]/div[1]/div[2]/div[1]/form/div[3]/div/div/input')

# 找到验证码输入框

elem_valid_code = driver.find_element(By.XPATH,

                                      '/html/body/div/div[2]/div/div[2]/div[1]/div[2]/div[1]/form/div[4]/div/div['

                                      '1]/input')

# todo 输入手机号码

elem_mobile.send_keys(u"输入你的手机号码")

# todo 输入密码

elem_pwd.send_keys(u"输入你的密码")

count = 0

 

def get_text():

    global count

    # 找到截图的元素

    element_valid_code_img = driver.find_element(By.XPATH,

                                                 '/html/body/div/div[2]/div/div[2]/div[1]/div[2]/div[1]/form/div[4]/div/div[2]/img')

    # 截图

    element_valid_code_img.screenshot('D:\\yh_captcha.png')

    count = count + 1

    image = Image.open('D:\\yh_captcha.png')

    # 识别图片中的验证码,注意验证码不能保证百分百正确,

    valid_code = pytesseract.image_to_string(image)

    valid_code = valid_code.strip()

    if len(valid_code) == 0 or len(valid_code) != 4:

        # 验证码以及错误了,随便给个让系统刷新验证码重新识别 

        valid_code = 'code'

 

    # 输入验证码

    elem_valid_code.send_keys(valid_code)

 

get_text()

time.sleep(2)

 

elem_error_valid_code = driver.find_element(By.XPATH, '/html/body/div[2]/p')

elem_err = driver.find_element(By.CLASS_NAME, 'el-icon-error')

 

if elem_err.tag_name == 'i':

    if count <= 10:

        elem_valid_code.clear()

        # 验证码错误重试 

        get_text()

# 点击登录按钮 
driver.find_element(By.XPATH, '/html/body/div/div[2]/div/div[2]/div[1]/div[2]/div[3]').click()
七、测试效果第一次识别验证码失败了,第二次登录成功了。
以上就是Python通过Selenium实现自动登录功能教程(广州摇号系统为例)的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取