追番
2024年6月27日 · 743 字 · 2 分钟
最简单的期望
每天回到家,在追的,有更新的动漫已经下载到本地,打开电视看就完了。没有APP
,没有推送
,没有广告
,没有卡顿
……
实现
硬件设备
- 树莓派(7x24工作)
程序设计
┌─Docker─────────────────┐
│ Flask │ ┌─Docker───────────────┐
│ 接收网站地址 │ │ 爬虫(网站A) │
│ 返回视频地址 ◄───────────► 检测更新: │
│ │ │ 获取最新,播放地址 │
│ │ │ 发送请求,视频地址 │
│ │ │ 下载视频。 │
│ Chrome/selenium │ └──────────────────────┘
│ 打开网页,视频嗅探 │
│ │ ┌─Docker───────────────┐
│ pyvirtualdisplay │ │ 爬虫(网站B) │
│ 用于调试 ◄───────────► 检测更新: │
│ 登录验证 │ │ 获取最新,播放地址 │
│ │ │ 发送请求,视频地址 │
│ │ │ 下载视频。 │
│ │ └──────────────────────┘
│ │
│ │
└────────────────────────┘
实现逻辑:
- 爬虫定时爬取指定页面,检测是否更新
- 优先curl
/python.requests
请求
- 备选chrome
访问 - 检测到更新,取出最新一集播放地址
video_url
- 将
video_url
提交给 Chrome 嗅探(嗅探功能可以编写 Chrome 插件实现) - 将嗅探到的视频地址,返回给爬虫,爬虫负责下载视频。
待优化:
- 下载功能是否应该单独做一个模块
- 优点:共用,不用每个爬虫都带下载功能。
- 缺点:需要起服务,可能还需要和爬虫通信。
代码片段
// chrome 插件,视频地址嗅探功能
chrome.webRequest.onBeforeRequest.addListener(
function(details) {
console.log("url:", details.url);
if (details.url.includes("m3u8") || details.url.includes("mp4")){
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {url: details.url});
});
console.log("cancel ... URL:", details.url);
// return {cancel : true};
}
},
{ urls: ["<all_urls>"] },
["requestBody", "blocking"]
);
# pyvirtualdisplay, selenium, 使用
with Display(backend="xvnc", size=(1366, 768), rfbport=5900) as disp:
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument("--disable-infobars")
options.add_argument("--disable-gpu")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--no-sandbox")
options.add_argument('--blink-settings=imagesEnabled=true')
options.add_extension("ext.zip") # 插件
options.add_argument("--user-data-dir=.chrome")
options.binary_location = "/usr/bin/chromium-browser"
driver = webdriver.Chrome(chrome_options=options)
driver.set_window_size(1366, 768)
# TODO
driver.quit()
更新
06-30 增加 BiliBili 用户动态
bilibili
有官方或者野生 api
,但是容易被风控。还是用浏览器打开,获取各动态 BV id,然后使用开源工具,下载各视频到本地。