这个代码主要是为了完成模拟Selenium的登陆(需要QQ登录还有输入密码登录)、还有登陆成功后在网盘创建个人文件夹。
我在关闭广告那一段总是出错,还有验证登录的时候需要人工操作,因为它的轮盘转动暂时还不会,代码报错原因我也没看懂,有没有人帮助一下。
from parser import user
from parser import password
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
def qq_login(url):
driver.get(url)
driver.maximize_window()
time.sleep(3)
driver.find_element(By.XPATH, '/html/body/section/main/div/section/main/div/div[1]/div[3]/button').click()
#qq账号登录
time.sleep(3)
driver.find_element(By.XPATH, '//*[@id="pass_phoenix_btn"]/ul/li[2]/a')
window = driver.window_handles
driver.switch_to.window(window[-1])
print(driver.title)
#头像登录
time.sleep(3)
fram1 = driver.find_element(By.ID, 'ptlogin_iframe')
driver.switch_to.frame(fram1)
time.sleep(3)
driver.find_element(By.XPATH, '//*[@id="qlogin_list"]/a')
time.sleep(3)
def account_login(url, user, password):
driver.get(url)
time.sleep(3)
driver.find_element(By.XPATH, '/html/body/section/main/div/section/main/div/div[1]/div[3]/button').click()
time.sleep(3)
driver.find_element(By.ID, 'TANGRAM__PSP_11__userName').send_keys(user)
driver.find_element(By.ID, 'TANGRAM__PSP_11__password').send_keys(password)
driver.find_element(By.ID, 'TANGRAM__PSP_11__submit').click()
def get_list():
try:
time.sleep(15)
driver.switch_to.window(driver.window_handles[-1])
driver.find_element(By.XPATH, '/html/body/div[1]/div[3]/div[2]/img[1]').click()
time.sleep(2)
driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/div[3]/div/div[1]/button/i').click()
except:
pass
driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[1]/div/div[1]/div[1]/div/div[1]').click()
driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[1]/div/div[2]/div[1]/div[1]/div/div/span/a[3]/div/p').click()
time.sleep(3)
lis = []
body = driver.find_elements(By.XPATH, '/html/body/div[1]/div[2]/div[2]/div/div[1]/div/div[2]/div[1]/div[2]/div/div/div/div[2]/table/tbody/tr')
for i in range(1, len(body)):
name = driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[2]/div/div[1]/div/div[2]/div[1]/div[2]/div/div/div/div[2]/table/tbody/tr[%d]/td[2]/div/div/div[2]/a' % i).text
time1 = driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[2]/div /div/div[1]/div/div[2]/table/tbody/tr[%d]/td[3]/div/p' % i).text
file = driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[2]/div/div[1]/div/div[2]/div[1]/div[2]/div/div/div/div[2]/table/tbody/tr[%d]/td[4]/section' % i).text
lis1 = [name, time1, file]
lis.append(lis1)
print(lis1)
return lis
def after_login():
time.sleep(3)
#关闭广告
# driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/div[1]/div[3]/div/div[1]/button/i').click()
# driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/div[2]/div[1]/div/div[1]/div[1]/div/div[1]').click()
# driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[1]/div/div[1]/div[1]/div/div[1]').click()
#新建文件夹
time.sleep(3)
driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[2]/div/div[1]/div/div[1]/div/div[1]/div/div/div[2]/div/div[1]/button').click()
driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[2]/div/div[1]/div/div[2]/div[1]/div[2]/div/div/div/div[2]/table/tbody/tr[1]/td[2]/div/div/div[1]/input').send_keys('213548 TK')
driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[2]/div/div[1]/div/div[2]/div[1]/div[2]/div/div/div/div[2]/table/tbody/tr[1]/td[2]/div/div/div[2]/i').click()
def retrieve_files():
time.sleep(3)
js = "window.open('https://pan.baidu.com/s/1cYAvelyN9WyQ03P0huSPkQ')"
driver.execute_script(js)
window = driver.window_handles
driver.switch_to.window(window[-1])
print(driver.title)
driver.find_element(By.CSS_SELECTOR, '#accessCode').send_keys('ffcv')
driver.find_element(By.CSS_SELECTOR, '#submitBtn > a > span > span').click()
time.sleep(3)
driver.find_element(By.CSS_SELECTOR, '#layoutMain > div:nth-child(1) > div:nth-child(1) > div > div:nth-child(3) > div > div > div:nth-child(2) > a:nth-child(1)').click()
time.sleep(3)
driver.find_element(By.CSS_SELECTOR, '#fileTreeDialog > div:nth-child(3) > div > div:nth-child(2) > div:nth-child(3)').click()
time.sleep(3)
driver.find_element(By.CSS_SELECTOR, '#fileTreeDialog > div:nth-child(2) > div > ul > li > ul > li:nth-child(1) > div > span').click()
time.sleep(3)
driver.find_element(By.CSS_SELECTOR, '#fileTreeDialog > div:nth-child(4) > a:nth-child(2)').click()
time.sleep(3)
driver.close() #关闭
def main():
url = 'https://pan.baidu.com/'
userinto = user
passwords = password
account_login(url, userinto, passwords)
lis = get_list()
for i in lis:
print(i)
after_login()
retrieve_files()
if __name__ == '__main__':
main()
上面就是我的完整代码,好像登录那里也有点错误,有时候可以登录上,有时候又不行,帮帮忙!非常感谢!
你的代码报错有一个问题是你还没有登陆成功就执行了后面的代码,导致报错,找不到指定的元素:
#关闭广告:
try:
driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[2]/img[1]').click()
driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/div[1]/div[3]/div/div[1]/button').click()
except:
pass
我添加了从百度云获取文件的retrieve_files和延时部分:
from parser import user
from parser import password
import time
from selenium import webdriver
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
driver = webdriver.Chrome()
def qq_login(url):
driver.get(url)
driver.maximize_window()
time.sleep(3)
driver.find_element(By.XPATH, '/html/body/section/main/div/section/main/div/div[1]/div[3]/button').click()
# qq 账号登录
time.sleep(3)
driver.find_element(By.XPATH, '//*[@id="pass_phoenix_btn"]/ul/li[2]/a')
window = driver.window_handles
driver.switch_to.window(window[-1])
print(driver.title)
# 头像登录
time.sleep(3)
fram1 = driver.find_element(By.ID, 'ptlogin_iframe')
driver.switch_to.frame(fram1)
time.sleep(3)
driver.find_element(By.XPATH, '//*[@id="qlogin_list"]/a').click()
time.sleep(3)
def account_login(url, user, password):
driver.get(url)
time.sleep(3)
driver.find_element(By.XPATH, '/html/body/section/main/div/section/main/div/div[1]/div[3]/button').click()
time.sleep(3)
driver.find_element(By.ID, 'TANGRAM__PSP_11__userName').send_keys(user)
driver.find_element(By.ID, 'TANGRAM__PSP_11__password').send_keys(password)
driver.find_element(By.ID, 'TANGRAM__PSP_11__submit').click()
def get_list():
try:
time.sleep(15)
driver.switch_to.window(driver.window_handles[-1])
ad = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '/html/body/div[1]/div[1]/div[1]/div[3]/div/div[1]/button/i')))
ad.click()
time.sleep(2)
driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/div[3]/div/div[1]/button/i').click()
except:
pass
driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[1]/div/div[1]/div[1]/div/div[1]').click()
driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[1]/div/div[2]/div[1]/div[1]/div/div/span/a[3]/div/p').click()
time.sleep(3)
lis = []
body = driver.find_elements(By.XPATH, '/html/body/div[1]/div[2]/div[2]/div/div[1]/div/div[2]/div[1]/div[2]/div/div/div/div[2]/table/tbody/tr')
for i in range(1, len(body)):
name = driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[2]/div/div[1]/div/div[2]/div[1]/div[2]/div/div/div/div[2]/table/tbody/tr[%d]/td[2]/div/div/div[2]/a' % i).text
time1 = driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[2]/div/div[1]/div/div[2]/div[1]/div[2]/div/div/div/div[2]/table/tbody/tr[%d]/td[3]/div/p' % i).text
file = driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[2]/div/div[1]/div/div[2]/div[1]/div[2]/div/div/div/div[2]/table/tbody/tr[%d]/td[4]/section' % i).text
lis1 = [name, time1, file]
lis.append(lis1)
print(lis1)
return lis
def after_login():
time.sleep(3)
# 关闭广告
ad = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '/html/body/div[1]/div[1]/div[1]/div[3]/div/div[1]/button/i')))
ad.click()
# 新建文件夹
time.sleep(3)
driver.find_element(By.XPATH, '//div[contains(text(),"新建文件夹")]').click()
driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[2]/div/div[1]/div/div[2]/div[1]/div[2]/div/div/div/div[2]/table/tbody/tr[1]/td[2]/div/div/div[1]/input').send_keys('213548 TK')
driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[2]/div/div[1]/div/div[2]/div[1]/div[2]/div/div/div/div[2]/table/tbody/tr[1]/td[2]/div/div/div[2]/i').click()
def retrieve_files():
time.sleep(3)
js = "window.open('<https://pan.baidu.com/s/1cYAvelyN9WyQ03P0huSPkQ>')"
driver.execute_script(js)
window = driver.window_handles
driver.switch_to.window(window[-1])
print(driver.title)
driver.find_element(By.CSS_SELECTOR, '#accessCode').send_keys('ffcv')
driver.find_element(By.CSS_SELECTOR, '#submitBtn > a > span > span').click()
time.sleep(3)
driver.find_element(By.CSS_SELECTOR, '#layoutMain > div:nth-child(1) > div:nth-child(1) > div > div:nth-child(3) > div > div > div:nth-child(2) > a:nth-child(1)').click()
time.sleep(3)
driver.find_element(By.CSS_SELECTOR, '#fileTreeDialog > div:nth-child(3) > div > div:nth-child(2) > div:nth-child(3)').click()
time.sleep(3)
driver.find_element(By.CSS_SELECTOR, '#fileTreeDialog > div:nth-child(2) > div > ul > li > ul > li:nth-child(1) > div > span').click()
time.sleep(3)
driver.find_element(By.CSS_SELECTOR, '#fileTreeDialog > div:nth-child(4) > a:nth-child(2)').click()
time.sleep(3)
driver.close() #关闭
def main():
url = '<https://pan.baidu.com/>'
userinto = user
passwords = password
account_login(url, userinto, passwords)
lis = get_list()
for i in lis:
print(i)
after_login()
retrieve_files()
if __name__ == '__main__':
main()
广告那一段可能会出错的原因是,相应的元素定位(XPATH)不正确或者该元素还未完全被加载,导致无法点击。建议你检查一下这个元素是否可以正常被定位到,如果不能,可以尝试等待一段时间再去点击。
至于验证登录时需要人工操作轮盘转动的问题,可以尝试通过Selenium控制浏览器执行JavaScript脚本来模拟滑动验证码。
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
根据你提供的代码,我做了一些改进,主要是解决了关闭广告的问题,同时也简化了代码,具体如下:
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
# QQ账号和密码
qq_user = "your_qq_account"
qq_password = "your_qq_password"
# 百度网盘账号和密码
bd_user = "your_baidu_account"
bd_password = "your_baidu_password"
def qq_login(url):
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()
time.sleep(3)
# 点击QQ账号登录按钮
driver.find_element(By.XPATH, '/html/body/section/main/div/section/main/div/div[1]/div[3]/button').click()
time.sleep(3)
# 切换到QQ登录窗口
driver.switch_to.window(driver.window_handles[-1])
# 点击头像登录
driver.find_element(By.XPATH, '//*[@id="qlogin_list"]/a')
time.sleep(3)
# 切换到QQ登录iframe
driver.switch_to.frame("ptlogin_iframe")
time.sleep(3)
# 点击账号密码登录
driver.find_element(By.ID, 'switcher_plogin').click()
time.sleep(3)
# 输入QQ账号和密码
driver.find_element(By.ID, 'u').send_keys(qq_user)
driver.find_element(By.ID, 'p').send_keys(qq_password)
# 点击登录按钮
driver.find_element(By.ID, 'login_button').click()
time.sleep(3)
# 切换到主窗口
driver.switch_to.window(driver.window_handles[0])
return driver
def bd_login(url, user, password):
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()
time.sleep(3)
# 点击账号密码登录按钮
driver.find_element(By.XPATH, '/html/body/section/main/div/section/main/div/div[1]/div[3]/button').click()
time.sleep(3)
# 输入账号和密码
driver.find_element(By.ID, 'TANGRAM__PSP_11__userName').send_keys(user)
driver.find_element(By.ID, 'TANGRAM__PSP_11__password').send_keys(password)
# 点击登录按钮
driver.find_element(By.ID, 'TANGRAM__PSP_11__submit').click()
time.sleep(10) # 等待手动验证登录
# 切换到主窗口
driver.switch_to.window(driver.window_handles[0])
return driver
def create_folder(driver, folder_name):
# 点击新建文件夹按钮
driver.find_element(By.CSS_SELECTOR, '.g-dropdown-button__label').click()
# 点击个人文件夹
driver.find_element(By.CSS_SELECTOR, '.g-dropdown-menu__item:nth-child(2)').click()
time.sleep(3)
# 输入文件夹名称
input_field = driver.find_element(By.CSS_SELECTOR, '.g-file-manage-create-dialog .el-input__inner')
input_field.send_keys(folder_name)
input_field.send_keys(Keys.ENTER)
time.sleep(3)
def main():
qq_url = 'https://pan.baidu.com/'
bd_url = 'https://pan.baidu.com/'
# QQ登录
qq_driver = qq_login(qq_url)
# 百度网盘登录
bd_driver = bd_login(bd_url, bd_user, bd_password)
# 创建个人文件夹
create_folder(bd_driver, "My Folder")
# 关闭浏览器
qq_driver.quit()
bd_driver.quit()
if __name__ == '__main__':
main()
主要改进如下:
将QQ登录和百度网盘登录分离成两个函数,避免代码混乱。
将输入账号密码和点击登录按钮的操作合并到一个函数中。
在创建个人文件夹时,使用CSS选择器来定位元素,简化代码。
将浏览器关闭操作移到主函数的末尾。
增加了注释,让代码更易读。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
通过添加显性或者隐式等待时间,确保元素加载成功。
通过try 对同一元素添加多种定位方式,在一中定位失败的情况下尝试其他定位方式