本文使用selenium在火狐浏览器模拟密码登陆某网校,使用css选择器点击
带密码登陆
打开网校登陆界面,可以看到有三个登陆选项,这里选择第二个,普通登陆
我们需要填写用户名和密码,最后勾选用户协议点击登陆按钮
首先获取【普通登陆】的css选择器,接着在新页面依次获取用户名、密码、勾选用户协议和登陆的css选择器
可以采用显示等待点击,这里设置10秒
login_option = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'a.common'))
)
login_option.click()
也可以导入time库,使用time.sleep(10)等待加载
login_button = driver.find_element(By.CSS_SELECTOR, '#normalSubmit') # 替换为登录按钮的 CSS 选择器
login_button.click()
关闭登陆后的广告
登陆后会弹出一个广告,不一定只有这一类 ,我们写一个函数,专门用来叉掉广告,每次遇到拦停代码的广告,获取它的css选择器,添加进广告列表
def close_advertisement(selectors):for selector in selectors:try:# 等待并点击广告关闭按钮close_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, selector)))close_button.click()print(f"关闭了广告: {selector}")return True # 成功关闭广告,返回 Trueexcept Exception as e:print(f"未找到广告关闭按钮: {selector}")continue # 如果当前选择器未找到,尝试下一个return False # 如果没有按钮能点击,返回 False# 广告关闭按钮选择器列表
selectors = ['i.el-icon-close:nth-child(2)','.ystk-popupBtn > a:nth-child(2)','.share_down'
]# 尝试关闭广告
if not close_advertisement(selectors):print("没有找到广告关闭按钮,继续执行后续程序...")
登陆后点击新开页面解决方法
接下来点击题库,发现浏览器新开了一个界面,并且再次弹出广告,我们需要切换窗口,并关闭广告
# 获取所有打开的窗口句柄
handles = driver.window_handles# 切换到新打开的窗口
driver.switch_to.window(handles[-1])
最后看看页面html我们拿到没
源码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time# 启动 Firefox 浏览器
driver = webdriver.Firefox(executable_path='D:/Users/Admin/Downloads/geckodriver.exe') # 根据你的地址来# 访问目标网页
driver.get('https://passport.233.com/login/?redirectURL=https%3A//www.233.com/')# 等待页面加载
time.sleep(2)# 显式等待并点击登录选项(使用 a.common 作为登录按钮)
login_option = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'a.common'))
)
login_option.click()# 输入用户名和密码
username_input = driver.find_element(By.NAME, 'account') # 根据实际页面元素定位用户名输入框
password_input = driver.find_element(By.NAME, 'password') # 根据实际页面元素定位密码输入框# 填写登录信息
username_input.send_keys('username') # 替换为实际的用户名
password_input.send_keys('password') # 替换为实际的密码# 点击协议复选框
protocol_checkbox = driver.find_element(By.CSS_SELECTOR, '.js-protocolCheck') # 根据 CSS 选择器定位协议复选框
if not protocol_checkbox.is_selected(): # 如果协议复选框尚未选中protocol_checkbox.click() # 勾选协议复选框# 点击登录按钮
login_button = driver.find_element(By.CSS_SELECTOR, '#normalSubmit') # 替换为登录按钮的 CSS 选择器
login_button.click()# 等待一段时间,确保登录完成
time.sleep(5)# 定义一个函数来尝试点击广告关闭按钮
def close_advertisement(selectors):for selector in selectors:try:# 等待并点击广告关闭按钮close_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, selector)))close_button.click()print(f"关闭了广告: {selector}")return True # 成功关闭广告,返回 Trueexcept Exception as e:print(f"未找到广告关闭按钮: {selector}")continue # 如果当前选择器未找到,尝试下一个return False # 如果没有按钮能点击,返回 False# 广告关闭按钮选择器列表
selectors = ['i.el-icon-close:nth-child(2)','.ystk-popupBtn > a:nth-child(2)','.share_down'
]# 尝试关闭广告
if not close_advertisement(selectors):print("没有找到广告关闭按钮,继续执行后续程序...")time.sleep(3)# 点击题库
question_bank = driver.find_element(By.CSS_SELECTOR, '.topNav-rtLink-tiku > a:nth-child(1)')
question_bank.click()time.sleep(5)# 获取所有打开的窗口句柄
handles = driver.window_handles# 切换到新打开的窗口
driver.switch_to.window(handles[-1])# 关闭广告
# 使用显式等待,确保广告关闭按钮可点击
close_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'i.el-icon-close:nth-child(2)'))
)
close_button.click()# 点击做题
do_question = driver.find_element(By.CSS_SELECTOR, 'div.item-section:nth-child(2) > div:nth-child(1) > div:nth-child(3) > button:nth-child(4)')
do_question.click()time.sleep(5)# 可以在这里进一步操作,如检查是否成功登录,或者爬取其他内容
print(driver.page_source)# 关闭浏览器
driver.quit()