python 爬蟲如何讀取本機瀏覽器的 cookie

2020-11-08 拒海

上次分享了利用瀏覽器抓包獲得 cookie 使爬蟲可以突破網站的登錄校驗

本文以 chrome 瀏覽器為例,演示如何讀取瀏覽器存儲在磁碟上的 cookie 用於爬蟲

cookie 位置

chrome 使用 sqlite 資料庫保存 cookie 文件,資料庫文件路徑是 %LOCALAPPDATA%\Google\Chrome\User Data\Default\Cookies

echo %LOCALAPPDATA%\Google\Chrome\User Data\Default\CookiesC:\Users\refusea\AppData\Local\Google\Chrome\User Data\Default\Cookies

用 sqlite 查看下表結構

# -*- coding: utf-8 -*-import osimport sqlite3if __name__ == '__main__': cookie_file = os.environ['LOCALAPPDATA']+ '\\Google\\Chrome\\User Data\\Default\\Cookies' conn = sqlite3.connect(cookie_file) cursor = conn.cursor() cursor.execute('select * from sqlite_master where type="table" and name="cookies"') for row in cursor: print(row) cursor.close() conn.close()

cookie 表結構

CREATE TABLE cookies( creation_utc INTEGER NOT NULL, host_key TEXT NOT NULL, name TEXT NOT NULL, value TEXT NOT NULL, path TEXT NOT NULL, expires_utc INTEGER NOT NULL, is_secure INTEGER NOT NULL, is_httponly INTEGER NOT NULL, last_access_utc INTEGER NOT NULL, has_expires INTEGER NOT NULL DEFAULT 1, is_persistent INTEGER NOT NULL DEFAULT 1, priority INTEGER NOT NULL DEFAULT 1, encrypted_value BLOB DEFAULT '', samesite INTEGER NOT NULL DEFAULT -1, source_scheme INTEGER NOT NULL DEFAULT 0, UNIQUE (host_key, name, path))

各個欄位含義沒有找到文檔,對照 chrome 的 cookie 查看界面倒也不難猜測

查看 cookie

以下 sql 就可以取到 baidu.com 域名下的 所有 cookie 了

select name, path, encrypted_value from cookies where host_key='.baidu.com'

注意

  • cookie 的值是加密的,需要解密才能使用
  • host_key 的值是 '.baidu.com',注意前面那個點

解密 cookie

根據密文的前幾個字節判斷加密方式

  • 前 4 個字節是 `b'x01x00x00x00'`: DPAPI
  • 前 3 個字節是 `b'v10'`: AES

DPAPI

這是 windows 系統內置的一個數據保護接口,可對數據進行加解密的操作

AES

AES 的密鑰存放在 `%LOCALAPPDATA%\Google\Chrome\User Data\Local State`,該文件格式為 json

type "%LOCALAPPDATA%\Google\Chrome\User Data\Local State"

密鑰的路徑是 /os_crypt/encrypted_key

AES 密鑰

其值是 base64 編碼的


以下給出從本機瀏覽器獲取 cookie 的 python 代碼實現供參考

# -*- coding: utf-8 -*-import sqlite3import osimport jsonimport base64from cryptography.hazmat.backends import default_backendfrom cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modesdef dpapi_decrypt(encrypted_value): import ctypes import ctypes.wintypes class DATA_BLOB(ctypes.Structure): _fields_ = [('cbData', ctypes.wintypes.DWORD), ('pbData', ctypes.POINTER(ctypes.c_char))] p = ctypes.create_string_buffer(encrypted_value, len(encrypted_value)) blobin = DATA_BLOB(ctypes.sizeof(p), p) blobout = DATA_BLOB() retval = ctypes.windll.crypt32.CryptUnprotectData( ctypes.byref(blobin), None, None, None, None, 0, ctypes.byref(blobout)) if not retval: raise ctypes.WinError() result = ctypes.string_at(blobout.pbData, blobout.cbData) ctypes.windll.kernel32.LocalFree(blobout.pbData) return resultdef aes_decrypt(encrypted_value): with open(os.path.join(os.environ['LOCALAPPDATA'], r"Google\Chrome\User Data\Local State"), mode="r", encoding='utf-8') as f: jsn = json.loads(str(f.readline())) encoded_key = jsn["os_crypt"]["encrypted_key"] encrypted_key = base64.b64decode(encoded_key.encode()) encrypted_key = encrypted_key[5:] key = dpapi_decrypt(encrypted_key) nonce = encrypted_value[3:15] cipher = Cipher(algorithms.AES(key), None, backend=default_backend()) cipher.mode = modes.GCM(nonce) decryptor = cipher.decryptor() return decryptor.update(encrypted_value[15:])def decrypt(encrypted_value): try: if encrypted_value[:4] == b'x01x00x00x00': value = dpapi_decrypt(encrypted_value) return value.decode() elif encrypted_value[:3] == b'v10': value = aes_decrypt(encrypted_value) return value[:-16].decode() except WindowsError: return Nonedef get_cookie_from_chrome(domain): file = os.path.join(os.environ['USERPROFILE'], r'AppData\Local\Google\Chrome\User Data\default\Cookies') conn = sqlite3.connect(file) cursor = conn.cursor() sql = "SELECT name, encrypted_value FROM cookies where host_key='{}'".format(domain) cursor.execute(sql) cookie = '' for row in cursor: value = row[1] if value is not None: name = row[0] value = decrypt(value) if value is not None: cookie += name + '=' + value + ';' cursor.close() conn.close() return cookieif __name__ == '__main__': print(get_cookie_from_chrome('.baidu.com'))

使用方法,還是以 gitee 為例,如下

# -*- coding: utf-8 -*-import requestsfrom chrome_cookie import get_cookie_from_chromesession = requests.session()if __name__ == '__main__': headers = { 'Host': 'gitee.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36', 'Accept': 'application/json', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', } url = 'https://gitee.com/api/v3/internal/my_resources' result = session.get(url=url, headers=headers) headers['Cookie'] = get_cookie_from_chrome('.gitee.com') result = session.get(url=url, headers=headers) if result.status_code == 200: print('success: \n%s' % (result.text)) else: print(result.status_code)


ok,現在做爬蟲就簡單了,再厲害的驗證碼也攔不住我了。。。只要用瀏覽器先登錄即可,是不是很方便呢?

相關焦點

  • python 爬蟲如何突破登錄驗證
    ,後續訪問就一路暢通了,在 python 裡則意味著我們需要用 session 發起後續請求複雜的登錄校驗這次以 gitee 為例,來研究下如何登錄,先用瀏覽器抓包看下 gitee 的登錄 可以先用瀏覽器登錄,再把 cookie 複製出來給爬蟲使用首先是複製 cookie,瀏覽器登錄 gitee 成功後,隨意抓個包就可以得到 cookie 了
  • Python——網絡爬蟲、登錄、代理設置
    3、cookie原理cookie由伺服器產生,瀏覽器第一次請求,伺服器發送給客戶端進而保存,瀏覽器在繼續訪問時,就會在請求頭的cookie欄位上附帶cookie信息,這樣伺服器就可以識別是誰在訪問了,但cookie也存在一定的缺陷,cookie數據保存在本地,不安全,容易被篡改。
  • Python模擬瀏覽器訪問網頁
    對於爬蟲程序來說這不是很好的事情,因為爬蟲最好是能偽裝成正常的瀏覽器訪問;2)headers填寫部分參數,老猿建議填寫下列參數: User-Agent:這個是表明使用的哪個瀏覽器的,關於其來歷可參考一下《轉:為什麼瀏覽器的user-agent字符串以』Mozilla』開頭呢?》
  • python 爬蟲之selenium可視化爬蟲
    文章目錄前文回顧快速入門元素定位頁面操作等待方式擴展程序加載私信小編01即可獲取Python大量資料之所以把selenium爬蟲稱之為可視化爬蟲主要是相較於前面所提到的幾種網頁解析的爬蟲方式selenium爬蟲主要是模擬人的點擊操作selenium驅動瀏覽器並進行操作的過程是可以觀察到的就類似於你在看著別人在幫你操縱你的電腦,類似於別人遠程使用你的電腦當然了,selenium也有無界面模式快速入門
  • 爬蟲基礎面試題(Python篇)
    動態加載(抓到的數據和瀏覽器顯示的不一樣),js渲染 模擬ajax請求,返回json形式的數據 4,selenium / webdriver 模擬瀏覽器加載 5,對抓到的數據進行分析 6,加密參數欄位 會話跟蹤cookie 防盜鏈設置Referer8:分布式爬蟲主要解決什麼問題?
  • Python爬蟲之selenium可視化爬蟲!最詳細的教程
    之所以把selenium爬蟲稱之為可視化爬蟲主要是相較於前面所提到的幾種網頁解析的爬蟲方式selenium可以模擬真實瀏覽器,自動化測試工具,支持多種瀏覽器,爬蟲中主要用來解決JavaScript渲染問題。
  • Django框架cookie和session的詳解
    Cookie的理解: cookie 其實就是鍵值對(key:value)格式的小段信息,它是由伺服器發送過來存儲在瀏覽器中的一組組鍵值對數據;當瀏覽器再次訪問時,瀏覽器會自動帶上Cookie,這樣伺服器就能通過Cookie的內容來判斷這個是「誰」了。
  • 小白如何入門 Python 爬蟲?
    本文針對初學者,我會用最簡單的案例告訴你如何入門python爬蟲!剛開始入門爬蟲,你甚至不需要去學習python的類、多線程、模塊之類的略難內容。找一個面向初學者的教材或者網絡教程,花個十幾天功夫,就能對python基礎有個三四分的認識了,這時候你可以玩玩爬蟲嘍!
  • 13天搞定python網絡爬蟲
    合法性爬蟲是利用程序進行批量爬取網頁上的公開信息,也就是前端顯示的數據信息。因為信息是完全公開的,所以是合法的。其實就像瀏覽器一樣,瀏覽器解析響應內容並渲染為頁面,而爬蟲解析響應內容採集想要的數據進行存儲。5.
  • Python爬蟲之Selenium的使用
    ,Selenium 可以直接運行在瀏覽器上,它支持所有主流的瀏覽器(包括PhantomJS這些無界面的瀏覽器(2018年開發者說暫停開發,chromedriver也可以實現同樣的功能)),可以接收指令,讓瀏覽器自動加載頁面,獲取需要的數據,甚至頁面截屏。
  • 初學者如何用「python爬蟲」技術抓取網頁數據?
    熟悉python編程剛開始入門爬蟲,初學者無需學習python的類,多線程,模塊和其他稍微困難的內容。2、為什麼要懂HTMLHTML是一種用於創建網頁的標記語言,該網頁嵌入了諸如文本和圖像之類的數據,這些數據可以被瀏覽器讀取並呈現為我們看到的網頁。這就是為什麼我們首先爬網HTML,然後解析數據的原因,因為數據隱藏在HTML中。
  • 自動登錄的方法 Python爬蟲的一大難題
    在爬蟲的爬取過程當中,會出現一些無法直接訪問的頁面,這些頁面一般需要用戶登錄之後才能獲取完整數據,在這種情況下,作為爬蟲的使用者就需要面對這個問題。怎麼解決呢?不過,有時爬蟲會遇到一些網站,這些網站信息的獲取都需要登錄之後才能獲取,這種情況下就需要使用爬蟲設置自動登錄了。那自動登錄該怎麼設置?在設置自動登錄之前,需要先獲取登錄後的 cookie。什麼是 cookie?
  • PythonPython100個練手項目|github|瀏覽器|爬蟲|python|斷點_網易...
    新浪微博爬蟲分享(一天可抓取 1300 萬條數據)    12. 新浪微博分布式爬蟲分享    13. python爬蟲教程,帶你從零到一    14. 豆瓣讀書的爬蟲    15. 鏈家網和貝殼網房價爬蟲    16.
  • 細說小白學python爬蟲過程中常見的反爬措施及解決思路(乾貨)
    最近有很多朋友和我討論python爬蟲遇到的反爬措施及解決辦法,今天我就給大家分享一下自己在爬蟲過程中遇到的坑及解決思路,希望對大家有所幫助。​看不見的反爬措施一是加header頭部信息:什麼是header頭?
  • Python爬蟲入門第一課:如何解析網頁
    ,通過爬蟲去自動完成我們想在網站中做的一些事情。從今天開始我會從基礎開始講解如何通過網絡爬蟲去完成你想要做的事。先來看一段簡單的代碼。這時候我們可以打開瀏覽器的控制臺,推薦使用谷歌或者火狐瀏覽器,按F進入坦克,不,按F12進入瀏覽器控制臺,然後點擊NetWork。在這裡我們就可以看到這個網頁中發生的所有網絡請求和響應了。
  • 總算領會為什麼要選擇Python寫網絡爬蟲?
    什麼是網絡爬蟲?網絡爬蟲 是一個自動提取網頁的程序,它為搜尋引擎從全球資訊網上下載網頁,是搜尋引擎的重要組成。通俗的講就是通過程序去獲取web頁面上自己想要的數據,也就是自動抓取數據。不得不說,Python爬蟲對於我來說真是個神器。NO.1 快速開發(唯一能和python比開發效率的語言只有rudy)語言簡潔,沒那麼多技巧,所以讀起來很清楚容易。
  • Python爬蟲實戰:2020最新BOOS直聘爬取教程
    Python爬蟲實戰:2020最新BOOS直聘爬取教程前言完整代碼及注釋分析圖片輔助分析運行結果更多爬蟲教程關注我前言來到BOOS直聘搜索pythonimport BeautifulSoupimport timeimport pymysql插入語句sql = &34;34;User-Agent&34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36&爬取boos直聘cookie
  • python爬蟲很強大,在爬蟲裡如何自動操控瀏覽器呢?
    概述:python通過selenium爬取數據是很多突破封鎖的有效途徑。但在使用selenium中會遇到很多問題,本文就通過一問一答的形式來通熟易懂的普及如何通過selenium執行javascript程序,進而獲取動態執行後的網頁。如果你喜歡,歡迎轉發本文。python爬蟲編程:用selenium執行javascript出錯了,該咋改?
  • python 爬蟲學習路線:從入門到進階
    本文依舊需要有一些python基礎,至少要求掌握python語法。前置條件:python開發環境首先,學習python爬蟲,需要會:自己安裝python,python庫以及自己的編輯器。這個前置條件呢,在涼拌以前的文章寫過,這裡涼拌就不再贅述,不會的同學可以點下面的連結看一看。
  • Python無頭爬蟲Selenium系列(01):像手工一樣操作瀏覽器
    轉發本文並私信我"python",即可獲得Python資料以及更多系列文章(持續更新的)作為"數據玩家",如果手頭上沒有數據怎麼辦?當然是用代碼讓程序自動化採集數據,但是現在"爬蟲"不是那麼容易,其中最困難的即是突破網站各種反爬機制。