本文使用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 # 成功关闭广告,返回 True
except 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 # 成功关闭广告,返回 True
except 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()