這篇文章主要講解了Python3如何實現(xiàn)模擬登錄和爬取,內(nèi)容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。
網(wǎng)站建設哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、微信小程序開發(fā)、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了清苑免費建站歡迎大家使用!我們先以一個最簡單的實例來了解模擬登錄后頁面的抓取過程,其原理在于模擬登錄后 Cookies 的維護。
1. 本節(jié)目標
本節(jié)將講解以 GitHub 為例來實現(xiàn)模擬登錄的過程,同時爬取登錄后才可以訪問的頁面信息,如好友動態(tài)、個人信息等內(nèi)容。
我們應該都聽說過 GitHub,如果在我們在 Github 上關注了某些人,在登錄之后就會看到他們最近的動態(tài)信息,比如他們最近收藏了哪個 Repository,創(chuàng)建了哪個組織,推送了哪些代碼。但是退出登錄之后,我們就無法再看到這些信息。
如果希望爬取 GitHub 上所關注人的最近動態(tài),我們就需要模擬登錄 GitHub。
2. 環(huán)境準備
請確保已經(jīng)安裝好了 requests 和 lxml 庫,如沒有安裝可以參考第 1 章的安裝說明。
3. 分析登錄過程
首先要分析登錄的過程,需要探究后臺的登錄請求是怎樣發(fā)送的,登錄之后又有怎樣的處理過程。
如果已經(jīng)登錄 GitHub,先退出登錄,同時清除 Cookies。
打開 GitHub 的登錄頁面,鏈接為 https://github.com/login,輸入 GitHub 的用戶名和密碼,打開開發(fā)者工具,將 Preserve Log 選項勾選上,這表示顯示持續(xù)日志,如圖 10-1 所示。
點擊登錄按鈕,這時便會看到開發(fā)者工具下方顯示了各個請求過程,如圖 10-2 所示。
點擊第一個請求,進入其詳情頁面,如圖 10-3 所示。
可以看到請求的 URL 為 https://github.com/session,請求方式為 POST。再往下看,我們觀察到它的 Form Data 和 Headers 這兩部分內(nèi)容,如圖 10-4 所示。
Headers 里面包含了 Cookies、Host、Origin、Referer、User-Agent 等信息。Form Data 包含了 5 個字段,commit 是固定的字符串 Sign in,utf8 是一個勾選字符,authenticity_token 較長,其初步判斷是一個 Base64 加密的字符串,login 是登錄的用戶名,password 是登錄的密碼。
綜上所述,我們現(xiàn)在無法直接構造的內(nèi)容有 Cookies 和 authenticity_token。下面我們再來探尋一下這兩部分內(nèi)容如何獲取。
在登錄之前我們會訪問到一個登錄頁面,此頁面是通過 GET 形式訪問的。輸入用戶名密碼,點擊登錄按鈕,瀏覽器發(fā)送這兩部分信息,也就是說 Cookies 和 authenticity_token 一定是在訪問登錄頁的時候設置的。
這時再退出登錄,回到登錄頁,同時清空 Cookies,重新訪問登錄頁,截獲發(fā)生的請求,如圖 10-5 所示。
訪問登錄頁面的請求如圖所示,Response Headers 有一個 Set-Cookie 字段。這就是設置 Cookies 的過程。
另外,我們發(fā)現(xiàn) Response Headers 沒有和 authenticity_token 相關的信息,所以可能 authenticity_token 還隱藏在其他的地方或者是計算出來的。我們再從網(wǎng)頁的源碼探尋,搜索相關字段,發(fā)現(xiàn)源代碼里面隱藏著此信息,它是一個隱藏式表單元素,如圖 10-6 所示。
現(xiàn)在我們已經(jīng)獲取到所有信息,接下來實現(xiàn)模擬登錄。
4. 代碼實戰(zhàn)
首先我們定義一個 Login 類,初始化一些變量:
class Login(object): def __init__(self): self.headers = { 'Referer': 'https://github.com/', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36', 'Host': 'github.com' } self.login_url = 'https://github.com/login' self.post_url = 'https://github.com/session' self.logined_url = 'https://github.com/settings/profile' self.session = requests.Session()