Python Selenium库模拟登录百度账号【输入短信验证码】-经验分享

本次Selenium模拟登录实操选择国内访问量最大的搜索引擎——百度,百度账号登录一般分为两大步骤:1.选择账号登录并输入账号密码,2.发送短信验证码进行验证。本文内容仅作学习交流用,希望为大家提供更多实操思路。有任何疑问或建议,欢迎大家留言哦~

1. 初始化浏览器对象

由于很多网站(如百度、淘宝、知乎等)会通过JavaScript检测navigator.webdriver是否存在、是否有__selenium_unchecked____webdriver_evaluate__属性等方式判断请求是否来源于自动化脚本,因此在初始设置浏览器对象时,建议在Options()中添加较为完善的配置,隐藏一些与自动化相关的标志。

#写入要用的库
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import time

#设置Options隐藏自动化特征,降低被识别概率
options = Options()
options.add_argument('--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36')
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_experimental_option('excludeSwitches', ["enable-automation"])   #禁用自动化控制标志
options.add_experimental_option("useAutomationExtension", False)    #禁用自动化扩展

#初始化浏览器对象
service = Service(executable_path='/usr/local/bin/chromedriver')
driver = webdriver.Chrome(service=service, options=options)

#隐藏navigator.webdriver属性
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": """
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })
    """
})

2.打开百度首页,点击右上角“登录”图标

#打开baidu
driver.get('http://www.baidu.com.cn')

#点击右上角“登录”
login_btn = driver.find_element(By.ID, 's-top-loginbtn')
login_btn.click()

3. 选择账号登录,并输入账号密码

#选择“账号登录”,输入账号密码
account_login = WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.ID, "TANGRAM__PSP_11__changePwdCodeItem")))
account_login.click()

account = driver.find_element(By.ID, 'TANGRAM__PSP_11__userName')
account.send_keys('输入你的账号')

password = driver.find_element(By.ID, "TANGRAM__PSP_11__password")
password.send_keys('输入你的密码')

#勾选接受用户协议和隐私政策
is_agreed = driver.find_element(By.NAME, "isAgree")
is_agreed.click()

#休眠
time.sleep(1)   #短暂暂停有助于模拟真人操作

#点击“登录”
submit = driver.find_element(By.ID, "TANGRAM__PSP_11__submit")
submit.click()

4. 发送短信验证码,完成登录

上述代码执行后将弹出一个对话窗口:“验证方式选择 手机号是否可以用于验证?”--> 选择 “去验证”。

#嵌套定位“去验证”按钮
dialogWrapper = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.ID, "dialogWrapper")))

goToVerify = dialogWrapper.find_element(By.XPATH, './/a[@id="goToVerify"]')

ActionChains(driver).double_click(goToVerify).perform()   #用动作链模拟真人鼠标点击;但baidu对自动化检测严格,有时候会拦截ActionChains的点击行为

#还可以采用:
#driver.execute_script('arguments[0].click();', goToVerify)
#避免JavaScript阻止默认的点击行为,造成selenium点击操作无效,此处采用JS强制点击。但缺点是无法模拟用户真实行为。

#休眠 - 等待手机接收验证码
time.sleep(3)

#输入验证码
verify_code = WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="passAuthVcode" and @type="tel"]')))

verify_code.send_keys(input('输入验证码:'))

#点击:下一步
next_btn = driver.find_element(By.ID,'passAuthSubmitCode')
next_btn.click()

#展示页面
time.sleep(5)

#关闭浏览器
driver.quit()

#为避免验证窗口存在JavaScript动态渲染影响定位,此处采用嵌套定位方式定位“去验证”按钮,即先找到父元素<div id="dialogWrapper"...>,再在其下查找子元素。

###完整代码如下:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import time

#设置Options隐藏自动化特征
options = Options()
options.add_argument('--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36')
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_experimental_option('excludeSwitches', ["enable-automation"])   #禁用自动化控制标志
options.add_experimental_option("useAutomationExtension", False)    #禁用自动化扩展

#初始化浏览器对象
service = Service(executable_path='/usr/local/bin/chromedriver')
driver = webdriver.Chrome(service=service, options=options)

#隐藏navigator.webdriver属性
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": """
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })
    """
})

#打开baidu
driver.get('http://www.baidu.com.cn')

#点击右上角“登录”
login_btn = driver.find_element(By.ID, 's-top-loginbtn')
login_btn.click()

#选择“账号登录”,输入账号密码
account_login = WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.ID, "TANGRAM__PSP_11__changePwdCodeItem")))
account_login.click()

account = driver.find_element(By.ID, 'TANGRAM__PSP_11__userName')
account.send_keys('输入你的账户')

password = driver.find_element(By.ID, "TANGRAM__PSP_11__password")
password.send_keys('输入你的密码')

#勾选接受用户协议和隐私政策
is_agreed = driver.find_element(By.NAME, "isAgree")
is_agreed.click()

#休眠
time.sleep(1)

#点击“登录”
submit = driver.find_element(By.ID, "TANGRAM__PSP_11__submit")
submit.click()

#弹出窗口:验证方式选择 手机号是否可以用于验证?--> 选择 “去验证”
#嵌套定位“去验证”按钮
dialogWrapper = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.ID, "dialogWrapper")))

goToVerify = dialogWrapper.find_element(By.XPATH, './/a[@id="goToVerify"]')

ActionChains(driver).double_click(goToVerify).perform()

#休眠 - 等待手机接收验证码
time.sleep(3)

#输入验证码
verify_code = WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="passAuthVcode" and @type="tel"]')))

verify_code.send_keys(input('输入验证码:'))

#点击:下一步
next_btn = driver.find_element(By.ID,'passAuthSubmitCode')
next_btn.click()

#展示页面
time.sleep(5)

#关闭浏览器
driver.quit()

###本文所示操作缺点在于验证码需用户场外输入,适用于调试或单次测试使用,操作整体简单,容易上手。若要真正实现完全自动化的验证码填写,还需采用第三方短信平台+API接收验证码方式,这一问题博主正在探索中,如有进展将在后续发文分享。如果大家有更好的实现方法,期待评论留言~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值