1. 程式人生 > >對github的爬取,涉及請求的分析,登入爬取,request中session物件的使用

對github的爬取,涉及請求的分析,登入爬取,request中session物件的使用

其實github的爬取相對來說是比較簡單的,可以不用框架直接使用requests和BF就可以完成一個縱向的爬取。
代理工具:fiddler
首先說一下這次爬取的資料,是github上遞迴的爬取使用者主頁的資訊,包括博主和此博主主頁上最受歡迎的六個專案(Popular Repositories)專案的名稱,簡介,星數和轉載數。

在這裡插入圖片描述這是爬取的資訊。

接下來我們來分析github的爬取,從登陸到遞迴爬取的整個過程。

第一步:我們登陸試試,用fiddler擷取一下login頁面的post請求,分析一下登陸需要傳遞給主機的data。
首先我們到login頁面,輸入密碼賬號然後發出post請求
在這裡插入圖片描述


通過fidddler的擷取,我們獲得了post請求。如圖
在這裡插入圖片描述如圖中,我們就有了post請求需要傳送給主機的資料,他們是:
commit :Sign in
utf8 :✓
authenticity_token :36lBh69HcWi1QIS4DrgIwpXrT8KZ5QBuxZwrOP5upQPP+ARZFFQ8aljDFg4ZlOxoxPgbKmWHE7UV8tB7CUIxeg==
login :username
password :password

以上,我們知道除了使用者名稱和密碼,我們不知道的資料是“authenticity_token”,這個資料從哪裡來呢?你可以考慮是js動態計算出來的,但是好像沒有js檔案。其實我們首先應該考慮從login頁面中提取出來。那我們擷取login頁面,看一下從login響應體中是不是可以提取出想要的“authenticity_token”.
如圖,我們截取了login頁面,通過搜尋,找到了引數。
在這裡插入圖片描述

現在需要的只是把“authenticity_token”引數提取出來。

在貼出這一段程式碼之前,我們應該明白requests模組的session物件。session物件例項,是一個對話的例項,它可以跨請求保持cookie(在計算機網路相關知識中有隊session的詳細解釋)。也就是通過cookie傳送的所有請求都保持著登陸上去的cookies。接下來我們貼出這段的程式碼。

    def login(self, user_name, password):
        # 傳進必要的引數,然後登陸
        post_data = {
            "commit":"Sign in",
            "utf8":"✓",
            "authenticity_token":self.parse_loginPage(),
            "login":user_name,
            "password":password
        }

        logined_html = self.session.post(url=self.post_url, data=post_data, headers=self.logined_headers, verify=False)
        if logined_html.status_code == 200:
            dashboardHtml = self.session.get(url=self.logined_url, headers=self.login_headers, verify=False)
            self.parse_loginedHtml(dashboardHtml)
            # 函式用於解析登陸後的主頁,主頁上有你關注人的最新動態,通過這個為入口,進行遞迴查詢。

主頁:
在這裡插入圖片描述
圖示的方框中的動態版就是我們爬取的入口。
其url為:https://github.com/dashboard-feed
在這裡插入圖片描述在其中提取出人名就可,然後我們就可以構造其他人的主頁連結,就可以進一步爬取了。
主頁中我們爬取的內容用方框框起來了。
在這裡插入圖片描述這樣,我們就完成的基本的爬取,至於**原始碼,在我的github上,**連結在此。
https://github.com/mikeyumingtao/PythonHouse/blob/master/githubSpider.py