寫在前面
今天我們們抓取一下網易雲課堂的課程資料,這個網站的資料量並不是很大,我們只需要使用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
門課程
好了,需要程式碼和資料,請評論留下我能聯絡你的方式即可。