模拟登录1-古诗文网

import requests
from lxml import etree
from PIL import Image
import pytesseract

url = 'https://so.gushiwen.cn/user/login.aspx'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}

def login():
    session = requests.Session()
    resonpse = session.get(url=url,headers=headers)
    tree = etree.HTML(resonpse.text)
    code_img_src = 'https://so.gushiwen.cn/' + tree.xpath('//*[@id="imgCode"]/@src')[0]
    viewstate = tree.xpath('//*[@id="__VIEWSTATE"]/@value')[0]
    img_data = session.get(url = code_img_src, headers = headers).content
    with open('img.jpg','wb') as f:
        f.write(img_data)

    image = Image.open('img.jpg')
    #需要将图片转为RGB格式
    image = image.convert('RGB')
    code = pytesseract.image_to_string(image)
    if(len(code) >= 4):
        code = code[:4]
        print('验证码为:'+ code)
        # 组织fromdata
        data = {
            '__VIEWSTATE' : viewstate,
            '__VIEWSTATEGENERATOR': 'C93BE1AE',
            'email': 'xxxx',
            'pwd': 'xxxx',
            'code': code,
            'denglu': '登录'
        }
        response = session.post(url=url,data=data)
        if(response.status_code == 200):
            print(len(response.text))
            tree = etree.HTML(response.text)
            login_flag = tree.xpath('//*[@id="html"]/body/div[2]/div[1]/span[1]')
            if(login_flag):
                print('登录成功!')
            else:
                print('login failed !')
                return login()
    else:
        print('识别失败,重新登录!')
        return login()


# 由于tesserate识别准确录太低,所以进行了多次识别,登录成功后才返回
if __name__ == '__main__': 
    login()

对于这种简单的字符验证码可以借助tesseract等orc来进行识别,虽然免费,但是识别准确率较低。

登录效果

AZ3S.
验证码为:AZ3S
13011
login failed !
PM28
验证码为:PM28
13853
登录成功!

对于这种简单的字符验证码分为以下几种情况

1.验证码的url不变,验证码也不变

这种情况最简单,直接解析出验证码的url,直接向验证码的url发起请求,保存验证码,然后进行识别

2. 验证码的url不变,验证码一直在变

这种情况在向目标网址发起请求时,实例化一个session,用session来维持会话,并用session来向验证码的url发起请求(本例就是此种形式)

3. 验证码的url后面加上随机参数,且验证码一直变

function reload() {
    var verifyObject = $('#code_img');
    verifyObject.attr('src',verifyObject.attr('src').split('?')[0]+'?'+Math.random());
}
原因:浏览器下使用GET发送请求时,如果两次请求的地址和参数相同,
在不刷新页面的情况下,浏览器会缓存第一次请求的内容,服务端更新后浏览器仍然显示第一次的内容。 


因此,GET请求URL后加随机数或者时间戳,让服务器认为不是相同的请求。进而加载不同的验证码。

此种方式按第一种方式处理
Selenium 是一个广泛使用的自动化测试工具,它支持模拟用户操作,包括浏览器导航、表单填写、点击等。如果你想使用 Selenium 来登录古诗文,你需要按照以下步骤操作: 1. **安装所需库**:首先需要安装 Python 的硒库(selenium WebDriver),可以使用 pip 安装 `webdriver_manager` 和 `selenium`。 ```bash pip install webdriver_manager selenium ``` 2. **下载驱动**:由于古诗文通常使用特定版本的浏览器(如 Chrome 或 Firefox),你需要下载对应的WebDriver(比如 chromedriver 或 geckodriver)。可以从官下载对应浏览器的最新版:https://sites.google.com/a/chromium.org/chromedriver/downloads 3. **初始化浏览器和登录过程**: - 导入必要的模块并初始化浏览器实例。 - 访问古诗文登录页面。 - 使用 `find_element_by_*` 方法找到登录表单元素,如用户名输入框(`id="username"`)、密码输入框(`id="password"`)和登录按钮。 - 输入用户名和密码。 - 调用 `submit()` 或 `click()` 方法提交表单。 ```python from selenium import webdriver from selenium.webdriver.common.keys import Keys from webdriver_manager.chrome import ChromeDriverManager # 初始化Chrome浏览器 driver = webdriver.Chrome(ChromeDriverManager().install()) # 让浏览器打开古诗文登录页面 driver.get("https://www.gushiwen.org/login") # 找到登录元素并输入用户名和密码 username_field = driver.find_element_by_id("username") username_field.send_keys("your_username") password_field = driver.find_element_by_id("password") password_field.send_keys("your_password", Keys.RETURN) # 按回车键提交 # 点击登录按钮 login_button = driver.find_element_by_css_selector(".login-btn") # 根据实际CSS选择器定位 login_button.click() # 确认是否登录成功,检查跳转后的页面内容 # ... # 关闭浏览器 driver.quit() ``` 记得将 "your_username" 和 "your_password" 替换为你的账户信息。登录成功后,可以根据页面结构判断登录是否成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值