带有验证码的模拟登录两种方式post和selenium

首先是验证码的识别

  • 如果验证码图片随着url地址改变而改变,即验证码的url地址是变化的,这种就很好办,直接请求并下载验证码利用打码平台进行验证码图片识别即可

  • 如果验证码图片的url地址不变,而验证码是随机改变的

  • post方法:设置session进行验证码的get请求并下载图片进行识别得到验证码的识别结果,再利用这个sesson进行post请求,把账号密码和验证码识别结果的表单数据进行post从而模拟登录

  • selenium方法:利用selenium进行页面打开,并用selenium记录下此时页面的cookies,然后用requests.get()携带这个cookies发送验证码url的请求获取验证码的识别结果,然后进行selenium的操作输入账号密码和验证码

打码平台使用的是超级鹰
此处以去哪网为例,尝试带有验证码的模拟登录
在这里插入图片描述
post方法

import requests
from chaojiying import Chaojiying_Client
import re
import sys

# 超级鹰的账号信息
account = ''
password = ''
id = ''
image_kind = 1902 # 四位英文或数字
#验证码的url地址
img_url = 'https://user.qunar.com/captcha/api/image?k={en7mni(z&p=ucenter_login&c=ef7d278eca6d25aa6aec7272d57f0a9a'
#抓包的登录url
login_url = 'https://user.qunar.com/passport/loginx.jsp'

headers = {
    # 'referer': 'https://user.qunar.com/passport/login.jsp',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
}
# 维持会话,这个方法会自动保存cookies到本地,这样才可以完成账号和验证码信息的匹配
sesson = requests.session()
response = sesson.get(img_url,headers=headers)

with open('D://验证码.jpg','wb') as fp:
    fp.write(response.content)

chaojiying = Chaojiying_Client(account, password, id)
im = open('D://验证码.jpg', 'rb').read()
image_num = chaojiying.PostPic(im, image_kind)
real_number = ''
if image_num['err_str'] == 'OK':
    print('验证码识别成功')
    print('验证码是{0}'.format(image_num['pic_str']))
    real_number = image_num['pic_str']# 获得到的验证码的识别结果
else:
    print('验证码识别失败')
    sys.exit('验证码识别错误,模拟登录失败')

form_data = {
    'loginType': 0,
    'username': xxxxxxx,# 去哪网的账号密码信息
    'password': 'xxxxxxx',
    'remember': 0,
    'vcode': real_number,
}
headers = {
    'referer': 'https://user.qunar.com/passport/login.jsp',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
}
response = sesson.post(login_url,data=form_data,headers=headers)
print(response.headers)
print(response.cookies)
account_name = 'sxpc2379'#账号的名字
match = re.search(account_name,str(response.headers),re.S)
if match:
    print('模拟登录成功')
else :
    print('模拟登录失败')
    

selenium

import requests
from chaojiying import Chaojiying_Client# 必须先把官方的Api文件放到同级目录下
from selenium import webdriver
import time

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

def get_img_num():
    account = ''
    password = ''
    id = ''
    image_kind = 1902 # 四位英文或数字

    img_url = 'https://user.qunar.com/captcha/api/image?k={en7mni(z&p=ucenter_login&c=ef7d278eca6d25aa6aec7272d57f0a9a'
    cookies = dict()
    for one in driver.get_cookies():
        cookies[one['name']] = one['value']
    response = requests.get(img_url, cookies=cookies)

    with open('D://验证码.jpg','wb') as fp:
        fp.write(response.content)

    chaojiying = Chaojiying_Client(account, password, id)
    im = open('D://验证码.jpg', 'rb').read()
    image_num = chaojiying.PostPic(im, image_kind)
    if image_num['err_str'] == 'OK':
        print('验证码识别成功')
        print('验证码是{0}'.format(image_num['pic_str']))
        return image_num['pic_str']
    else:
        print('验证码识别失败')


# 此处登录窗口没有再iframe框架里面,如果再iframe框架里面一定要先进入框架里面
def login():# 记得先在主页点一次
    url = 'https://user.qunar.com/passport/login.jsp?ret=https%3A%2F%2Fwww.qunar.com%2F%3Fex_track%3Dauto_4e23ad93'
    driver = webdriver.Chrome()
    driver.get(url)
    driver.implicitly_wait(10)
    # 切换登录模式为账号密码登录
    first_botton = driver.find_element_by_class_name('pwd-login')
    first_botton.click()

    botton1 = driver.find_element_by_class_name('radio_normal')
    button1.click()

    input1 = driver.find_element_by_xpath('//div[@class="field-login"/div[1]/input')
    input1.clear()
    input1.send_keys('账号')

    inpur2 = driver.find_element_by_xpath('//div[@class="field-login"/div[4]/input')
    input2.clear()
    input2.send_keys('密码')

    image_input = driver.find_element_by_xpath('//div[@class="field-login"/div[5]/div/input')
    image_input.clear()
    image_num = get_img_num()
    image_input.send_keys(image_num)# 输入验证码

    login_button = driver.find_element_by_id('submit')# 点击登录按钮
    login_button.click()
    cookies = driver.get_cookies()
    print(cookies)
    driver.implicitly_wait(10)
    driver.refresh()
    print(driver.page_source)

if __name__ == '__main__':
    login()
    
  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用selenium或pyppeteer可以实现模拟登录,带验证码的网站。下面是一个使用selenium的Python脚本示例,可以帮助你实现这个功能: ```python from selenium import webdriver from selenium.webdriver.common.keys import Keys import time # 创建浏览器对象并打开网页 driver = webdriver.Chrome() driver.get("https://www.example.com/login") # 等待页面加载完全 time.sleep(2) # 输入用户名和密码 username = driver.find_element_by_name("username") username.send_keys("your_username") password = driver.find_element_by_name("password") password.send_keys("your_password") # 找到验证码图片元素 captcha_img = driver.find_element_by_xpath("//img[@id='captcha-img']") # 下载验证码图片到本地 captcha_img.screenshot("captcha.png") # 使用第三方库tesseract-ocr识别验证码 import pytesseract from PIL import Image captcha_image_path = "captcha.png" captcha_image = Image.open(captcha_image_path) captcha_text = pytesseract.image_to_string(captcha_image).strip() print("验证码:", captcha_text) # 输入验证码 captcha_input = driver.find_element_by_name("captcha") captcha_input.send_keys(captcha_text) # 提交登录表单 login_button = driver.find_element_by_xpath("//button[@type='submit']") login_button.click() # 等待登录成功后的页面加载完全 time.sleep(5) # 执行其他操作 # ... # 关闭浏览器 driver.quit() ``` 这个脚本使用了selenium自带的截图功能,将验证码图片保存到本地,然后使用tesseract-ocr库识别验证码,最后输入验证码并提交登录表单。当然,你需要根据你的实际情况修改代码中的一些参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值