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='')  # 此處填自己的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM