使用 cookie 简化登陆操作
通过selenium库请求拿到目标网站的cookie,然后用cookie去请求目标网站,可以省略登陆操作
以微博为例,先获取登陆的cookie:
1 import time 2 import json 3 from selenium import webdriver 4 from selenium.webdriver.support.ui import WebDriverWait 5 from selenium.webdriver.support import expected_conditions as ec 6 from selenium.webdriver.common.by import By 7 8 9 def save_cookie(the_cookie): # 直接将获取的cookie保存到json文件 10 with open('sina_cookie.txt', 'w') as f: 11 json.dump(the_cookie, f) 12 13 14 def save_cookies(the_cookies): # 传入的数据是 :将获取到的cookie用字典保存它的 name 和 value 15 with open('sina_cookies.txt', 'w') as f: 16 f.write(json.dumps(the_cookies)) 17 18 19 driver = webdriver.Chrome() 20 driver.get('https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F') 21 driver.maximize_window() 22 23 WebDriverWait(driver, 20).until(ec.presence_of_element_located((By.XPATH, '//*[@id="loginName"]'))) 24 25 try: 26 username = driver.find_element_by_xpath('//*[@id="loginName"]') 27 username.clear() 28 username.send_keys('用户名') 29 time.sleep(1.3) 30 pwd = driver.find_element_by_xpath('//*[@id="loginPassword"]') 31 pwd.clear() 32 pwd.send_keys('密码') 33 time.sleep(2) 34 driver.find_element_by_xpath('//*[@id="loginAction"]').click() 35 WebDriverWait(driver, 20).until(ec.presence_of_element_located((By.XPATH, '//p[@data-node="title"]'))) 36 print(driver.find_element_by_xpath('//p[@data-node="title"]')) 37 38 cookie = driver.get_cookies() 39 cookies = {} 40 for item in cookie: 41 cookies[item.get('name')] = item.get('value') 42 save_cookie(cookie) 43 print('cookie:\n', cookie) 44 save_cookies(cookies) 45 print('cookies:\n', cookies) 46 except Exception as e: 47 print(e) 48 pass 49 finally: 50 driver.close()
使用requests请求时带上cookie,可以直接登陆首页而不需要设置登陆操作。这里可能出问题,可以采用:
在请求之前一定要先请求一下目标网站。
1 import json 2 import requests 3 4 with open('sina_cookies.txt') as f: 5 cookies = json.load(f) 6 print(cookies) 7 8 url = 'https://weibo.cn' 9 result = requests.get(url, cookies=cookies) 10 print(result.text) 11 if '用户名' in result.text: 12 print('cookie调试成功')
这里要注意的是我们drvier.get_cookies()获取到的cookie信息是如下的形式:
清澈的爱,只为中国