嗨喽,大佬們好鴨!這裡是小熊貓~
今天我們采集國內知名的shipin彈幕網站!
這裡有及時的動漫新番,活躍的ACG氛圍,有創意的Up主。
大家可以在這裡找到許多歡樂。
<需要設置環境變量> 軟件的使用 合成視頻和音頻
我們想要數據內容都是來自於網頁源代碼
I. 用浏覽器打開這個所采集的網址
II. 在這個網頁上面用鼠標右鍵點擊查看網頁源代碼 會彈出一個新的窗口
III. ctrl + F 打開搜索框 搜索playinfo 可以找到相關信息數據
IV. ctrl + F 打開搜索框 搜索shipin標題, 也可以找到相關的數據內容
不是內置模塊的小可耐們記得安裝哦~
import requests # 數據請求模塊 <發送請求工具>
import re # 正則表達式
import json # 序列化與反序列
import pprint # 格式化輸出模塊
import subprocess
import os
因審核機制原因,我把網址裡的一些東西刪掉了,小可耐們可以自己添加一下哈,很容易的
還有兩個字,我用拼音代替了,你們可以改回文字哦 ~
如果有不太會改或者有點點小懶惰的小可耐也可以私信我,我發你吶~
def get_response(html_url, data=None):
""" 發送請求函數 def 關鍵字 用於自定義函數 get_response 自定義函數名字 :param html_url: 形式參數<不具備實際意義> 傳入到這個函數參數 發送請求網址 :return: 響應對象 模擬浏覽器發送請求 headers 請求頭進行偽裝模擬 user-agent 用戶代理意思 表示浏覽器基本身份標識 <Response [200]> <>在python裡面表示對象 響應對象 200 狀態碼 表示請求成功 相當於打電話, 打通了嘟嘟嘟聲音 404 網址不對 相當於你所撥打電話是空號 503 服務器有問題 相當於你所撥打電話不在服務區 403 你沒有訪問權限 相當於你所撥打電話正在通話中 """
headers = {
'referer': 'https://www..com/', # 防盜鏈 告訴服務器你請求url是從哪裡跳轉過來的
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'
}
response = requests.get(url=html_url, params=data, headers=headers)
return response
def get_video_info(play_url):
""" 獲取shipin信息函數 :param play_url: shipin播放詳情頁 :return: 信息shipin信息 仰望星空腳踏實地 不會用正則 6 通過相關語法,可以對於字符串數據提取自己想要內容 解析數據 re.findall() 通過re模塊裡面findall 去找到所有我們想要數據內容 從什麼地方去找什麼樣數據內容 從response.text裡面去找 "title":"(.*?)","pubdate" 中(.*?) 這段是我們想要數據 '"title":"(.*?)","pubdate"', response.text 保存數據, 標題作為文件名保存, 以字符串數據形式 列表取值 len 統計元素個數 [0] 根據索引位置取值 列表索引位置從0開始計數 type() 內置函數,查看數據類型 """
# 定義了函數, 一定要調用
response = get_response(html_url=play_url) # 調用前面定義好的發送請求函數 函數是可以重復調用
# print(response.text) # response.text 獲取響應對象文本數據 <獲取網頁源代碼> 字符串數據
title = re.findall('"title":"(.*?)","pubdate"', response.text)[0].replace(' ', '') # 標題
title = re.sub(r'[/\:*?"<>|]', '', title)
html_data = re.findall('<script>window.__playinfo__=(.*?)</script>', response.text)[0] # 視頻信息
# print(title)
# print(html_data)
# print(type(html_data))
# 為了方便提取數據, 可以把這個html_data 轉成json字典數據
json_data = json.loads(html_data)
# print(json_data)
# print(type(json_data)) # 輸出一行
# 字符串單雙引號使用 外面是單引號裡面就要使用雙引號
# pprint.pprint(json_data) # 格式化展開效果
# 字典取值, 鍵值對取值 根據冒號左邊的內容<鍵>, 提取冒號右邊的內容<值>
audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
video_url = json_data['data']['dash']['video'][0]['baseUrl']
print(audio_url)
print(video_url)
video_info = [title, audio_url, video_url]
return video_info
def save(title, audio_url, video_url):
""" 保存數據函數 :param title: shipin標題 :param audio_url: 音頻url :param video_url: shipin畫面url :return: """
audio_content = get_response(html_url=audio_url).content
video_content = get_response(html_url=video_url).content
with open('video\\' + title + '.mp3', mode='wb') as f:
f.write(audio_content)
with open('video\\' + title + '.mp4', mode='wb') as f:
f.write(video_content)
cmd = f"ffmpeg -i video\\{
title}.mp4 -i video\\{
title}.mp3 -c:v copy -c:a aac -strict experimental video\\{
title}output.mp4"
subprocess.run(cmd, shell=True)
os.remove(f'video\\{
title}.mp4')
os.remove(f'video\\{
title}.mp3')
print('')
print(title, '視頻下載完成')
def get_search(page, word):
""" :param page: 采集多少頁 :param word: 搜索關鍵字 :return: """
search_url = 'https://api..com/x/web-interface/search/type'
data = {
'__refresh__': 'true',
'_extra': '',
'context': '',
'page': page,
'page_size': '42',
'from_source': '',
'from_spmid': '333.337',
'platform': 'pc',
'highlight': '1',
'single_column': '0',
'keyword': word,
'category_id': '',
'search_type': 'video',
'dynamic_offset': '84',
'preload': 'true',
'com2co': 'true',
}
json_data = get_response(html_url=search_url, data=data).json()
bv_list = [i['bvid'] for i in json_data['data']['result']]
print(bv_list)
return bv_list
# 6. 采集多個shipin
def get_up_video(page, up_id):
""" 采集up多個shipin :param page: 采集多少頁 :param up_id: shipin博主ID :return: """
up_link = 'https://api..com/x/space/arc/search'
data = {
'mid': up_id,
'ps': '30',
'tid': '0',
'pn': page,
'keyword': '',
'order': 'pubdate',
'jsonp': 'jsonp',
}
json_data = get_response(html_url=up_link, data=data).json()
bv_list = [i['bvid'] for i in json_data['data']['list']['vlist']]
print(bv_list)
return bv_list
# 7. 獲取id
def main(bv_id):
""" 主函數 :param bv_id: shipin bv號 :return: """
video_info = get_video_info(play_url=f'https://www..com/video/{
bv_id}')
save(video_info[0], video_info[1], video_info[2])
if __name__ == '__main__':
# 只要你可以看到數據
msg = """請輸入你要進行的操作: A. 多頁數據采集 B. 采集單個shipin C. 采集番劇 D. 采集某個Up所有shipin內容 0. 即可退出系統 """
while True:
print(msg)
kew_word = input('請輸入你要進行的操作: ')
if kew_word == 'A' or kew_word == 'a':
word = input('請輸入你想要下載shipin關鍵字: ')
page = input('請輸入你想要下載shipin頁數: ')
for num in range(1, int(page) + 1):
bv_list = get_search(page=num, word=word)
elif kew_word == 'B' or kew_word == 'b':
bv = input('請輸入你想要下載shipinBv號: ')
elif kew_word == 'C' or kew_word == 'c':
print('功能還沒上線')
elif kew_word == 'D' or kew_word == 'd':
up_id = input('請輸入你想要下載up主ID: ')
page = input('請輸入你想要下載shipin頁數: ')
for num in range(1, int(page) + 1):
get_up_video(page=num, up_id=up_id)
elif kew_word == '0':
break
成功沒有快車道,幸福沒有高速路。
所有的成功,都來自不倦地努力和奔跑,所有的幸福都來自平凡的奮斗和堅持
——勵志語錄
本文章就寫完啦~感興趣的小伙伴可以復制代碼去試試
你們的支持是我最大的動力!!記得三連哦~ 歡迎大家閱讀往期的文章呀~
我是小熊貓, 咱們下篇文章見啦