12.22 純正乾貨,Python爬蟲爬取數據時的自動登錄方法


在爬蟲的爬取過程當中,會出現一些

無法直接訪問的頁面,這些頁面一般需要用戶登錄之後才能獲取完整數據,在這種情況下,作為爬蟲的使用者就需要面對這個問題。

純正乾貨,Python爬蟲爬取數據時的自動登錄方法

怎麼解決呢?


一般來說,有兩種方法:


一、手動輸入

純正乾貨,Python爬蟲爬取數據時的自動登錄方法

二、自動輸入

純正乾貨,Python爬蟲爬取數據時的自動登錄方法

在一些網站當中,我們只需要在一開始登錄賬號之後,就可以不用再管,像這種網站,就適合手動輸入,一次輸入,不需要再次調整


不過,有時爬蟲會遇到一些網站,這些網站信息的獲取都需要登錄之後才能獲取,這種情況下就需要使用爬蟲設置自動登錄了。


那自動登錄該怎麼設置?


在設置自動登錄之前,需要先獲取登錄後的 cookie


什麼是 cookie


cookie就是某些網站為了辨別用戶身份,進行Session跟蹤儲存在用戶

本地終端上的數據,由用戶客戶端計算機暫時或永久保存的信息


當服務器接收到複數的請求時,是無法判斷出哪些請求是由同一個客戶端發起的。於是就需要讀取cookie來標識客戶端的身份,以存儲它的信息,比如登錄狀態等。cookie 保存在發起請求的客戶端中,服務器利用cookie來區分不同的客戶端


用通俗的話來講, cookie 就是網站驗證用戶的一張身份證。用戶持有的這張身份證在登錄時供訪問網站查看


為了實現自動登錄的目的,我們就需要獲取登錄時的 cookie 進行解析。


如何獲取 cookie ?


  在訪問被爬取網站時,先使用瀏覽器登錄。再打開開發者工具,轉到network選項卡。在左邊的Name一欄找到當前的網址,選擇右邊的Headers選項卡,查看Request Headers,這裡包含了該網站頒發給瀏覽器的cookie

純正乾貨,Python爬蟲爬取數據時的自動登錄方法

就像上圖中 cookie ,後面有我們登錄時用的 ID 信息,和各種我們自動登錄時所用的信息。


得到 cookie 之後,就可以進行進一步處理,將 cookie 中的信息處理成字符串,供下一步處理。代碼如下:


import requests

import sys

import io


sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')

#改變標準輸出的默認編碼


#登錄後才能訪問的網頁

url = 'http://xxxx.com/cmstar/index.portal'


#瀏覽器登錄後得到的cookie,也就是剛才複製的字符串

cookie_str = r'JSESSIONID=xxxxxxxxxxxxxxxxxxxxxx; iPlanetDirectoryPro=xxxxxxxxxxxxxxxxxx'


#把cookie字符串處理成字典,以便接下來使用

cookies = {}

for line in cookie_str.split(';'):

key, value = line.split('=', 1)

cookies[key] = value


#設置請求頭

headers

= {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'}


#在發送get請求時帶上請求頭和cookies

resp = requests.get(url, headers = headers, cookies = cookies)

print(resp.content.decode('utf-8'))


在設置好之後,就可以進行下一步。


用session保持登錄狀態


session 在計算機中,尤其是在網絡應用中,被稱為“會話控制”。Session對象存儲特定用戶會話所需的屬性及配置信息。這樣,當用戶在應用程序的Web頁之間跳轉時,存儲在Session對象中的變量將不會丟失,而是在

整個用戶會話中一直存在下去


用通俗的說法就是,session可以用戶保持在登錄狀態,讓服務器認為它一直在和客戶端對話,從而保證了爬蟲在爬取數據的過程中,登錄狀態的保證。


這一步驟只需要在上述的代碼當中添加一段代碼即可,代碼如下:


#登錄時需要POST的數據

data = {'Login.Token1':'賬號',

'Login.Token2':'密碼',

'goto:http':'//xxxxx.com/loginSuccess.portal',

'gotoOnFail:http':'//xxxxx.com/loginFailure.portal'}


#設置請求頭

headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'}


#登錄時表單提交到的地址(用開發者工具可以看到)

login_url = 'http://xxxxx.com/userPasswordValidate.portal'


#構造Session

session = requests.Session()


#在session中發送登錄請求,此後這個session裡就存儲了cookie

#可以用print(session.cookies.get_dict())查看

resp = session.post(login_url, data)


#登錄後才能訪問的網頁

url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal'


#發送訪問請求

resp = session.get(url)


print(resp.content.decode('utf-8'))


這樣就可以在使用爬蟲的過程中,讓其自己登錄所爬的網站,並獲取數據了


如果想學習更多科技知識,可以點擊關注


如果對文章中的內容有什麼困惑的地方,可以在評論區提出自己的問題,學記同大家一起交流,解決各種問題,一起進步。


青年學記 陪伴著各位青年

純正乾貨,Python爬蟲爬取數據時的自動登錄方法


作者:青年學記 一名不斷進步的程序


一起學習 一起進步


走向自立



分享到:


相關文章: