python青年大学习一键提醒(二)

青年大学习一键提醒 第二期

解决自动登陆问题(cookie问题)

上一期的内容是要手动复制cookie的,还没能进行自动登陆,下面这个就是解决登陆问题,难是难在验证码的识别(个人觉得,大佬勿喷)
上一次使用requests,这一次就用 selenium 模拟浏览器来写
当然也可以用requests的,只是我还没试过,比较忙(摸鱼
这里是用谷歌浏览器为例子


第零步(已安装,可退出)

安装webdriver的驱动
下载地址: 谷歌驱动下载
安装详细:详细教程在这里

第一步

在浏览器打开这个网址
python青年大学习一键提醒(二)_第1张图片
先退出,找到登陆的入口
python青年大学习一键提醒(二)_第2张图片
找到了登陆的入口网址
python青年大学习一键提醒(二)_第3张图片
这里的网址登陆入口有两个

http://m.fjcyl.com/logout
http://m.fjcyl.com/login
这两个都可以

按F12进行查阅

python青年大学习一键提醒(二)_第4张图片

        url = 'http://m.fjcyl.com/login'
        chrome_path = r"D:\Download\Dirver\chromedriver_win32\chromedriver.exe"  
        # 驱动的路径
        driver = webdriver.Chrome(executable_path=chrome_path)
        driver.get(url)
        # sleep(1)  # 等待网络
        
        driver.find_element_by_id('userName').clear()
        driver.find_element_by_id('userName').send_keys(username)  # 你的手机号

        driver.find_element_by_id('pwd').clear()
        driver.find_element_by_id('pwd').send_keys(password)   # 你的密码

验证码的处理(重点)

这里的验证码我是采取截图的方式,然后识别来进行的。用的是别人的网络,其实也可以自己训练一个,但没必要,怎么方便怎么来。
当然机器识别的话,有时候也是会出错的。

截图的话就是截出这一张图片
python青年大学习一键提醒(二)_第5张图片

        driver.save_screenshot("./TempImage/01.png")  # 截取屏幕内容,保存到本地
        ran = Image.open("./TempImage/01.png")  # 打开截图,获取验证码位置,截取保存验证码
        box = (900, 690, 980, 750)  
        # 获取验证码位置,自动定位不是很明白,就使用了手动定位,代表(左,上,右,下)
        # 这是我自己一次次尝试,试出来的,二分法懂得都懂
        ran.crop(box).save("./TempImage/02.png")  # 把获取的验证码保存
        # 获取验证码图片,读取验证码
        imageCode = Image.open("./TempImage/02.png")  # 打开保存的验证码图片
        sharp_img = ImageEnhance.Contrast(imageCode).enhance(2.0)  # 图像增强,二值化
        sharp_img.save("./TempImage/03.png")  # 保存图像增强,二值化之后的验证码图片
        sharp_img.load()  # 对比度增强
        img = Image.open('./TempImage/03.png')

由于用的是pytesseract,所以识别的正确率就是会很低,所以这里就要提升一下这里的正确率

        img = img.convert('RGB')  # 这里也可以尝试使用L
        enhancer = ImageEnhance.Color(img)
        enhancer = enhancer.enhance(0)     			  # 增强器
        enhancer = ImageEnhance.Brightness(enhancer)  # 增强亮度
        enhancer = enhancer.enhance(2)
        enhancer = ImageEnhance.Contrast(enhancer)    # 增强对比度
        enhancer = enhancer.enhance(8)
        enhancer = ImageEnhance.Sharpness(enhancer)   # 增前锐度
        img = enhancer.enhance(20)
        code = pytesseract.image_to_string(img)
        print(code)  # 输出验证码

然后就可以把验证码识别接上去了。
python青年大学习一键提醒(二)_第6张图片

        driver.find_element_by_id('VALIDATE_CODE').send_keys(code)
        element1 = driver.find_element_by_xpath("/html/body/div[1]/div[2]/div/input")
        driver.execute_script("arguments[0].click();", element1)
        dictCookies = driver.get_cookies()  # 获取cookie
        sleep(2)
        driver.close()
        return dictCookies[0]["value"]

这就是我处理验证码的方法,当然也可以通过抓取验证码图片,但是我试了一下,发现不太行,可能是我的问题,因为请求拿到了验证码的时候,保存在了本地,但是输入验证码之后,好像这个验证码就变了,就不是保存在本地的验证码了,不知道为啥,就是提示验证码错误,很奇怪,我后来才用这种截图的方法的
不然我都用requests来做了,就不用selenium了


最后

补上获取自己组织的ordID的方法

BASE_INFO = {
     
    "abbreviation": "",
    "orgId": "",
    "address": "",
    "orgName": "",
}  # 放在全局就可以使用orgId了
def GetSchoolInfo(headers):  # 学校信息
    try:
        URL = "http://m.fjcyl.com/admin/user/orgList"
        info_rsp = session.post(url=URL, headers=headers)
        info_json = info_rsp.json()
        abbreviation = info_json["rs"][0]["cylorganization"]["abbreviation"]  
        # 19大数据
        orgId = info_json["rs"][0]["cylorganization"]["orgId"]  # 团支部id
        address = info_json["rs"][0]["cylorganization"]["address"]  # 福州大学
        orgName = info_json["rs"][0]["cylorganization"]["orgName"]  # 福州大学数学与计算机科学学院2019级大数据团支部
        BASE_INFO["abbreviation"] = abbreviation
        BASE_INFO["orgId"] = orgId
        BASE_INFO["address"] = address
        BASE_INFO["orgName"] = orgName
        return BASE_INFO
    except Exception as err:
        print(err)
        return "500"

完成版放在另外一个博客上(三)中
点击这里

你可能感兴趣的:(python爬虫,python,selenium,图像识别)