一、各模塊說明
selenium.webdriver 瀏覽器驅動 selenium.webdriver.common.by 選擇器類型 selenium.webdriver.support.wait.WebDriverWait 等待控制 selenium.webdriver.support.expected_conditions 條件控制 selenium.common.exceptions 異常類型
二、導入相關模塊
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException
三、加載驅動
# 按驅動類型加載驅動 if Path('./chromedriver.exe').exists(): driver = webdriver.Chrome() elif Path('./geckodriver.exe').exists(): driver = webdriver.Firefox() else: print('異常:未找到瀏覽器驅動') print('提示:請下載對應版本的瀏覽器驅動,並放置於目錄:' + os.getcwd()) print('chrome: http://npm.taobao.org/mirrors/chromedriver/') print('Firefox: http://npm.taobao.org/mirrors/geckodriver/') exit(0)
四、打開網頁
# 窗口最大化 driver.maximize_window() # 打開網頁 driver.get('https://xxxxx')
五、元素獲取及點擊
driver.find_element(By.CSS_SELECTOR, '.btn-login').click()
注:這里用的是 css 選擇器,其他選擇器參考這里:定位元素 | Selenium
六、輸入賬號密碼並提交登錄
driver.find_element(By.CSS_SELECTOR, '.phonenum_input').send_keys(phone) driver.find_element(By.CSS_SELECTOR, '.password_input').send_keys(password) driver.find_element(By.CSS_SELECTOR, '.login_submit').click()
七、等待登錄成功后獲取cookie
locator = (By.CSS_SELECTOR, '.user') encrypted = '%s****%s' % (phone[:2], phone[-2:]) WebDriverWait(driver, 3).until(EC.text_to_be_present_in_element(locator, encrypted)) cookies = driver.get_cookies() Path('./cookies.txt').write_text(json.dumps(cookies)) print('登錄成功') driver.quit()
八、使用保存的cookie請求其他接口
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.62'} cookies = Path('./cookies.txt').read_text() cookies = {x['name']: x['value'] for x in json.loads(cookies)} try: r = requests.get(url, data=data, headers=headers, cookies=cookies, timeout=5) return r.json() except requests.exceptions.Timeout: print('Error: request timeout.') return None except json.decoder.JSONDecodeError: print('Error: json decode error.') return None
九、selenium 的其他操作
https://www.selenium.dev/zh-cn/documentation/webdriver/browser_manipulation/
完。