看這篇文章以前你們能夠先看下個人上一篇文章:cookies詳解python
本篇咱們就針對上一篇來講一下cookies的基本應用web
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 PIL import Image chrome_option = webdriver.ChromeOptions() chrome_path = "/usr1/webdrivers/chromedriver" def login_baidu(): driver = None try: driver = webdriver.Chrome(executable_path=chrome_path) driver.get("https://www.baidu.com") print(driver.title) WebDriverWait(driver, 10, 0.5).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="u1"]/*[@class="lb"]'))) element = driver.find_element_by_xpath('//*[@id="u1"]/a[7]') element.click() WebDriverWait(driver, 10, 0.5).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__PSP_10__footerULoginBtn"]'))) element = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__footerULoginBtn"]') element.click() WebDriverWait(driver, 10, 0.5).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__PSP_10__userName"]'))) element = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__userName"]') element.send_keys("帳號") WebDriverWait(driver, 10, 0.5).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__PSP_10__password"]'))) element = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__password"]') element.send_keys("密碼") WebDriverWait(driver, 10, 0.5).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__PSP_10__verifyCodeImg"]'))) element = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__verifyCodeImg"]') driver.get_screenshot_as_file("qrcode.png") image = Image.open("qrcode.png") left = element.location.get("x") top = element.location.get("y") right = left + element.size.get("width") bottom = top + element.size.get("height") cropImg = image.crop((left, top, right, bottom)) cropImg.save("code.png") yanzheng = input(">>>") WebDriverWait(driver, 10, 0.5).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__PSP_10__verifyCode"]'))) element = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__verifyCode"]') element.send_keys(yanzheng) WebDriverWait(driver, 10, 0.5).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__PSP_10__submit"]'))) element = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__submit"]') element.click() # 若是須要手機驗證碼 try: WebDriverWait(driver, 10, 0.5).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__36__button_send_mobile"]'))) element = driver.find_element_by_xpath('//*[@id="TANGRAM__36__button_send_mobile"]') element.click() WebDriverWait(driver, 10, 0.5).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__36__input_vcode"]'))) element = driver.find_element_by_xpath('//*[@id="TANGRAM__36__input_vcode"]') duanxin = input(">>>") element.send_keys(duanxin) WebDriverWait(driver, 10, 0.5).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__36__button_submit"]'))) element = driver.find_element_by_xpath('//*[@id="TANGRAM__36__button_submit"]') element.click() except Exception as e: print(e) driver.get_screenshot_as_file("screen.png") finally: print("關閉") if driver: driver.quit()
selenium操做很簡單,這裏不作詳解講解,之後咱們開爬蟲基礎系列文章的時候會講到。chrome
cookies = driver.get_cookies() with open("cookies.txt", "w") as fp: json.dump(cookies, fp)
這裏切記,若是咱們要使用json.load讀取數據,那麼必定要使用json.dump來寫入數據,不能使用str(cookies)直接轉爲字符串進行保存,由於其存儲格式不一樣。這樣咱們就將cookies保存在文件中了。數據庫
def read_cookies(): # 設置cookies前必須訪問一次百度的頁面 driver.get("http://www.baidu.com") with open("cookies.txt", "r") as fp: cookies = json.load(fp) for cookie in cookies: # cookie.pop('domain') # 若是報domain無效的錯誤 driver.add_cookie(cookie) driver.get("http://www.baidu.com")
這裏不用登陸就會直接顯示個人用戶名。並且要注意不一樣的瀏覽器可能處理方式不一樣,好比在火狐瀏覽器中就會報錯:selenium.common.exceptions.InvalidCookieDomainException: Message: .baidu.com,若是碰到這種錯誤(不必定,也可能跟系統、瀏覽器都有關係),在add_cookie的時候咱們能夠把domain去掉就好了。json
import requests from requests.cookies import RequestsCookieJar s = requests.session() s.verify = False s.headers = { "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1" } s.get("http://www.baidu.com") #這裏咱們使用cookie對象進行處理 jar = RequestsCookieJar() with open("cookies.txt", "r") as fp: cookies = json.load(fp) for cookie in cookies: jar.set(cookie['name'], cookie['value']) #百度我的中心 r = s.get("https://www.baidu.com/p/setting/profile/basic", cookies=jar) # 也可使用字典設置 cookies_dict = dict() with open("cookies.txt", "r") as fp: cookies = json.load(fp) for cookie in cookies: cookies_dict[cookie['name']] = cookie['value'] r = s.get("https://www.baidu.com/p/setting/profile/basic", cookies=cookies_dict) r.encoding = "utf-8" print(r.text)
requests庫可使用cookies對象和dict對象來指定cookies,這個能夠看一下源碼瀏覽器
經過requests讀取cookies的使用,咱們知道在cookies中咱們通常只使用name和value,像domain、path等值都是不須要使用的,並且上面傳入cookies字典的例子咱們知道,只要保存了cookies中的name和value,不管你以什麼樣的方式保存,文件、或者數據庫等,最後讀取出來只要生成對應的字典格式就好了。服務器
import requests s = requests.session() s.verify = False s.headers = { "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1" } # 這裏能夠是模擬登錄的步驟 s.get("http://www.baidu.com") cookies = requests.utils.dict_from_cookiejar(s.cookies) with open("cook.txt", "w") as fp: json.dump(cookies, fp) print(cookies)
首先咱們看一下requests.session裏面的cookies,它是一個RequestsCookieJar對象,這就是咱們在上面使用的時候用RequestsCookieJar對象讀取cookies的緣由了微信
下面咱們看到requests.utils.dict_from_cookiejar方法,這是requests庫提供的一個方法,把上面的RequestsCookieJar對象轉換爲一個字典(字典裏只有name和value),這就是我上面說的,requests庫只使用name和value值,而咱們selenium中保存的cookies中包含domain、path等信息。cookie
另外還有一個方法requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)這個方法,根據字典生成一個RequestsCookieJar對象,爲何須要這樣一個方法呢,可能在上面的應用中有些人會有疑問,咱們的cookies是經過get/post方法的參數傳進去的,那麼在訪問其餘網頁的時候都要去傳遞這樣一個參數嗎?這樣很不方便並且容易遺忘。看上圖的s.cookies變量,它是requests.session對象中的變量,並且是一個RequestsCookieJar類型的對象,那麼咱們就可使用這個函數把讀取的字典信息轉換爲RequestsCookieJar對象,而後把值直接設置給s.cookies,就像上面代碼裏的headers同樣,這樣就方便不少了吧。session
上面我都是將cookies值保存在文件中,在大多數狀況下咱們通常使用都是將其保存在數據庫中,啓動一個服務器專門進行登陸驗證並保存cookies值。後面我會寫一篇Flask+Redis進行cookies池維護的文章,發佈在個人微信公衆號上,盡請關注哦。
若是你以爲個人文章還能夠,能夠關注個人微信公衆號,查看更多實戰文章:Python爬蟲實戰之路
也能夠掃描下面二維碼,添加個人微信公衆號