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