在爬蟲的爬取過程當中,會出現一些
無法直接訪問的頁面,這些頁面一般需要用戶登錄之後才能獲取完整數據,在這種情況下,作為爬蟲的使用者就需要面對這個問題。怎麼解決呢?
一般來說,有兩種方法:
一、手動輸入
二、自動輸入
在一些網站當中,我們只需要在一開始登錄賬號之後,就可以不用再管,像這種網站,就適合手動輸入,一次輸入,不需要再次調整。
不過,有時爬蟲會遇到一些網站,這些網站信息的獲取都需要登錄之後才能獲取,這種情況下就需要使用爬蟲設置自動登錄了。
那自動登錄該怎麼設置?
在設置自動登錄之前,需要先獲取登錄後的 cookie。
什麼是 cookie?
cookie就是某些網站為了辨別用戶身份,進行Session跟蹤而儲存在用戶
本地終端上的數據,由用戶客戶端計算機暫時或永久保存的信息。當服務器接收到複數的請求時,是無法判斷出哪些請求是由同一個客戶端發起的。於是就需要讀取cookie來標識客戶端的身份,以存儲它的信息,比如登錄狀態等。cookie 保存在發起請求的客戶端中,服務器利用cookie來區分不同的客戶端。
用通俗的話來講, cookie 就是網站驗證用戶的一張身份證。用戶持有的這張身份證在登錄時供訪問網站查看。
為了實現自動登錄的目的,我們就需要獲取登錄時的 cookie 進行解析。
如何獲取 cookie ?
在訪問被爬取網站時,先使用瀏覽器登錄。再打開開發者工具,轉到network選項卡。在左邊的Name一欄找到當前的網址,選擇右邊的Headers選項卡,查看Request Headers,這裡包含了該網站頒發給瀏覽器的cookie。
就像上圖中 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'))
這樣就可以在使用爬蟲的過程中,讓其自己登錄所爬的網站,並獲取數據了
如果想學習更多科技知識,可以點擊關注。
如果對文章中的內容有什麼困惑的地方,可以在評論區提出自己的問題,學記同大家一起交流,解決各種問題,一起進步。
青年學記 陪伴著各位青年
作者:青年學記 一名不斷進步的程序猿
一起學習 一起進步
走向自立
閱讀更多 青年學記 的文章