寫爬蟲的時候免不了操作Cookies,使用Selenium可以很方便的讀取瀏覽器已有Cookies,管理Cookies也很方便。
1.selenium讀取瀏覽器已有Cookies
瀏覽器已有Cookies有一個好處是我們的真實行為,裡面儲存的資料都是我們經常使用的賬號資料,這在抓取網站時有較大好處,因為對這些老賬號,真實Cookies,被爬網站會對你的抓取行為寬鬆一些。
比如你在瀏覽器登陸和訪問過微博的話,使用selenium讀取操作老cookies,訪問微博的話,你就不需要再登陸啦。
如何操作老Cookie呢?使用add_argument()方法,看程式碼演示。拿Chrome瀏覽器舉例,程式碼在Python 3.6裡測試透過。
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("user-data-dir=C:\\Users\\HN\\AppData\\Local\\Google\\Chrome\\User Data")
options.add_experimental_option("excludeSwitches",["ignore-certificate-errors"])
driver = webdriver.Chrome(executable_path="C:/chromedriver.exe",options=options)
driver.maximize_window()
driver.get('https://www.weibo.com')
print(driver.get_cookies())
add_argument()方法裡填你Chrome瀏覽器儲存Cookies的路徑。
add_experimental_option()方法是訪問https的網站,Selenium可能會報錯,使用這個方法可以忽略報錯。
get_cookies()方法可以得到當前訪問網站的Cookies。
上述例子就可以使用瀏覽器已有Cookies了,並且你後續使用Selenium的訪問操作網站記錄也會儲存在這個Cookies理。
PS:電腦記憶體不夠或已經開啟了Chrome,再用Selenium開啟一個Chrome時,可能會報:unable to move cache folder ShaderCache/GPUCache錯誤。
這時要把之前的Chrome關閉才行。
2.selenium儲存cookies
上面介紹瞭如何讀取老cookies並免登陸訪問網站,還有一種情況有些網站對單個賬號有訪問頻率限制,所以你準備了多個賬號,想要每隔一段時間換一個賬號來訪問網站。
這樣如果讓瀏覽器自己來儲存Cookies的話,會把你之前的賬戶Cookie覆蓋一部分,會導致之前的賬號訪問網站時要求你輸入賬號密碼登陸。
這種情況就要來管理Cookies,讓每個賬號都儲存在不同檔案裡,這個過程要藉助pickle庫來序列化資料(把格式資料存入檔案和載入到記憶體)。看下面例項:
#coding=utf-8
from selenium import webdriver
import pickle
import time
driver = webdriver.Chrome(executable_path="C:/chromedriver.exe")
driver.maximize_window()
driver.get('https://www.douban.com')
time.sleep(60)
cookies = driver.get_cookies()
with open('D:/test_cookies/db_cookie_1','wb') as f:
pickle.dump(cookies,f)
print ('done')
上面示例演示透過selenium開啟豆瓣網,你要在豆瓣網上輸入賬號密碼點選登入,程式會把登入成功後的豆瓣網cookie儲存到指定資料夾下面。儲存cookies到檔案是用pickle庫的dump方法來完成的,它可以幫助你序列化資料,很方便。
上面睡眠60秒是給你足夠時間輸入賬號密碼。
接下來的程式就來呼叫我們剛才儲存的cookies來登入豆瓣。
#coding=utf-8
from selenium import webdriver
import pickle
import time
driver = webdriver.Chrome(executable_path="C:/chromedriver.exe")
#不帶cookies訪問豆瓣
driver.get('https://www.douban.com')
#刪掉cookies
driver.delete_all_cookies()
with open('D:/test_cookies/db_cookie_1','rb') as f:
cookies = pickle.load(f)
for cookie in cookies:
driver.add_cookie(cookie)
print(cookie)
#帶我們儲存的cookie訪問豆瓣
driver.get('https://www.douban.com')
print('done')
是不是能夠自動登陸豆瓣了?
這裡面還是用到pickle庫的load()方法來載入cookie,使用add_cookie()方法來把儲存的cookie加入到瀏覽器裡。
注意上面的流程,先是不帶cookie訪問網站,然後把網站的cookies刪掉,把儲存的cookie加入到瀏覽器中,再重新訪問網站,這樣就能帶我們自己的cookie訪問了。
不安上面的流程,直接帶我們的cookies訪問網站,可能會失敗。
上面的兩個程式示例,就實現了把cookies按單個賬戶來儲存到我們指定的資料夾中,不同的賬戶,你只需要按不同的賬戶名來儲存檔案就,這樣方便管理。 以後就可以實現切換不用的賬戶來訪問網站。
3.Selenium操作cookies總結
回顧一下,新增cookie的方法是add_cookie(),一般一個網站會有多個cookie,所以需要按上面的方法迴圈把cookie都加入。
另外刪除cookies的方法是delete_all_cookies()
還有使用Selenium操作瀏覽器,如果你退出程式時不儲存cookies,那cookies是不會被儲存到檔案的。
我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。
***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***