前言
隨著Python3的普及,Selenium3也跟上了行程。而Selenium3最大的變化是去掉了Selenium RC,另外就是Webdriver從各自瀏覽器中脫離,必須單獨下載。本文就來介紹了關于selenium 3.7+python3實現添加cookie模擬登陸的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。
一、背景介紹
最近做一個爬蟲項目,用selenium調用瀏覽器去獲取渲染后的源碼,但是每次登陸都需要手機驗證,這真的是頭痛啊,這種驗證方式不要想著去破解,還是老老實實用手機收驗證碼去吧!反正我是不知道這種驗證方式還能破解!難道就沒有其他辦法了嗎?
有,那就是模擬登陸!這樣最起碼不用沒測試一次就登陸驗證一次。
這里要說一下的就是,網上很多關于webdriver 添加cookie的教程,基本百分之80都是有問題的。反正我是找了N多的帖子都沒有一個是正確的。
二、 添加cookie方法:driver.add_cookie()
1.add_cookie(cookie_dict)
方法里面參數是cookie_dict,說明里面參數是字典類型。
2.add_cookie源碼。
從源碼中我們可以看出,add_cookie方法接受一個字典,字典中包含name,value,path,domain,secure,expiry,但是這個源碼容易誤導人,那就是cookie參數沒有給全。
網上很多教程給的代碼cookie參數是沒給夠的,根本就跑不起來。
3. add_cookie接收的字典格式。
正確的格式:
1
2
3
4
5
6
7
8
9
10
11
|
cookie = { # "domain": ".58.com", #Firefox瀏覽器不能寫domain,如果寫了會報錯,谷歌需要寫否則也是報錯,這里就是一個坑。其他瀏覽器沒測試不知道情況。 'name': name, 'value': value, "expires": "", 'path': '/', 'httpOnly': False, 'HostOnly': False, 'Secure': False, } |
- name:cookie的名稱
- value:cookie對應的值,動態生成的
- domain:服務器域名
- expiry:Cookie有效終止日期
- path:Path屬性定義了Web服務器上哪些路徑下的頁面可獲取服務器設置的Cookie
- httpOnly:防腳本攻擊
- secure:在Cookie中標記該變量,表明只有當瀏覽器和Web Server之間的通信協議為加密認證協議時
為什么要構造成這樣子,其實我們看下瀏覽器保存的cookie格式就明白了。下圖就是谷歌瀏覽器的cookie 的截圖。
三 ,我們舉個例子看下是否真的寫成功了:
第一次訪問的的時候去獲取名字叫hello的cookie 是沒有的,add_cookie后再去訪問,第二次訪問就拿到了hello。說明已經寫進去了。
四、項目實戰。
能不能用?好不好用?怎么用?,用項目來說話,模擬登陸百度。!
目標:
1.手動登錄一次后,只要在cookie 有效期內無需重復登錄。
2.訪問瀏覽記錄。
示例代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
#!coding=utf-8 import time from selenium import webdriver import pickle class BaiduSpider( object ): def __init__( self ,username,password): self .username = username self .password = password self .driver = webdriver.Chrome() self .driver.get(url = 'http://www.baidu.com' ) self .set_cookie() self .is_login() def is_login( self ): '''判斷當前是否登陸''' self .driver.refresh() html = self .driver.page_source if html.find( self .username) = = - 1 : #利用用戶名判斷是否登陸 # 沒登錄 ,則手動登錄 self .login() else : #已經登錄 嘗試訪問搜索記錄,可以正常訪問 self .driver.get(url = 'http://i.baidu.com/my/history' ) time.sleep( 30 ) # 延時看效果 def login( self ): '''登陸''' time.sleep( 60 ) #等待手動登錄 self .driver.refresh() self .save_cookie() def save_cookie( self ): '''保存cookie''' # 將cookie序列化保存下來 pickle.dump( self .driver.get_cookies(), open ( "cookies.pkl" , "wb" )) def set_cookie( self ): '''往瀏覽器添加cookie''' '''利用pickle序列化后的cookie''' try : cookies = pickle.load( open ( "cookies.pkl" , "rb" )) for cookie in cookies: cookie_dict = { "domain" : ".baidu.com" , # 火狐瀏覽器不用填寫,谷歌要需要 'name' : cookie.get( 'name' ), 'value' : cookie.get( 'value' ), "expires" : "", 'path' : '/' , 'httpOnly' : False , 'HostOnly' : False , 'Secure' : False } self .driver.add_cookie(cookie_dict) except Exception as e: print (e) if __name__ = = '__main__' : BaiduSpider( 'usename' , '!!!!' ) # 你的百度賬號,密碼 |
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:http://www.cnblogs.com/huangguifeng/p/7858619.html