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

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

獲取 Chrome 瀏覽器的 Cookies 信息的函數
程序在 Windows 下調試經過, 由於 C 盤須要特殊權限來讀寫文件, 所以程序先將 Cookies 數據庫文件拷貝到當前目錄. html

 import win32crypt 報錯,請安裝 pip install pypiwin32java

#!/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

使用requestspython

 

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網絡請求簡潔之道]linux

使用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:sql

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瀏覽器是如何存儲密碼的][瀏覽器是如何存儲密碼的]chrome

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

 

當你的輸出中存在「我的主頁」「退出登陸」字樣,就說明登陸成功了,不然只會有「登陸」「註冊」之類的字符串。數據庫

此方法一樣能夠應用於知乎等等網站的登陸。

皮皮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 爬蟲解決登陸問題的另類方法

相關文章
相關標籤/搜索