python3爬蟲 - 利用瀏覽器cookie登錄


爬蟲爬網站不免遇到需要登錄的問題. 登錄的時候可能還會碰到需要填驗證碼的問題, 有的驗證碼甚至是拖動拼圖來完成的. 雖然現在這些都有開源解決方案, 但是假設現在主要的精力想要放在如何解析html, 或者驗證抓取算法上, 而不是通過登錄驗證上, 那么開源解決方案並不是最好的解決方案.更好的方案是獲取瀏覽器的 Cookies, 然后讓 requests 這個庫來直接使用登錄好的 Cookies. 

獲取 Chrome 瀏覽器的 Cookies 信息的函數
程序在 Windows 下調試通過, 因為 C 盤需要特殊權限來讀寫文件, 因此程序先將 Cookies 數據庫文件拷貝到當前目錄. 

 import win32crypt 報錯,請安裝 pip install pypiwin32

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__author__ = 'pi'
__email__ = 'pipisorry@126.com'
"""
import subprocess
import sqlite3
import win32crypt

import requests

SOUR_COOKIE_FILENAME = r'C:\Users\pi\AppData\Local\Google\Chrome\User Data\Default\Cookies'
DIST_COOKIE_FILENAME = '.\python-chrome-cookies'


def get_chrome_cookies(url):
    subprocess.call(['copy', SOUR_COOKIE_FILENAME, DIST_COOKIE_FILENAME], shell=True)
    conn = sqlite3.connect(".\python-chrome-cookies")
    ret_dict = {}
    for row in conn.execute("SELECT host_key, name, path, value, encrypted_value FROM cookies"):
        # if row[0] not in url:
        if row[0] != url:
            continue
print(row[0])
        ret = win32crypt.CryptUnprotectData(row[4], None, None, None, 0)
        ret_dict[row[1]] = ret[1].decode()
    conn.close()
    subprocess.call(['del', '.\python-chrome-cookies'], shell=True)
    return ret_dict

使用requests

 

DOMAIN_NAME = '.jobbole.com'
get_url = r'http://www.jobbole.com/'
response = requests.get(get_url, cookies=get_chrome_cookies(DOMAIN_NAME))
print(response.text)

 

Note: 要安裝requests庫,安裝及使用blog[python爬蟲 - python requests網絡請求簡潔之道]

使用urllib

 

import urllib.request

DOMAIN_NAME = '.jobbole.com'
get_url = r'http://www.jobbole.com/'
headers = {'Cookie': ['='.join((i, j)) for i, j in get_chrome_cookies(DOMAIN_NAME).items()][0]}
request = urllib.request.Request(get_url, headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode())

 

Note:

1. chrome瀏覽器加密后的密鑰存儲於%APPDATA%\..\Local\Google\Chrome\User Data\Default\Login Data"下的一個SQLite數據庫中,可以通過Sqlite瀏覽器來查看一下登陸文件中的數據。密碼是調用Windows API函數CryptProtectData來加密的。這意味着,只有用加密時使用的登陸證書,密碼才能被恢復。而這根本不是問題,在用戶登陸環境下執行解密就OK。SQLite數據庫中password_value(是二進制數據,所以SQLite瀏覽器不能顯示)。而破解密碼,只需要調用Windows API中的CryptUnprotectData函數。[谷歌Chrome瀏覽器是如何存儲密碼的][瀏覽器是如何存儲密碼的]

2. Python為調用Windows API准備了一個完美的叫做pywin32的庫。只有安裝了pywin32才能調用win32crypt。安裝教程見[linux和windows下安裝python拓展包]

 

當你的輸出中存在“個人主頁”“退出登錄”字樣,就說明登錄成功了,否則只會有“登錄”“注冊”之類的字符串。

此方法同樣可以應用於知乎等等網站的登錄。

皮皮Blog

 

 

獲取 Chrome 瀏覽器的 Cookies 信息的的另一種方法

chrome > 更多工具 > javascript控制台 > 對應當前頁面輸入document.cookie。就可以得到當前網頁的cookie相關內容,復制到代碼中就可以使用了。

或者使用fiddler2,headers中找到Cookie: wordpress_logged_in_0efdf49af511fd88681529ef8c2e5fbf=*************************[cookie登錄實戰 - 也可以下載軟件Fiddler部分]

wordpress_logged_in_0efdf49af511fd88681529ef8c2e5fbf=pipiyn%7C1440989529%7C45ec5e30a3b24a68208815cc5c572c14

 

get_url = r'http://www.jobbole.com/'
cookies = {'wordpress_logged_in_0efdf49af511fd88681529ef8c2e5fbf': '***username****%*******%**********'}
response = requests.get(get_url, cookies=cookies)
print(response.text)

 

Note:

1. domain.com 是一級域名,www.domain.com 是域名 domain.com 的一個比較特殊的二級域名。他的特殊就在於現在的實踐中,人們在解析域名的的時候,在慣例和默認的情況下,是把 www.domain.com 這個二級域名指向它的一級域名 domain.com。因此,現在的大部分情況下,domain.com 和 www.domain.com,都是一樣的。 但是如果在解析域名的時候,沒有做這樣的設定,也可能就會有區別。

2. 不過可能document.cookie 獲取到 www.domain.com 的 cookies, 而不是 .domain.com 的。

from:http://blog.csdn.net/pipisorry/article/details/47980653

ref:Python 爬蟲解決登錄問題的另類方法


免責聲明!

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



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