案例:selenium实现登录百度(如有验证码,需要手动输入)
func.py
https://www.cnblogs.com/andy9468/p/10899508.html
baidu_login.py中(如有验证码,需要手动输入)
# 导入webdriver import os import time import re from lxml import etree from selenium import webdriver from func import base642str, str2base64 # 将mm隐匿化 # import sys # print(str2base64("123456")) # str1_base64="MTIzNDU2" # print(base642str(str1_base64)) # sys.exit() print('000-正在启用selenium...') # 调用环境变量指定的PhantomJS浏览器创建浏览器对象 driver = webdriver.Chrome(r'D:\zzl\new_work\tmp\test01\baidulogin\chromedriver.exe') print('000-OK') # url = 'https://passport.baidu.com/v2/?login' print('111-selenium正在请求页面:%s' % url) driver.get(url) # get方法请求页面,获取响应 print('111-请求OK') print("打印标题") print(driver.title) # 点击账号和密码登录 input_box0 = driver.find_element_by_xpath("//p[@id='TANGRAM__PSP_3__footerULoginBtn']") input_box0.click() print('222-selenium正在填写表单...') time.sleep(1) account = "abcdef" pwd = "MTIzNDU2" verify_code = "1234" input_box1 = driver.find_element_by_xpath("//input[@id='TANGRAM__PSP_3__userName']") input_box1.send_keys(account) time.sleep(0.5) input_box2 = driver.find_element_by_xpath("//input[@id='TANGRAM__PSP_3__password']") input_box2.send_keys(base642str(pwd)) time.sleep(0.5) # 判断是否需要验证码 imgsrc = driver.find_element_by_id("TANGRAM__PSP_3__verifyCodeImg").get_attribute('src') if re.match(r'https://passport.baidu.com/cgi-bin/genimage.*', imgsrc): print("需要验证码") # 自动填写验证码 # input_box3 = driver.find_element_by_xpath("//input[@id='TANGRAM__PSP_3__verifyCode']") # input_box3.send_keys(verify_code) # 手动填写验证码 man_verify_code = input("请填写验证码:") input_box3 = driver.find_element_by_xpath("//input[@id='TANGRAM__PSP_3__verifyCode']") input_box3.send_keys(man_verify_code) print("验证码填写完成请等待") else: print("不需要验证码") print('222-填写表单OK') time.sleep(1) print('333-selenium提交表单...') one_click = driver.find_element_by_xpath("//input[@id='TANGRAM__PSP_3__submit']") one_click.click() time.sleep(1) # 判断是否需要手机号绑定确认 try: # 绑定手机号确认 one2_click = driver.find_element_by_xpath("//input[@id='TANGRAM__PSP_27__rebindGuideCancel']") one2_click.click() except Exception as e: # print(e) print("无需绑定手机号确认") pass time.sleep(2) print('333-登录成功...')
登录百度升级版:应对安全验证
# 导入webdriver import os import time import re from lxml import etree from selenium import webdriver from func import base642str, str2base64 # 将mm隐匿化 # import sys # # print(str2base64("123456")) # # str1_base64="MTIzNDU2" # # print(base642str(str1_base64)) # print() # sys.exit() print('000-正在启用selenium...') # 调用环境变量指定的PhantomJS浏览器创建浏览器对象 driver = webdriver.Chrome(r'D:\zzl\new_work\tmp\test01\baidulogin\chromedriver.exe') print('000-OK') # url = 'https://passport.baidu.com/v2/?login' print('111-selenium正在请求页面:%s' % url) driver.get(url) # get方法请求页面,获取响应 print('111-请求OK') print("打印标题") print(driver.title) # 点击账号和密码登录 input_box0 = driver.find_element_by_xpath("//p[@id='TANGRAM__PSP_3__footerULoginBtn']") input_box0.click() print('222-selenium正在填写表单...') time.sleep(1) account = "abcdef" pwd = "MTIzNDU2" verify_code = "1234" input_box1 = driver.find_element_by_xpath("//input[@id='TANGRAM__PSP_3__userName']") input_box1.send_keys(account) time.sleep(0.5) input_box2 = driver.find_element_by_xpath("//input[@id='TANGRAM__PSP_3__password']") input_box2.send_keys(base642str(pwd)) time.sleep(0.5) # 判断是否需要验证码 imgsrc = driver.find_element_by_id("TANGRAM__PSP_3__verifyCodeImg").get_attribute('src') if re.match(r'https://passport.baidu.com/cgi-bin/genimage.*', imgsrc): print("需要验证码") # 自动填写验证码 # input_box3 = driver.find_element_by_xpath("//input[@id='TANGRAM__PSP_3__verifyCode']") # input_box3.send_keys(verify_code) # 手动填写验证码 man_verify_code = input("请填写验证码:") input_box3 = driver.find_element_by_xpath("//input[@id='TANGRAM__PSP_3__verifyCode']") input_box3.send_keys(man_verify_code) print("验证码填写完成请等待") else: print("不需要验证码") print('222-填写表单OK') time.sleep(1) print('333-selenium提交表单...') one_click = driver.find_element_by_xpath("//input[@id='TANGRAM__PSP_3__submit']") one_click.click() time.sleep(2) # 处理弹窗(手机验证码):点击关闭按钮 i = 0 while True: # 处理手机验证码认证反复弹窗 try: one3_click = driver.find_element_by_id("TANGRAM__%s__header_a" % (22 + i)) # 22+i在应对弹窗的关闭按钮id名称发生变化。 except Exception as e: print("无需手机验证码") break else: print("第 %s 次弹出安全验证,要求获取手机验证码" % (i + 1)) time.sleep(0.5) print("1s后自动选择无需手机验证码") time.sleep(1) one3_click.click() print("1s后自动点击登陆") time.sleep(1) one_click.click() time.sleep(2) # 判断是否成功登陆 current_title = driver.title.strip() if current_title.startswith("登录"): print('333-登陆失败...') time.sleep(0.5) print('333-2秒后自动重试...') i = i + 1 time.sleep(2) continue else: print("打印标题") print(driver.title) print('333-登录成功...') import sys sys.exit() # 处理弹窗(绑定手机号确认):点击不需要修改 # 判断是否需要手机号绑定确认 try: # 绑定手机号确认 one2_click = driver.find_element_by_xpath("//input[@id='TANGRAM__PSP_27__rebindGuideCancel']") except Exception as e: print("无需绑定手机号确认") else: print("弹出了绑定手机号确认,1s后自动选择不需要") time.sleep(1) one2_click.click() # 打印标题 print("打印标题") print(driver.title) time.sleep(2) # 判断是否成功登陆 current_title = driver.title.strip() if current_title.startswith("登录"): print('333-登陆失败...') else: print('333-登录成功...')
登录正常输出:
000-正在启用selenium... 000-OK 111-selenium正在请求页面:https://passport.baidu.com/v2/?login 111-请求OK 打印标题 登录百度帐号 222-selenium正在填写表单... 不需要验证码 222-填写表单OK 333-selenium提交表单... 第 1 次弹出安全验证,要求获取手机验证码 1s后自动选择无需手机验证码 1s后自动点击登陆 333-登陆失败... 333-2秒后自动重试... 第 2 次弹出安全验证,要求获取手机验证码 1s后自动选择无需手机验证码 1s后自动点击登陆 打印标题 帐号设置 333-登录成功...
登录失败输出:
000-正在启用selenium... 000-OK 111-selenium正在请求页面:https://passport.baidu.com/v2/?login 111-请求OK 打印标题 登录百度帐号 222-selenium正在填写表单... 不需要验证码 222-填写表单OK 333-selenium提交表单... 无需手机验证码 无需绑定手机号确认 打印标题 登录百度帐号 333-登陆失败...
参考:
selenium 带验证码的自动登录
https://blog.csdn.net/chengjintao1121/article/details/82055298
Python selenium自动化识别验证码模拟登录操作(二)
https://blog.csdn.net/kk185800961/article/details/78747595