目錄
1、構造header
爲了要模仿瀏覽器操作,所以我們要僞造一下header(爲防止惡意操作,這裏不分享構造方法)
根據開發者工具裏的信息,我們發現是GET請求, parameter部分我們只留下四個有用的(附帶一個jsonp=>返回值是json)
2、代碼走起
代碼的詳細註釋已經在下方展示了,再此就不再贅述了。
header = {
.............................
}
def search(par):
return requests.get("https://api.bilibili.com/x/web-interface/search/type", params=par, headers=header).json()
def collect():
# 連接數據路
db = pymysql.connect(host="127.0.0.1", user="root", passwd="*****", db="sisters", charset='utf8')
cursor = db.cursor()
# 新建一個文本文檔用於輸出重複的結果
err_text = open("error.txt", "a+")
# 構造返回值中有用的用戶信息的"鍵(Key)"
construct_sis = ["mid", "uname", "upic", "usign", "level", "gender", "fans", "videos", "is_upuser"]
# Get請求時傳遞的參數
query = {
"search_type": "bili_user",
"keyword": "",
"page": 1,
"jsonp": "jsonp",
}
# for循環進行爬取數據(0號 到 20001號 -> Last order)
for cnt in range(0, 20002):
print("Searching ", cnt)
# 根據循環次數來更新本次搜索的是御阪xx號
query["keyword"] = "御阪" + str(cnt)
# 先進行一次接口訪問,獲取結果的總頁數用於第二層for循環
# (原因是返回的數據是分頁的,要二次循環來獲取對於一個關鍵字的所有搜索結果)
total_pages = search(query)["data"]["numPages"]
# 從1到總頁數進行二層循環
for i in range(1, total_pages + 1):
# 更新本次查詢的頁數
query["page"] = i
# 獲取本次(本關鍵字、本頁)的搜索結果
response = search(query)["data"]
# 取出所有用戶信息
sisters = response["result"]
# 構造 value 執行mysql語句,將信息存入數據庫
for sis in sisters:
value = []
# construct_sis中是所有我們需要的鍵,用於獲取對應的值添加進value
for item in construct_sis:
value.append(sis[item])
# MySQL添加語句
sql = "INSERT INTO sisters.network(mid, name, pic, sign, ulevel, gender, fans, videos, up) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)"
try:
cursor.execute(sql, value)
except pymysql.err.IntegrityError as err:
# 如果捕獲到異常,將主鍵重複信息輸出到文本文檔中
err_text.write(str(sis["mid"]) + " " + sis["uname"] + " --- Already existed." + "\n")
# 提交數據庫更新
db.commit()
# 關閉數據庫連接
db.close()
OK,等待運行完畢,我們就可以查看 成果 了!
不好意思,老闆再來一斤花生米!【下面纔是成果】(其實上面也是)