selenium3.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接收的字典格式。 

正確的格式:

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.訪問瀏覽記錄。

#!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','!!!!') # 你的百度賬號,密碼

  

 

 如果你支持我,就掃掃我的紅包,你領我幾毛,我領幾毛,也算是對我的支持。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM