写在前面
在使用和分享此爬虫代码时,请务必遵守以下限制和建议,并减少对目标服务器的负担:
-
遵循网站规定: 请始终遵循被爬取网站的使用条款、隐私政策以及robots.txt
文件中的规定。不得违反网站规定的任何规则。
-
合法用途: 此爬虫代码仅用于合法、合理的用途,如数据收集、分析或学术研究等。不得将其用于非法用途,包括但不限于侵犯隐私、版权或其他法律权益。
-
适度请求频率: 设置合理的请求频率,避免对目标服务器造成过度负担。频繁的请求可能导致被封禁或其他限制。
-
尊重隐私: 不得通过爬虫获取或传播任何用户敏感信息。请尊重被爬取网站和用户的隐私权。
-
不要滥用资源: 避免滥用带宽和其他资源。在下载大量数据时,谨慎使用服务器资源,以确保公平共享和减少不必要的开销。
-
不要绕过登录限制: 不得通过绕过网站的登录限制或其他访问控制机制,以确保不违反网站的安全策略。
请注意,违反这些限制可能会导致法律责任,打击作者的热情,对爬虫作者和使用者都会产生负面影响。在使用和分享爬虫代码时,请谨慎考虑其合法性和合规性,以维护互联网的健康和稳定。
使用说明
- 有一定的
python
基础。
- 知道如何获取自己的
Cookie
- 已经安装了相关库,配置好了相关环境
RequestUrl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| from random import uniform from requests import get from time import sleep import os
def get_url(url,cookie='',Referer='https://www.bilibili.com/'): headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0', 'Referer':Referer, 'Origin':'https://www.bilibili.com', 'Cookie': cookie } try: response = get(url, headers=headers, timeout=3) sleep(uniform(1, 2)) return response except Exception as error: print(f"{url} 请求发生错误: {error}\n") if os.path.exists('.\\log') == False: os.makedirs('.\\log') with open(".\\log\\error.txt", mode='a') as f: f.write(f"{url} 请求发生错误: {error}\n") return 0
|
b站专栏视频爬取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| import os import subprocess import time from RequestUrl import get_url import re import json from lxml import etree
def get_infor(url): resp = get_url(url) base_url = url.split('?')[0] + '?p=' pages = '{' + re.findall('"pages":\[.*?]',resp.text,re.S)[0] + '}' pages = json.loads(pages) html = etree.HTML(resp.text) name = html.xpath('/html/body/div[2]/div[2]/div[1]/div[1]/h1/text()')[0] name = re.sub(r'\W+', '', name).replace('_', '') if os.path.exists(f'.\\{name}')==False: os.makedirs(f'.\\{name}')
remove = [] for i in pages['pages']: title = i['part'] remove.append(title) page_url = base_url + str(i['page'])
print(page_url,title) download(page_url,title,name)
print(f'{i["page"]} is ok!') time.sleep(1)
for i in remove: Clear_down(i,name)
def download(page_url,title,name):
response = get_url(page_url) result = re.findall(r'<script>window.__playinfo__=(.*?)</script>', response.text)[0] data = json.loads(result) audio_url = data['data']['dash']['audio'][0]['baseUrl'] video_url = data['data']['dash']['video'][0]['baseUrl']
with open(f'.\\{name}\\{title}' + '.mp3', mode='wb') as f: audio_content = get_url(url=audio_url).content f.write(audio_content) print('音频下载完成')
with open(f'.\\{name}\\{title}' + '.mp4', mode='wb') as f: video_content = get_url(url=video_url) f.write(video_content.content) print(f'视频下载完成')
print('下载完成,正在为你合成文件')
merge_command = f'ffmpeg -loglevel quiet -i .\\{name}\\{title}.mp4 -i .\\{name}\\{title}.mp3 -c:v copy -c:a aac -strict experimental .\\{name}\\{title}output.mp4' subprocess.run(merge_command, shell=True) print('音视频合并完成')
def Clear_down(title,name): os.remove(f'.\\{name}\\{title}.mp4') os.remove(f'.\\{name}\\{title}.mp3')
|
未使用多线程爬取,当分批视频特别多的时候爬取效率低下。
可以使用我的多线程模板加快速度。
其中download
适用于b站大多数视频的下载。title
为下载文件的文件名,name
为将下载好的文件放到名为name
的文件夹下。方便后续管理。
像是拜年祭类似的视频,使用download
是无法下载的,那个涉及到w_rid的解密