利用selenium+chrome模拟登陆合工大信息门户并进行自动填写测评

最近学校要填写对于老师的评教,不填写的就无法进行下周的选课∑^)/

我这么懒,自然不想一个一个点进去填写,想到最近在学爬虫,干脆写一个爬虫帮我弄算了

╭~~~╮
(o~.~o)

首先打开我们学校的信息门户:http://my.hfut.edu.cn/(仅限校园网)

可以看到我们学校的北门\(0^◇^0)/

可以看出来,用户名和密码还是很好填的,这个验证码就很麻烦了......

我选择的方法是,直接保存屏幕截图,然后利用定位元素位置定量裁剪图片,然后利用图像识别识别图中验证码, 当然,直接选图片自然是不行,要对图片先进行处理,这里,我选择的是对图像进行灰度处理,并且去除噪点,需要注意的是,很多情况下,验证码是错的,所以需要手动输入

def convert(im):    #先将图片进行灰度处理,也就是处理成单色,然后进行下一步单色对比    imgrey = im.convert(‘L‘)    #去除图片噪点,170是经过多次调整后,去除噪点的最佳值    ‘‘‘    其实就是对已处理的灰度图片,中被认为可能形成验证码字符的像素进行阀值设定,    如果阀值等于170,我就认为是形成验证码字符串的所需像素,然后将其添加进一个空table中,    最后通过im.point将使用table拼成一个新验证码图片    ‘‘‘    threshold = 170    table = []    for i in range(256):        if i < threshold:            table.append(0)        else:            table.append(1)    #使用table(是上面生成好的)生成图片    out = imgrey.point(table,‘1‘)    out.save( ‘2222.jpeg‘,‘jpeg‘)    #读取处理好的图片的路径    # a = pic_path + ‘/‘ + ‘cjb‘ + str(threshold) + ‘.jpeg‘

img3 = Image.open(‘2222.jpeg‘, ‘r‘)    # 将图片中的像素点识别成字符串(图片中的像素点如果没有处理好,    # 可能在识别过程中会有误差,如多个字符少个字符,或者识别错误等)    vcode = pytesseract.image_to_string(img3)

print(vcode)  # 此句也是测试结果时使用的    return vcode#此句才是将被破解的验证码字符串返回给需要的代码的

def Verification_code():    browser.save_screenshot(‘e://aa.png‘)    imgelement = browser.find_element_by_xpath(‘//*[@id="captchaImg"]‘)  # 定位验证码    location = imgelement.location  # 获取验证码x,y轴坐标    size = imgelement.size  # 获取验证码的长宽    rangle = (int(location[‘x‘] + 230), int(location[‘y‘] + 70), int(location[‘x‘] + size[‘width‘] + 245),              int(location[‘y‘] + size[‘height‘] + 80))  # 写成我们需要截取的位置坐标    i = Image.open("e://aa.png")  # 打开截图    frame4 = i.crop(rangle)  # 使用Image的crop函数,从截图中再次截取我们需要的区域    frame4.save(‘0000.png‘)

im = Image.open(‘0000.png‘).convert(‘L‘)    pytesseract.pytesseract.tesseract_cmd = ‘C:\/Program Files (x86)\/Tesseract-OCR\/tesseract.exe‘    text1 = pytesseract.image_to_string(im)    print(text1)    text1 = pytesseract.image_to_string(im)    print(text1)    text1 = pytesseract.image_to_string(im)    print(text1)    text1 = pytesseract.image_to_string(im)    print(text1)    text1 = pytesseract.image_to_string(im)    print(text1)    text2 = convert(im)    if len(text1) == 4:        if len(text2) == 4:            text = text1    else:        if len(text2) ==4:            text = text2        else: text = text1    return text

def log_in():
    browser.get(url)
    input_user = wait(
        EC.presence_of_element_located((By.CSS_SELECTOR, ‘#username‘))
    )
    input_pw = wait(
        EC.presence_of_element_located((By.CSS_SELECTOR, ‘#password‘))
    )
    input_yanzhengma = wait(
        EC.presence_of_element_located((By.CSS_SELECTOR, ‘#code‘))
    )
    confirm = input(‘是否使用默认账户登录:‘)
    if confirm == ‘y‘:
        user = ‘2016214224‘
        pw = ‘leiheng.1.1‘
    else:
        user = input("账号:")
        pw = input("密码:")
    input_user.send_keys(user)
    input_pw.send_keys(pw)

    text = Verification_code()
    if text:
        print(‘验证码获取成功...\n验证码为:‘, text)
        input_yanzhengma.send_keys(text)
    else:
        print(‘验证码获取失败‘)
        if ‘0000.png‘:
            print(‘验证码保存成功...‘)
            text = input(‘请查看图片,输入验证码:‘)
            input_yanzhengma.send_keys(text)

    Confirm_login()

def Repeat_verification(chance):
    if not chance:
        print(‘验证码错误,请手动输入验证码...‘)
        if ‘0000.png‘:
            print(‘验证码已保存...‘)
            text = input(‘请查看图片,输入验证码:‘)
            input_yanzhengma = wait(
                EC.presence_of_element_located((By.CSS_SELECTOR, ‘#code‘))
            )
            input_yanzhengma.clear()
            input_yanzhengma.send_keys(text)
            Confirm_login()

def Confirm_login():
    submit = wait(
        EC.element_to_be_clickable((By.CSS_SELECTOR,
                                    ‘#loginForm > table:nth-child(1) > tbody > tr:nth-child(3) > td > input[type="submit"]:nth-child(3)‘))
    )
    submit.click()
    try:
        new_button = wait(
            EC.element_to_be_clickable((By.CSS_SELECTOR,
                                        ‘#pf7802 > div > div.portletContent > table > tbody > tr:nth-child(2) > td:nth-child(1) > table > tbody > tr:nth-child(1) > td > a > img‘))
        )
        print(‘登录成功...‘)
        return 1
    except TimeoutException:
        Repeat_verification(0)
        return 0

  之后,就可以选择继续填写老师的评测了,当然,中间需要跳转几个网页。



def questionnaire():
    new_button = wait(
        EC.element_to_be_clickable((By.CSS_SELECTOR,
                                    ‘#pf7802 > div > div.portletContent > table > tbody > tr:nth-child(2) > td:nth-child(1) > table > tbody > tr:nth-child(1) > td > a > img‘))
    )
    new_button.click()
    windows = browser.window_handles
    browser.close()
    browser.switch_to.window(windows[-1])

    new_test = wait(
        EC.element_to_be_clickable((By.CSS_SELECTOR, ‘#e-op-area > div > div > div > div > div:nth-child(7) > div‘))
    )
    new_test.click()
    windows = browser.window_handles
    browser.close()
    browser.switch_to.window(windows[-1])
    time.sleep(2)
    html = browser.page_source
    partten = re.compile(‘<a name=.*?url="(.*?)">(.*?)</a>‘, re.S)
    items = re.findall(partten, html)
    for item in items:
        teacher = item[1]
        print(‘正在进行‘+teacher+‘老师的测评‘)
        next_page = ‘http://jxglstu.hfut.edu.cn‘ + item[0]
        url = next_page
        browser.get(url)
        blist = [‘达到目标‘, ‘匹配‘, ‘契合‘, ‘认真‘, ‘能充分利用教材设计教学方案,并做好教学预设。‘,
                 ‘能合理地利用现代教育技术手段。‘, ‘能合理地运用多种教学方法。‘, ‘能根据教学设计组织教学活动,并对学生进行有效引导 。‘
            , ‘学生积极参与教学活动,较好地掌握所学知识和技能,并对其发展产生积极影响。‘, ‘能根据学生对课堂内容的掌握情况,适当拓展与延伸专业知识,激发学生学习兴趣,并拓展学生的学习视野。‘]
        for i in range(10):

            b = wait(
                EC.element_to_be_clickable((By.CSS_SELECTOR, ‘[value="‘ + blist[i] + ‘"]‘))
            )
            b.click()
            print(teacher+‘老师的评测以结束,进行下一位老师的评测‘)
        submit_test = wait(
            EC.element_to_be_clickable((By.CSS_SELECTOR, ‘#save-button‘))
        )
        time.sleep(2)
        submit_test.click()
        time.sleep(1)

  到这里基本上已经结束了。

有几点需要总结:

1)从登陆模块来看,目前无法解决如何将密码输入时进行隐藏,

2)从验证码模块来看,目前图像识别还是很难

3)从转跳网页来看,要注意将操作从先前的窗口转移到下一个窗口,不然很容易导致查询网页元素时找不到而心烦意乱

4)从页面加载来看,要注意合理选择页面加载的标志性元素,保证页面中需要的元素以及全部加载成功

5)从查找元素来看,要注意对延迟性操作的延迟时间的控制,注意网速,并且合理在BeautifulSoup以及PyQuery和正则表达式中合理选择。

6)从对元素的操作来看,注意元素的操作方式是否正确

7)从窗口的关闭来说,browser.close()仅仅关闭一个窗口;而browser.quit()关闭的是由这个browser所加载的各个进程,注意结尾使用

8)有一个很尴尬的情况,图像识别中pytesseract.image_to_string很多时候什么都识别不出来,也不知道出了什么问题

时间: 2024-10-09 09:40:42

利用selenium+chrome模拟登陆合工大信息门户并进行自动填写测评的相关文章

Python模拟登陆:模拟登陆电子科大信息门户测试

最近在学习Python的网络操作,网上有很多模拟登陆方法.这里做个笔记. 没有验证码的还是比较容易的. #coding:utf-8 import re import urllib import urllib2 import cookielib import os import json import sys import time from urllib import quote,unquote from urllib2 import HTTPError from urllib2 import

利用Selenium爬取淘宝商品信息

一.  Selenium和PhantomJS介绍 Selenium是一个用于Web应用程序测试的工具,Selenium直接运行在浏览器中,就像真正的用户在操作一样.由于这个性质,Selenium也是一个强大的网络数据采集工具,其可以让浏览器自动加载页面,这样,使用了异步加载技术的网页,也可获取其需要的数据. Selenium模块是Python的第三方库,可以通过pip进行安装: pip3 install selenium Selenium自己不带浏览器,需要配合第三方浏览器来使用.通过help命

利用Python与selenium自动化模拟登陆12306官网!

近年来,12306的反爬越来越来严重,从一年前的 获取tk参数后到现在增加了 JS.CSS等加密方式! 目前大部分人利用的登陆方式都是利用selenium ,此文也不例外. 环境:        Windows python 3.6.5 模块:      selenium pyautogui      time 第一步: 实例化一款浏览器,并进入到12306官网 driver = webdriver.Chrome() driver.get('https://kyfw.12306.cn/otn/r

selenium 12306模拟登陆

代码应用场景 :基于第三方打码网站模拟登陆12306 验证码识别 基于第三方平台超级鹰识别 超级鹰官网:http://www.chaojiying.com/user/ 超级鹰使用流程: 注册 登陆(用户中心)充值 创建一个软件:软件ID->生成一个软件ID(901977) 下载实例代码->开发文档->python 1. 重新封装在打码平台下载到的python代码 #!/usr/bin/env python # coding:utf-8 import requests from hashl

Chrome无法登陆账户同步信息解决方法 SSH代理模式

1.首先有一个国外的VPS.linode.ramnode都可以,能ssh登陆就行. 2.使用工具MyEnTunnel,用ssh代理链接 3.火狐下载FoxyProxy Standard插件,设置代理为socks5...代理主机为本地主机127.0.0.1,端口号和myentunnel一致. 4.火狐打开foxyproxy的chrome版,然后使用http://chrome-extension-downloader.com/ 下载.crx的扩展文件.多试几次,把https://chrome.goo

Python模拟登陆万能法-微博|知乎

Python模拟登陆让不少人伤透脑筋,今天奉上一种万能登陆方法.你无须精通HTML,甚至也无须精通Python,但却能让你成功的进行模拟登陆.本文讲的是登陆所有网站的一种方法,并不局限于微博与知乎,仅用其作为例子来讲解. 用到的库有"selenium"和"requests".通过selenium进行模拟登陆,然后将Cookies传入requests,最终用requests进行网站的抓取.优点就是不但规避了"selenium"其本身抓取速度慢的问题

Python模拟登陆万能法

此文转自:https://zhuanlan.zhihu.com/p/28587931   转录只是为了方便学习,感谢他的分享 Python模拟登陆让不少人伤透脑筋,今天奉上一种万能登陆方法.你无须精通HTML,甚至也无须精通Python,但却能让你成功的进行模拟登陆.本文讲的是登陆所有网站的一种方法,并不局限于微博与知乎,仅用其作为例子来讲解. 用到的库有"selenium"和"requests".通过selenium进行模拟登陆,然后将Cookies传入reque

python模拟登陆实践

对于一些需要登陆的网址爬取数据,需要登录才能访问.本文介绍如何利用python进行模拟登陆 准备工具: 1.搭建django 框架 用于模拟登陆 2.fiddler抓包工具,chrome浏览器 3.pycharm   编辑器 步骤: 1.开启django 服务,这里就不多描述,直接百度一下,就能找到很多答案(记得创建一个superuser,以便后面的登陆 ) 进入 http://127.0.0.1:8000/admin/     这是django自带的后台,进行登陆时,django自带了  cs

Python爬虫(二十二)_selenium案例:模拟登陆豆瓣

本篇博客主要用于介绍如何使用selenium+phantomJS模拟登陆豆瓣,没有考虑验证码的问题,更多内容,请参考:Python学习指南 #-*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.common.keys import Keys import time #如果获取页面时获取不到文本内容,加入下面参数 driver = webdriver.PhantomJS(service_args=[