txq0211 发表于 2022-3-28 16:59

爬虫之selenium登录验证码简单网站

打个广告ddddocr乃真神器,用起来太简单了。
先用简单验证码网站练习练习。
验证码刷新会变,直接保存也和登录页面上的不同,因此先截图后识别。


直接上代码,不到之处,请大神指正
from selenium import webdriver
import ddddocr
from selenium.webdriver.chrome.service import Service
from PIL import Image
from time import sleep
from webdriver_manager.chrome import ChromeDriverManager

if __name__ == '__main__':
    # 1、自动安装对应版本的Webdriver
    s = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=s)
    # 2、打开指定的网页,设置浏览器全屏化、并截图
    driver.get("http://demo.jizhicms.cn/admin.php/Login/index.html")
    driver.maximize_window()
    sleep(0.5)
    driver.save_screenshot('aa.png')
    # 3、获取验证码的网页上面的坐标
    code_png_lel = driver.find_element_by_id('vercodeimg')
    location = code_png_lel.location
    print('location', location)
    # 4、获取验证码的长宽
    size = code_png_lel.size
    print('size', size)
    # location获取是根据百分之百缩放的,如果有缩放需按比例调整
    k = 1
    # 图片左上角和右下角的xy坐标
    rangle = (
      int(location['x']) * k, int(location['y']) * k, int(location['x'] + size['width']) * k,
      int(location['y'] + size['height']) * k
    )
    print('rangle', rangle)
    # 5、对全局页面进行截图获取局部验证码
    i = Image.open('./aa.png')
    # 按照给定xy坐标裁剪
    frame = i.crop(rangle)
    frame.save('./code.png')

    # 6、利用弟弟获取验证码
    ocr = ddddocr.DdddOcr(old=True)
    with(open("code.png", 'rb')) as g:
      image = g.read()
    code = ocr.classification(image)
    print(code)

    # 7、填写账号和验证码(已保存的可不填)
    # driver.find_element_by_name("username").send_keys("test")
    # driver.find_element_by_name("password").send_keys("123456")
    driver.find_element_by_name("vercode").send_keys(code)
    sleep(0.2)

    # 8、登录
    driver.find_element_by_xpath("//form[@class='layui-form']/input").click()
    sleep(5)
    # 9、关闭浏览器并退出
    driver.close()

kof21411 发表于 2022-3-28 17:48

from selenium import webdriver
import ddddocr
from selenium.webdriver.chrome.service import Service
from PIL import Image
from time import sleep
from webdriver_manager.chrome import ChromeDriverManager

if __name__ == '__main__':
    # 1、自动安装对应版本的Webdriver
    s = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=s)
    # 2、打开指定的网页,设置浏览器全屏化、并截图
    driver.get("http://demo.jizhicms.cn/admin.php/Login/index.html")
    driver.maximize_window()
    sleep(0.5)
    driver.save_screenshot('aa.png')
    # 3、获取验证码的网页上面的坐标
    code_png_lel = driver.find_element_by_id('vercodeimg')
        # 不用全屏截图,只把验证码所在元素保存为png图片
        code_img = code_png_lel.screenshot_as_png
    # 6、利用弟弟获取验证码
    ocr = ddddocr.DdddOcr(old=True)
    code = ocr.classification(code_img)
    print(code)

    # 7、填写账号和验证码(已保存的可不填)
    # driver.find_element_by_name("username").send_keys("test")
    # driver.find_element_by_name("password").send_keys("123456")
    driver.find_element_by_name("vercode").send_keys(code)
    sleep(0.2)

    # 8、登录
    driver.find_element_by_xpath("//form[@class='layui-form']/input").click()
    sleep(5)
    # 9、关闭浏览器并退出
    driver.close()

banro512 发表于 2022-3-28 17:26

18 行- 36行
获取验证码图片元素后,直接截图不就行了吗,需要那么麻烦吗


code_png_lel.screenshot('./code.png')

txq0211 发表于 2022-3-28 17:34

本帖最后由 txq0211 于 2022-3-28 17:44 编辑

banro512 发表于 2022-3-28 17:26
18 行- 36行
获取验证码图片元素后,直接截图不就行了吗,需要那么麻烦吗


感谢大神,这段我是抄别人的。对selenium不够熟练。
原有的还是不动吧,百度上的都是获取坐标再截图,有些无法理解,求知道的大神指点。
代码简化如下:
from selenium import webdriver
import ddddocr
from selenium.webdriver.chrome.service import Service
from time import sleep
from webdriver_manager.chrome import ChromeDriverManager

if __name__ == '__main__':
    # 1、自动安装对应版本的Webdriver
    s = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=s)
    # 2、打开指定的网页,设置浏览器全屏化、并截图
    driver.get("http://demo.jizhicms.cn/admin.php/Login/index.html")
    driver.maximize_window()
    sleep(0.5)
    # 3、获取验证码的网页上面的坐标
    code_png_lel = driver.find_element_by_id('vercodeimg')
    code_png_lel.screenshot('./code.png')
    # 4、利用弟弟带个刀获取验证码
    ocr = ddddocr.DdddOcr(old=True)
    with(open("code.png", 'rb')) as g:
      image = g.read()
    code = ocr.classification(image)
    print(code)

    # 5、填写账号和验证码(已保存的可不填)
    # driver.find_element_by_name("username").send_keys("test")
    # driver.find_element_by_name("password").send_keys("123456")
    driver.find_element_by_name("vercode").send_keys(code)
    sleep(0.2)

    # 6、登录
    driver.find_element_by_xpath("//form[@class='layui-form']/input").click()
    sleep(5)
    # 7、关闭浏览器并退出
    driver.close()

吾爱有三 发表于 2022-3-28 17:11

挺好,就是不知道这个dddocr识别效率和准确度怎么样

txq0211 发表于 2022-3-28 17:23

吾爱有三 发表于 2022-3-28 17:11
挺好,就是不知道这个dddocr识别效率和准确度怎么样

简单的识别率高,复杂点的字母会有错误,有空整个稍微复杂点的识别,不对就刷新验证码循环识别

zhedie 发表于 2022-3-28 18:28

如果这个ddddocr再加入旋转验证就好了

txq0211 发表于 2022-3-28 19:20

kof21411 发表于 2022-3-28 17:48
from selenium import webdriver
import ddddocr
from selenium.webdriver.chr ...

哈哈,谢谢,更简洁了

xiadongming 发表于 2022-3-28 22:56

helloworld2022 发表于 2022-3-29 08:16

那种汉字、如果是个加法或者减法,可以识别到吗?现在的验证码都千奇百怪了。还有旋转验证。。。。。
页: [1] 2
查看完整版本: 爬虫之selenium登录验证码简单网站