1. 程式人生 > >Python爬蟲入門教程 21-100 網易雲課堂課程資料抓取

Python爬蟲入門教程 21-100 網易雲課堂課程資料抓取

寫在前面

今天咱們抓取一下網易雲課堂的課程資料,這個網站的資料量並不是很大,我們只需要使用requests就可以快速的抓取到這部分資料了。
你第一步要做的是開啟全部課程的地址,找出爬蟲規律,

地址如下:
https://study.163.com/courses/

在這裡插入圖片描述

我簡單的看了一下,頁面資料是基於
https://study.163.com/p/search/studycourse.json 這個地址進行非同步載入的。你自己嘗試的時候需要藉助開發者工具
進行多次嘗試,抓取到這個地址的資料為準。

還有一個地方需要注意,這次是post提交方式,並且提交資料是payload型別的,這個原因導致我們的程式碼和以前的略微有一些不同的地方。

在這裡插入圖片描述

提取post關鍵字,看一下各個引數的意思,如果你爬取的網站足夠多,那麼訓練出來的敏感度能夠快速的分析這些引數

{"pageIndex":55, # 頁碼
"pageSize":50,  # 每頁資料大小
"relativeOffset":2700,
"frontCategoryId":-1,
"searchTimeType":-1,
"orderType":50,
"priceType":-1,
"activityId":0,
"keyword":""   # 搜尋相關
}

好了,可以開始編寫程式碼了,核心的程式碼就是通過requests模組傳送post請求

def get_json(index):
    print(f"正在抓取{index}頁資料")
    payload = {"pageIndex":index,
            "pageSize":50,
            "relativeOffset":50,
            "frontCategoryId":-1,
            "searchTimeType":-1,
            "orderType":50,
            "priceType":-1,
            "activityId":0,
            "keyword":""
    }
    headers = {"Accept":"application/json",
               "Host":"study.163.com",
               "Origin":"https://study.163.com",
               "Content-Type":"application/json",
               "Referer":"https://study.163.com/courses",
               "User-Agent":"自己去找個瀏覽器UA"
    }
    try:
        # 請注意這個地方傳送的是post請求
        # CSDN 部落格 夢想橡皮擦
        res = requests.post("https://study.163.com/p/search/studycourse.json",json=payload,headers=headers)
        content_json = res.json()
        if content_json and content_json["code"] == 0:
            data = get_content(content_json)  # 獲取正確的資料
            
            ############################################
            if len(data) > 0:
                save_mongo(data)   # 儲存資料
            ############################################


    except Exception as e:
        print("出現BUG了")
        print(e)
    finally:
        time.sleep(1)
        index+=1
        get_json(index)



def get_content(content_json):
    if "result" in content_json:
        return content_json["result"]["list"]

因為獲取到的資料是json型別的,所以,資料可以快速的儲存到mongodb裡面,儲存資料的程式碼我依舊留空,希望你自己可以完善。

通過很短的時間,我們就捕獲到了3000門課程

在這裡插入圖片描述

好了,需要程式碼和資料,請評論留下我能聯絡你的方式即可。