吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3173|回复: 18
收起左侧

[Python 转载] 爬虫之selenium登录验证码简单网站

[复制链接]
txq0211 发表于 2022-3-28 16:59
打个广告ddddocr乃真神器,用起来太简单了。
先用简单验证码网站练习练习。
验证码刷新会变,直接保存也和登录页面上的不同,因此先截图后识别。
QQ截图20220328164843.jpg

直接上代码,不到之处,请大神指正
[Python] 纯文本查看 复制代码
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[last()]").click()
    sleep(5)
    # 9、关闭浏览器并退出
    driver.close()

免费评分

参与人数 3吾爱币 +3 热心值 +2 收起 理由
kongdang1 + 1 用心讨论,共获提升!
w2516924 + 1 + 1 热心回复!
sysmnbvcxz123 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

kof21411 发表于 2022-3-28 17:48
[Python] 纯文本查看 复制代码
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[last()]").click()
    sleep(5)
    # 9、关闭浏览器并退出
    driver.close()

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
qylisten + 1 + 1 谢谢@Thanks!

查看全部评分

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

[Python] 纯文本查看 复制代码
code_png_lel.screenshot('./code.png')

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
txq0211 + 1 + 1 我很赞同!

查看全部评分

 楼主| txq0211 发表于 2022-3-28 17:34
本帖最后由 txq0211 于 2022-3-28 17:44 编辑

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


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

[Python] 纯文本查看 复制代码
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[last()]").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
[mw_shl_code=python,true]from selenium import webdriver
import ddddocr
from selenium.webdriver.chr ...

哈哈,谢谢,更简洁了
头像被屏蔽
xiadongming 发表于 2022-3-28 22:56
提示: 作者被禁止或删除 内容自动屏蔽
helloworld2022 发表于 2022-3-29 08:16
那种汉字、如果是个加法或者减法,可以识别到吗?现在的验证码都千奇百怪了。还有旋转验证。。。。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 05:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表