多執行緒爬取B站視訊
#threading.Thread()
import os
import re
import time
import datetime
import requests
import threading
from moviepy.editor import *
# 獲取視訊及音訊的源地址
def get_url(url):
url = 'https://www.bilibili.com/video/' + video_id + '?from=search'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
}
response = requests.get(url=url, headers=headers).text
video_url = re.search('duration.*?baseUrl":"(.*?)"', response)
video_url = video_url.group(1)
audio_url = re.search('audio.*?baseUrl":"(.*?)"', response)
audio_url = audio_url.group(1)
return video_url,audio_url
#多執行緒下載
def download(url_1, video_id):
all_thread = 1
url_2 = 'https://www.bilibili.com/video/' + video_id + '?from=search'
#獲取視訊大小
headers = {
'Referer': url_2,
'Range': 'bytes=0-10000',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
}
file = requests.get(url=url_1, headers=headers)
file_size = int(file.headers['Content-Range'][14:])
print('video size:' + str(int(file_size / 1024 / 1024)) + "MB")
if file_size:
fp = open('2.mp4', 'wb')
fp.truncate(file_size)
print('視訊大小:' + str(int(file_size / 1024 / 1024)) + "MB")
fp.close()
size = 5242880
if file_size > size:
all_thread = int(file_size / size)
if all_thread > 10:
all_thread = 10
part = file_size // all_thread
threads = []
starttime = datetime.datetime.now().replace(microsecond=0)
for i in range(all_thread):
start = part * i
if i == all_thread - 1:
end = file_size
else:
end = start + part
if i > 0:
start += 1
headers = headers.copy()
headers['Range'] = 'bytes=%s-%s' % (start, end)
t = threading.Thread(target=Handler, name='th-' + str(i), kwargs = {'start': start, 'end': end, 'url': url_1, 'filename': '2.mp4', 'headers': headers})
t.setDaemon(True) #隨程式退出的標記
threads.append(t)
for t in threads:
time.sleep(0.2)
t.start()
for t in threads:
t.join()
def Handler(start, end, url, filename, headers={}):
tt_name = threading.current_thread().getName()
print(tt_name + 'is begin\t')
r = requests.get(url, headers=headers, stream=True)
total_size = end - start
downsize = 0
startTime = time.time()
with open(filename, 'r+b') as fp:
fp.seek(start)
var = fp.tell() #獲得檔案指標位置
for chunk in r.iter_content(204800): #邊下載邊存硬碟
if chunk:
fp.write(chunk)
downsize += len(chunk)
line = tt_name + '-downloading %d KB/s - %.2f MB, 共 %.2f MB'
line = line % (downsize / 1024 / (time.time() - startTime), downsize / 1024 / 1024,total_size / 1024 / 1024)
print(line, end='\r')
def get_headers():
pass
if __name__ == '__main__':
video_id = input('please input Bv number:')
base_url = 'https://www.bilibili.com/'
url = base_url + '/video/' + video_id + '?from=search'
video_url = get_url(url)
video_url = video_url[0]
download(video_url, video_id)
多執行緒爬取B站視訊,後邊儘量更加完善,更加美觀。
多執行緒參考:https://blog.csdn.net/s_kangkang_A/article/details/103051184
相關文章
- 爬取B站視訊播放量及資料視覺化視覺化
- Java多執行緒-執行緒通訊Java執行緒
- Python爬蟲入門【9】:圖蟲網多執行緒爬取Python爬蟲執行緒
- Python爬蟲入門【10】:電子書多執行緒爬取Python爬蟲執行緒
- Golang 爬蟲快速入門 | 獲取 B 站全站的視訊資料Golang爬蟲
- Java多執行緒學習——執行緒通訊Java執行緒
- 【玩具】獲取B站視訊的音訊片段音訊
- 如何使用python多執行緒有效爬取大量資料?Python執行緒
- 【java】【多執行緒】獲取和設定執行緒名字、獲取執行緒物件(3)Java執行緒物件
- java多執行緒5:執行緒間的通訊Java執行緒
- 多執行緒之間通訊及執行緒池執行緒
- python多執行緒爬蟲與單執行緒爬蟲效率效率對比Python執行緒爬蟲
- 簡易多執行緒爬蟲框架執行緒爬蟲框架
- 多執行緒爬蟲實現(上)執行緒爬蟲
- Python 爬蟲 (四) --多執行緒Python爬蟲執行緒
- Java多執行緒學習(3)執行緒同步與執行緒通訊Java執行緒
- 用Python爬取圖片網站——基於BS4+多執行緒的處理Python網站執行緒
- Java多執行緒——獲取多個執行緒任務執行完的時間Java執行緒
- 如何爬取 python 進行多執行緒跑資料的內容Python執行緒
- 多執行緒簡易售票程式--孫鑫視訊示例執行緒
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- Python《多執行緒併發爬蟲》Python執行緒爬蟲
- 資料提取方法-多程式多執行緒爬蟲執行緒爬蟲
- Swift多執行緒:使用Thread進行多執行緒間通訊,協調子執行緒任務Swift執行緒thread
- 多執行緒-獲取和設定執行緒物件名稱執行緒物件
- 多執行緒和多執行緒同步執行緒
- 多執行緒Demo學習(執行緒的同步,簡單的執行緒通訊)執行緒
- 多執行緒【執行緒池】執行緒
- 多執行緒--執行緒管理執行緒
- Java多執行緒——執行緒Java執行緒
- 執行緒與多執行緒執行緒
- VC多執行緒 C++ 多執行緒執行緒C++
- python爬蟲入門八:多程式/多執行緒Python爬蟲執行緒
- 多執行緒之間的通訊執行緒
- java多執行緒間的通訊Java執行緒
- Java多執行緒消費訊息Java執行緒
- windows多執行緒同步--訊號量Windows執行緒
- Python 爬蟲 (五) --多執行緒續 (Queue )Python爬蟲執行緒