#Python爬蟲#前面講過 python 爬蟲的常用技巧總結,帶你輕鬆入門,今天補上一篇實戰指南,爬取知識星球裡某個星球的所有數據,對,你沒有聽錯,是所有數據,包括了內容、問答、評論、圖片、文件、甚至是誰點了贊!心動了吧,趕快行動吧。
當然,本篇文章需要你有一點 python 基礎,如果沒有的話,建議你先收藏,去找一些教程學習一下這門工具人語言。
好了,廢話不多說,馬上開始。
首先,導入所需要的包:
準備資料庫
把獲取的數據存入 MongoDB 中,為什麼選擇 MongoDB?因為非關係型資料庫比較簡單,我們用到的數據結構也不複雜,開發起來比較快。
分析知識星球的網絡請求數據
用 Chrome 瀏覽器的開發者工具對知識星球 PC 端的網絡請求進行觀察,發現獲取星球話題的請求只有一個,我們把它賦值給 BASE_URL。同時發現登錄的 token 就在 cookie 裡面: zsxq_access_token,嘖嘖,太明顯了。
對話題數據進行分析,可以歸納總結出以下結論:
話題類型有兩種:talk 是普通話題,只有 1 條內容,q&a 是問答,問答含有提問和回答 2 條內容。所有內容均可能包含圖片或者文件(不太確定問答的內容是否會包含文件,因此當作可能包含文件處理)。當請求返回的話題數量為 0 時,說明已經爬取完畢。我的 CPU 有 4 個核心,考慮到文本、圖片、文件出現的頻次和下載時間,多線程設計如下:
設計 3 個隊列:topic_q、images_q、files_q,分別存取 end_time、圖片信息、文件信息,分別用於獲取話題信息、下載圖片、下載文件。設計 4 個線程,1 個獲取話題信息,2 個下載圖片,1個下載文件。當所有隊列結束時,程序結束。
流程
為了能讓你更好地理解,我畫了一副流程圖,可以配合流程圖來理解代碼,事半功倍。
多線程並行
根據上面的分析,創建 3 個隊列,4 個線程,並把下面地代碼放到連接、關閉資料庫代碼的中間:
下面是各個線程函數,作用是不斷的從對應任務隊列中取出參數並執行處理方法,fetch_topics、fetch_images、fetch_files 分別是下載對應內容的方法。
下載話題數據
創建 fetch_topics 方法,用來發送獲取星球話題的請求,上面已經設置好了 BASE_URL,這裡設置請求參數即可。
觀察發現,API 的參數有 3 個,分別是:
scope:話題範圍,例如:精華話題還是圖片話題。all 代表全部話題。count:返回的話題數量,網站裡默認 20 個,但經測試,30 個也能正常返回,40個以上報錯。end_time:關鍵參數,知識星球通過它來分頁,不填則返回最新的 count 個話題,比如 20,如果你想得到第 21 - 40 個話題,那麼就需要設置 end_time 為第 20 條話題的創建時間,並且要把創建時間的毫秒數減 1。
下載圖片
圖片可能包含三種類型:thumbnail 縮略圖、large 大圖、original 原圖,不一定全都有,因此在下載前要判斷。
下載文件
知識星球 PC 端是無法下載文件的,我用手機抓包後才得到了下載地址:
以上就是今天的實戰指南。最後是你們最關心的哪裡下載源碼?老實說,我能給你的最好建議其實是按照上面的例子自己敲一遍,真的很管用,學編程就是要動手。
註:所有代碼均基於 python 3.6.5 版本,使用其他版本可能無法運行。
如何下載源碼以及更多的編程資源?只需簡單 2 步:
1. 關注百家號:灣區碼農,也就是我
2. 回復關鍵詞 zsxq即可獲得
求求你,長按下面的贊,給我個三連吧,這個對我真的很重要~