利用selenium 3.7和python3添加cookie模擬登陸的實(shí)現(xiàn)
前言
隨著Python3的普及,Selenium3也跟上了行程。而Selenium3最大的變化是去掉了Selenium RC,另外就是Webdriver從各自瀏覽器中脫離,必須單獨(dú)下載。本文就來(lái)介紹了關(guān)于selenium 3.7+python3實(shí)現(xiàn)添加cookie模擬登陸的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
一、背景介紹
最近做一個(gè)爬蟲(chóng)項(xiàng)目,用selenium調(diào)用瀏覽器去獲取渲染后的源碼,但是每次登陸都需要手機(jī)驗(yàn)證,這真的是頭痛啊,這種驗(yàn)證方式不要想著去破解,還是老老實(shí)實(shí)用手機(jī)收驗(yàn)證碼去吧!反正我是不知道這種驗(yàn)證方式還能破解!難道就沒(méi)有其他辦法了嗎?
有,那就是模擬登陸!這樣最起碼不用沒(méi)測(cè)試一次就登陸驗(yàn)證一次。
這里要說(shuō)一下的就是,網(wǎng)上很多關(guān)于webdriver 添加cookie的教程,基本百分之80都是有問(wèn)題的。反正我是找了N多的帖子都沒(méi)有一個(gè)是正確的。
二、 添加cookie方法:driver.add_cookie()
1.add_cookie(cookie_dict)方法里面參數(shù)是cookie_dict,說(shuō)明里面參數(shù)是字典類型。
2.add_cookie源碼。

從源碼中我們可以看出,add_cookie方法接受一個(gè)字典,字典中包含name,value,path,domain,secure,expiry,但是這個(gè)源碼容易誤導(dǎo)人,那就是cookie參數(shù)沒(méi)有給全。
網(wǎng)上很多教程給的代碼cookie參數(shù)是沒(méi)給夠的,根本就跑不起來(lái)。
3. add_cookie接收的字典格式?!?/p>
正確的格式:
cookie = {
# "domain": ".58.com", #Firefox瀏覽器不能寫(xiě)domain,如果寫(xiě)了會(huì)報(bào)錯(cuò),谷歌需要寫(xiě)否則也是報(bào)錯(cuò),這里就是一個(gè)坑。其他瀏覽器沒(méi)測(cè)試不知道情況。
'name': name,
'value': value,
"expires": "",
'path': '/',
'httpOnly': False,
'HostOnly': False,
'Secure': False,
}
- name:cookie的名稱
- value:cookie對(duì)應(yīng)的值,動(dòng)態(tài)生成的
- domain:服務(wù)器域名
- expiry:Cookie有效終止日期
- path:Path屬性定義了Web服務(wù)器上哪些路徑下的頁(yè)面可獲取服務(wù)器設(shè)置的Cookie
- httpOnly:防腳本攻擊
- secure:在Cookie中標(biāo)記該變量,表明只有當(dāng)瀏覽器和Web Server之間的通信協(xié)議為加密認(rèn)證協(xié)議時(shí)
為什么要構(gòu)造成這樣子,其實(shí)我們看下瀏覽器保存的cookie格式就明白了。下圖就是谷歌瀏覽器的cookie 的截圖。

三 ,我們舉個(gè)例子看下是否真的寫(xiě)成功了:

第一次訪問(wèn)的的時(shí)候去獲取名字叫hello的cookie 是沒(méi)有的,add_cookie后再去訪問(wèn),第二次訪問(wèn)就拿到了hello。說(shuō)明已經(jīng)寫(xiě)進(jìn)去了。
四、項(xiàng)目實(shí)戰(zhàn)。
能不能用?好不好用?怎么用?,用項(xiàng)目來(lái)說(shuō)話,模擬登陸百度。!
目標(biāo):
1.手動(dòng)登錄一次后,只要在cookie 有效期內(nèi)無(wú)需重復(fù)登錄。
2.訪問(wèn)瀏覽記錄。
示例代碼
#!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):
'''判斷當(dāng)前是否登陸'''
self.driver.refresh()
html = self.driver.page_source
if html.find(self.username) == -1: #利用用戶名判斷是否登陸
# 沒(méi)登錄 ,則手動(dòng)登錄
self.login()
else:
#已經(jīng)登錄 嘗試訪問(wèn)搜索記錄,可以正常訪問(wèn)
self.driver.get(url='http://i.baidu.com/my/history')
time.sleep(30) # 延時(shí)看效果
def login(self):
'''登陸'''
time.sleep(60) #等待手動(dòng)登錄
self.driver.refresh()
self.save_cookie()
def save_cookie(self):
'''保存cookie'''
# 將cookie序列化保存下來(lái)
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", # 火狐瀏覽器不用填寫(xiě),谷歌要需要
'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','!!!!') # 你的百度賬號(hào),密碼
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
python驗(yàn)證多組數(shù)據(jù)之間有無(wú)顯著差異
這篇文章主要介紹了python驗(yàn)證多組數(shù)據(jù)之間有無(wú)顯著差異,利用方差分析和卡方分布驗(yàn)證多組數(shù)據(jù)之間的某些屬性有無(wú)顯著性差異,對(duì)于連續(xù)性屬性可以用方差分析,對(duì)于離散型屬性可以用卡方檢驗(yàn)。下面文章詳細(xì)內(nèi)容需要的小伙伴可以參考一下2022-01-01
網(wǎng)易有道2017內(nèi)推編程題 洗牌(python)
這篇文章主要為大家詳細(xì)介紹了網(wǎng)易有道2017內(nèi)推編程題:洗牌,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
詳解Python實(shí)現(xiàn)進(jìn)度條的4種方式
這篇文章主要介紹了Python實(shí)現(xiàn)進(jìn)度條的4種方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
Python+Selenium實(shí)現(xiàn)在Geoserver批量發(fā)布Mongo矢量數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了如何利用Python+Selenium實(shí)現(xiàn)在 Geoserver批量發(fā)布來(lái)自Mongo中的矢量數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-07-07
python實(shí)現(xiàn)測(cè)試工具(二)——簡(jiǎn)單的ui測(cè)試工具
這篇文章主要介紹了python如何實(shí)現(xiàn)簡(jiǎn)單的ui測(cè)試工具,幫助大家更好的利用python進(jìn)行測(cè)試工作,感興趣的朋友可以了解下2020-10-10
Python利用多線程枚舉實(shí)現(xiàn)獲取wifi信息
這篇文章主要為大家詳細(xì)介紹了Python如何利用枚舉字典的方式來(lái)實(shí)現(xiàn)獲取wifi信息,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-12-12
Python中import導(dǎo)入不同目錄的模塊方法詳解
這篇文章主要介紹了Python中import導(dǎo)入不同目錄的模塊方法詳解,需要的朋友可以參考下2020-02-02
基于windows下pip安裝python模塊時(shí)報(bào)錯(cuò)總結(jié)
今天小編就為大家分享一篇基于windows下pip安裝python模塊時(shí)報(bào)錯(cuò)總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06

