這是我參與8月更文挑戰的第5天,活動詳情查看:8月更文挑戰python
網站:bilibili 編程
開發工具:pycharm 開發環境:python3.7, Windows10 使用工具包:requests,threading, csvjson
找到你須要採集的視頻地址(我找的是小破站的一個高質量男性的視頻) 網址:www.bilibili.com/video/BV1po…api
爬蟲採集數據首先要找到對應的數據目標地址 能夠明顯看出當前的網頁的評論數據是在不斷變化的 須要找到對應的評論接口 習慣性的去找動態數據瀏覽器
數據並無在動態數據裏 清空數據加載新的評論數據 觸發加載條件markdown
加載的數據在all裏 明確數據以後就好處理了 獲取到對應的網頁接口 經過requests發送網絡請求網絡
url = 'https://api.bilibili.com/x/v2/reply/main?jsonp=jsonp&next={}&type=1&oid=9659814&mode=3&plat=1&_=1627974678383'.format(
i)
response = requests.get(url)
print(response.text)
複製代碼
數據請求失敗請求頭沒有作反爬策略 添加對應的ua,以及refere 主要是防盜鏈的請求頭措施,在瀏覽器請求也是得不到數據的ide
獲取到準確的數據 提取本身想要的數據信息工具
處理json數據時要注意, json數據前有jQuery1720892078778784086_1627994582044 能夠經過正則的方式進行匹配提取 這裏我選擇修改url的參數 講網址的jQuery1720892078778784086_1627994582044進行刪除 最終的網址是:oop
https://api.bilibili.com/x/v2/reply/main?jsonp=jsonp&next={}&type=1&oid=376402596&mode=3&plat=1&_=1627993394215
複製代碼
獲取到數據後進行數據保存 數據保存在csv文件
def save_data(item):
with open('小破站1.csv', "a", newline='', encoding="utf-8")as f:
filename = ['content', 'ctime', 'sex', 'uname', 'sign']
csv_data = csv.DictWriter(f, fieldnames=filename)
csv_data.writerow(item)
複製代碼
import csv # 處理對應的csv文件
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}
def save_data(item):
with open('小破站高質量人類.csv', "a", newline='', encoding="gbk")as f:
filename = ['content', 'ctime', 'sex', 'uname', 'sign']
csv_data = csv.DictWriter(f, fieldnames=filename)
csv_data.writerow(item)
def get_data(i):
url = 'https://api.bilibili.com/x/v2/reply/main?jsonp=jsonp&next={}&type=1&oid=376402596&mode=3&plat=1&_=1627993394215'.format(
i)
response = requests.get(url, headers=headers).json()
# print(response.content.decode('utf-8'))
item = {}
for data in response['data']['replies']:
# print(data)
# print(' ')
item['content'] = data['content']['message'].replace('\n', '')
item['ctime'] = data['ctime'] # 時間戳保存方便
item['sex'] = data['member']['sex']
item['uname'] = data['member']['uname']
item['sign'] = data['member']['sign']
print(item)
save_data(item)
if __name__ == '__main__':
for i in range(1, 300):
# 發送網絡請求
get_data(i)
複製代碼
我是白又白i,一名喜歡分享知識的程序媛❤️
若是沒有接觸過編程這塊的朋友看到這篇博客,發現不會的或者想要學習Python的,能夠直接留言或者私我【很是感謝你的點贊、收藏、關注、評論,一鍵四連支持】