一、爬取目標
大家好,我是 @馬哥python說 ,一名10年程式猿,
今天分享一期爬蟲的案例,用python爬嗶哩嗶哩的搜索結果,也就是這個頁面:
爬取欄位,包含:
頁碼, 視頻標題, 視頻作者, 視頻編號, 創建時間, 視頻時長, 彈幕數, 點贊數, 播放數, 收藏數, 磁區型別, 標簽, 視頻描述
部分爬取結果:
這里,我一共爬了30頁,每頁30條,共30*30=900條資料(當然,最大爬取頁數可自定義放大)
下面,開始分析網頁,
打開開發者模式,在頁面搜索關鍵詞,并進行翻頁一次,如下:
看到了result節點中的串列資料,就是我們要找到的視頻資料,依次查看每個具體資料:
json資料
分析到這里,就可以開發爬蟲了,
二、講解代碼
首先,匯入用到的庫:
import requests # 發送請求
import time # 獲取時間
import os
import pandas as pd # 保存csv資料
import re # 資料清洗
下面,開始發送請求,
請求地址在哪獲取呢?
請求引數在Payload里面:
請求引數代碼:
# 請求引數
params = {
'__refresh__': 'true',
'_extra': '',
'context': '',
'page': page,
'page_size': 30,
'from_source': '',
'from_spmid': '333.337',
'platform': 'pc',
'highlight': '1',
'single_column': '0',
'keyword': v_keyword,
'qv_id': 'dHavr2spEK3TphPa54klZ6svdhBYOlyP',
'category_id': '',
'search_type': 'video',
'dynamic_offset': 24,
'preload': 'true',
'com2co': 'true',
}
請求頭,在Request Headers里面:
注意!cookie很重要,如果不傳入cookie這個引數,會回傳412錯誤碼!
請求頭代碼:
# 請求頭
headers = {'accept': 'application/json, text/plain, */*',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
# cookie必需,否則回傳412
'cookie': "換成自己的cookie",
'origin': 'https://search.bilibili.com',
'referer': 'https://search.bilibili.com/all?keyword={}&from_source=webtop_search&spm_id_from=333.1007&search_source=5&page=2&o=24'.format(
v_keyword),
'sec-ch-ua': '"Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform ': '"macOS"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-site',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}
發送請求:
# 向頁面發送請求
r = requests.get(url, headers=headers, params=params)
print(r.status_code) # 查看回應碼
決議出result串列資料:
data_list = j_data['data']['result']
print('資料長度:', len(data_list))
定義空串列,并for回圈追加資料,以視頻標題title為例:
for data in data_list:
title = re.compile(r'<[^>]+>', re.S).sub('', data['title']) # 正則運算式清洗文本
print('視頻標題: ' + title)
title_list.append(title)
其他欄位同理,不再贅述,
最后通過pandas的to_csv,保存最終資料,
# 資料保存到csv檔案
df.to_csv(v_out_file, encoding='utf_8_sig', mode='a+', index=False, header=header)
to_csv的時候需加上選項(encoding='utf_8_sig'),否則存入資料會產生亂碼,尤其是windows用戶!
三、同步講解視頻
https://www.zhihu.com/zvideo/1573636442722697216
原創作者: 馬哥python說
持續分享python干貨中!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/531424.html
標籤:Python
上一篇:淺談PHP設計模式的模板方法模式
