관련 무료 학습 권장사항: python 비디오 튜토리얼
이 기사에서는 주로 다음과 같은 내용을 설명합니다. python을 사용하여 Bilibili에서 동영상을 크롤링합니다. 우선 저는 빅 데이터 개발 엔지니어입니다. 크롤러는 제 취미일 뿐입니다. 훨씬 좋습니다. 더 이상 말하지 않겠습니다. 좋아하는 친구들은 모으셔도 됩니다, 전달할 경우 원본 링크를 복원해 주세요. 감사합니다
나는 환경입니다. 여기서 사용하는 방법은 참고용입니다:
개발 도구 : pycharm
python 환경: python-3.8.0
종속 패키지: quitil, os, re, json,Choices,requests,lxml
아주 오래전 시간을 가져보겠습니다. 인기있는 마선생님의 영상을 예로 들어보겠습니다.
영상 링크 : https://www.bilibili.com/video/BV1Ef4y1i78b?from=search&seid=12072538764197074893
영상 뒤에 숨어 있는 것은 무엇일까요? 아니요.
video后面? 号前面
<script></script>
中的内容返回一个json串解析获取我们想要的数据即可。.
返回给我们的们如下,真正对我们有用的信息在data中
在data 下面我们就可以清晰的看到我们想要的内容了,如视频的画质,以及视频的地址等,注意:如果你拿到地址直接进行访问的话是访问不到了,哔哩哔哩中添加了Referer
두 번째 부분은 패킷을 캡처합니다. 여기 Bilibili의
<를 구문 분석할 수 있습니다. ;script>의 콘텐츠는 json 문자열을 반환하고 구문 분석하여 원하는 데이터를 얻을 수 있습니다. . <img src="https://img.php.cn/upload/article/000/000/052/2b9837f83bc78cc8e8824e900c7aa456-1.png" alt="여기에 이미지 설명 삽입"><li>Analytic은 json을 반환합니다. <li>
<li> 우리에게 반환된 내용은 다음과 같습니다. </li>우리에게 정말 유용한 정보는 데이터에 있습니다<li>
<img src="https://img.php.cn/upload/article/000/000/052/%20c47fffc01c0dc7f28dafe238d9d2036d%20-2.png" alt="여기에 이미지 설명 삽입"><li> 데이터 아래에서 비디오 품질, 비디오 주소 등 우리가 원하는 콘텐츠를 명확하게 볼 수 있습니다. 참고: <br>주소를 얻고 직접 접속하시면 접속이 불가능합니다<img src="https://img.php.cn/upload/article/000/000/052/c47fffc01c0dc7f28dafe238d9d2036d-3.png" alt="Bilibili 비디오를 크롤링하기 위한 Python 소개"> Bilibili가 <code>Referer
를 추가했습니다. Referer 없이 브라우저에서 직접 접속하시면 해당 페이지를 찾으실 수 없습니다. 파싱해야 하는 콘텐츠는 다음과 같습니다.
3.1 준비
종속 패키지import jsonimport osimport reimport shutilimport sslimport timeimport requestsfrom concurrent.futures import ThreadPoolExecutorfrom random import choicefrom lxml import etree
#设置请求头等参数,防止被反爬headers = { 'Accept': '*/*', 'Accept-Language': 'en-US,en;q=0.5', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36'}def get_user_agent(): '''获取随机用户代理''' user_agents = [ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)", "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)", "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)", "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0", "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20", "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1", "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11", "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10", "MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1", "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.23 Mobile Safari/537.36", "Mozilla/5.0 (iPod; U; CPU iPhone OS 2_1 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5F137 Safari/525.20", "Mozilla/5.0 (Linux;u;Android 4.2.2;zh-cn;) AppleWebKit/534.46 (KHTML,like Gecko) Version/5.1 Mobile Safari/10600.6.3 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)", "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" ] # 在user_agent列表中随机产生一个代理,作为模拟的浏览器 user_agent = choice(user_agents) return user_agent3.2 다운로드 코드 작성
def single_download(aid, acc_quality): '''单个视频实现下载''' # 请求视频链接,获取信息 origin_video_url = 'https://www.bilibili.com/video/' + aid res = requests.get(origin_video_url, headers=headers) html = etree.HTML(res.text) title = html.xpath('//*[@id="viewbox_report"]/h1/span/text()')[0] print('您当前正在下载:', title) video_info_temp = re_video_info(res.text, '__playinfo__=(.*?)<script>') video_info = {} # 获取视频质量 quality = video_info_temp['data']['accept_description'][acc_quality] # 获取视频时长 video_info['duration'] = video_info_temp['data']['dash']['duration'] # 获取视频链接 video_url = video_info_temp['data']['dash']['video'][acc_quality]['baseUrl'] # 获取音频链接 audio_url = video_info_temp['data']['dash']['audio'][acc_quality]['baseUrl'] # 计算视频时长 video_time = int(video_info.get('duration', 0)) video_minute = video_time // 60 video_second = video_time % 60 print('当前视频清晰度为{},时长{}分{}秒'.format(quality, video_minute, video_second)) # 调用函数下载保存视频 download_video_single(origin_video_url, video_url, audio_url, title)</script>3.3 다운로드 코드 작성
def download_video_single(referer_url, video_url, audio_url, video_name): '''单个视频下载''' # 更新请求头 headers.update({"Referer": referer_url}) print("视频下载开始:%s" % video_name) # 下载并保存视频 video_content = requests.get(video_url, headers=headers) print('%s\t视频大小:' % video_name, round(int(video_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB') received_video = 0 with open('%s_video.mp4' % video_name, 'ab') as output: headers['Range'] = 'bytes=' + str(received_video) + '-' response = requests.get(video_url, headers=headers) output.write(response.content) # 下载并保存音频 audio_content = requests.get(audio_url, headers=headers) print('%s\t音频大小:' % video_name, round(int(audio_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB') received_audio = 0 with open('%s_audio.mp4' % video_name, 'ab') as output: headers['Range'] = 'bytes=' + str(received_audio) + '-' response = requests.get(audio_url, headers=headers) output.write(response.content) received_audio += len(response.content) print("视频下载结束:%s" % video_name) video_audio_merge_single(video_name)3.4 다운로드한 오디오 및 비디오 병합
🎜🎜🎜🎜🎜관련 무료 학습 권장사항: 🎜php 프로그래밍🎜(동영상) 🎜🎜🎜
위 내용은 Bilibili 비디오를 크롤링하기 위한 Python 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!