Python爬蟲學習筆記之模擬登陸並爬去GitHub
(1)環境準備:
請確保已經安裝了requests和lxml庫
(2)分析登陸過程:
首先要分析登陸的過程,需要探究後臺的登陸請求是怎樣發送的,登陸之後又有怎樣的處理過程。
如果已經登陸GitHub,則需要先退出登陸,同時清除Cookies
打開GitHub的登陸頁面,鏈接為https://github.com/login,輸入GitHub的用戶名和密碼,打開開發者工具
,將Preserver Log選項勾選上,這表示持續日誌,如下圖所示
點擊登錄按鈕,這時便會看到開發者工具下方顯示了各個請求過程,如下圖所示:
點擊session請求,進入其詳情,如下圖所示:
可以看到請求的URL為https://www.github.com/session,請求方式為POST。再往下看,我們觀察到他的Form Data和Headers這兩部分內容,
如下圖所示:
Headers裏面包含了Cookies,Host,Origin,Refer,User-Agent等信息。Form Data包含了5個字段,commit是固定的字符串Sign in,utf8
是一個勾選字符,authenticity_token較長,其初步判斷是一個Base64加密的字符串,login是登陸的用戶名,password是登陸的密碼。
綜上所述,我們現在無法直接構造的內容有Cookies和authenticity_token。下面我們再來探尋一下這部分內容如何獲取。
在登陸之前我們會訪問到一個登陸頁面,此頁面是通過GET形式訪問的。輸入用戶名和密碼,點擊登錄按鈕,瀏覽器發送這兩部分信息,也就是
說Cookies和authenticity_token一定在訪問扥估頁面時候設置的。
這時在退出登陸,回到登錄頁,同時清除Cookies,重新訪問登錄頁,截獲發生的請求,如下圖所示:
訪問登陸頁面的請求如上,Response Headers有一個Set-Cookie字段。這就是設置Cookies的過程。
另外,我們發現Response Headers沒有和authenticity_token相關的信息,所以可能authenticity_token還隱藏在其他的地方或者是計算出來的
。我們再從網頁的源碼探尋,搜索相關字段,發現源代碼裏面還隱藏著此信息,他是一個隱藏式表單元素,如下圖所示:
現在我們已經獲取到網頁所有信息,接下來讓我們 實現模擬登陸
(3)代碼如下:
1 import requests 2 from lxml import etree 3 4 class Login(object): 5 def __init__(self): 6 self.headers = { 7 ‘Refer‘: ‘https://github.com‘, 8 ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ‘ 9 ‘Chrome/68.0.3440.75 Safari/537.36‘, 10 ‘Host‘: ‘github.com‘ 11 } 12 self.login_url = ‘https://github.com/login‘ 13 self.post_url = ‘https://github.com/session‘ 14 self.logined_url = ‘https://github.com/settings/profile‘ 15 self.session = requests.Session() # 此函數可以幫助我們維持一個會話,而且可以自動處理cookies,我們不用再去擔心cookies的問題 16 17 def token(self): 18 response = self.session.get(self.login_url, headers=self.headers) # 訪問GitHub的登錄頁面 19 selector = etree.HTML(response.text) 20 token = selector.xpath(‘//div//input[2]/@value‘)[0] # 解析出登陸所需的authenticity_token信息 21 return token 22 23 def login(self, email, password): 24 post_data = { 25 ‘commit‘: ‘Sign in‘, 26 ‘utf-8‘: ‘?‘, 27 ‘authenticity_token‘: self.token(), 28 ‘login‘: email, 29 ‘password‘: password 30 } 31 response = self.session.post(self.post_url, data=post_data, headers=self.headers) 32 if response.status_code == 200: 33 self.dynamics(response.text) 34 35 response = self.session.get(self.logined_url, headers=self.headers) 36 if response.status_code == 200: 37 self.profile(response.text) 38 39 def dynamics(self, html): # 使用此方法提取所有動態信息 40 selector = etree.HTML(html) 41 dynamics = selector.xpath(‘//div[contains(@class, "news")]//div[contains(@class, "alert")]‘) 42 for item in dynamics: 43 dynamics = ‘ ‘.join(item.xpath(‘.//div[@class="title"]//text()‘)).strip() 44 print(dynamics) 45 46 def profile(self, html): # 使用此方法提取個人的昵稱和綁定的郵箱 47 selector = etree.HTML(html) 48 name = selector.xpath(‘//input[@id="user_profile_name"]/@value‘)[0] 49 email = selector.xpath(‘//select[@id="user_profile_email"]/option[@value!=""]/text()‘) 50 print(name, email) 51 52 if __name__ == "__main__": 53 login = Login() 54 login.login(email=‘‘, password=‘‘) # 此處填自己的
Python爬蟲學習筆記之模擬登陸並爬去GitHub