數據爬取實戰 —— 爬取GitHub上用戶的郵箱

找到GitHub上與Java相關的項目

這一步要求:會用搜索,善用搜索

在GitHub官網的Marketplace和Explore頁面中無法找到只與Java有關的所有項目,那麼怎麼辦哪?

在Google中搜索"github java",發現了下面的結果:

點進去後全都是與Java有關的項目:

當然,在這個頁面上不可能將所有的Java項目全部展示出來,所以有了下面的"Load more..."按鈕:

項目數據爬取

通過上一節可知:

  1. 項目頁面中展示了項目名和start數。
  2. 一頁中顯示的項目數有限,如果需要獲取更多的項目數據,就需要通過Load more獲取更多數據。

頁面數據爬取我使用的是Java三方庫:

<dependency>
    <groupId>net.dongliu</groupId>
    <artifactId>requests</artifactId>
    <version>4.18.2</version>
</dependency>

HTML解析我使用的是Java三方庫:

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.11.3</version>
</dependency>

如果要通過程序自動爬取更多的項目數據,需要費分析"Load more..."按鈕,通過程序模擬它。使用chrome訪問頁面,打開"開發者工具",切換到Network選項卡,然後點擊按鈕,發現請求的鏈接及其響應的數據:

通過Jsoup解析響應的HTML頁面。

如果我們代碼調用這個鏈接,那麼需要知道鏈接中的"utf8"和"after"來自於哪裏。經過分析,這兩個值在HTML中存在,每次Load more,服務端都會返回這兩個字段的新值。

讀取項目的Contributors

知道了項目,那麼還需要知道項目的Contributors。在上一節中解析HTML中的項目鏈接,訪問項目的contributors頁面,可以看到貢獻者列表:

我們需要爬取這個列表,然後訪問貢獻者的用戶頁面。

貢獻者列表是在頁面加載後異步請求的,具體的異步鏈接地址可通過搜索關鍵字定位到,例如:

想要通過這個鏈接正確的獲取數據,需要訪問的時候填入正確的Header。

GitHub用戶頁面爬取

打開一個GitHub用戶的主頁,在主頁上可以看到他的郵箱,查看一下郵箱數據所在的元素:

通過上面截圖中發現,itemprop等於homeLocation是裏面的內容是用戶地址,itemprop等於email的裏面的內容是用戶郵箱。

知道頁面中數據存在的位置以後,通過requests庫訪問主頁鏈接獲取頁面數據,請求語句:

new String(Requests.newRequest(Methods.GET, <url>).timeout(<timeout>).requestCharset(StandardCharsets.UTF_8).send().charset(StandardCharsets.UTF_8).readToBytes())

但是,請求返回的頁面數據中並沒有發現上面提到的關鍵字。這說明我們請求的姿勢不對。

在chrome瀏覽器中打開開發者工具,打開Network標籤頁搜索關鍵字,第一次直接以郵箱,發現沒有搜到到數據:

這隻說明一個問題:服務的返回的郵箱數據被加密了,直接搜索是搜不到的。

郵箱解碼

沒關係,我們搜其他關鍵字:

這次發現了郵箱數據,郵箱的數據的確被加密。那麼如何解密哪?

這個郵箱加密後的結果很奇怪,不像是AES,DES等加密算法加密後的樣子,也不像Unicode編碼,它像是轉義字符,並且每個值通過分號(";")分隔。經過分析發現將每個值的前綴"&#"和後綴";"去掉後,是一個十六進制數。經過對這個十六進制數據進行觀察分析,看起來像是ASCII碼,查詢了一下ASCII碼錶印證了分析。將郵箱加密數據進行ASCII解碼後,即可得到明文我郵箱。

數據請求鏈接

現在還有一個問題:郵箱數據有,但是上文提到直接通過requests庫訪問用戶主頁是拿不到郵箱數據的。那麼我如何通過URL去獲取這些數據哪?

我做了初步判斷,有兩種可能:

  1. 代碼中訪問鏈接時帶的參數不對,導致未返回正確數據
  2. 請求郵箱等用戶信息的數據另有其他鏈接 根據上文中貼出的搜索關鍵字的圖片發現,郵箱等用戶數據的確是通過用戶主頁鏈接返回回來的,那麼排除掉了第二種可能。

查看一下請求的參數,將請求的Header數據在代碼中完全模擬,成功的獲取了用戶信息。Header數據截圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章