0x00 开篇
上一篇文章已经介绍了使用 Rust 来简单爬取 豆瓣前250电影
。但这仅限于静态网页,如果想要动态网页,那就需要借助 thirtyfour
或者 headless_chrome
这种类库了。本篇文章将介绍如何使用 headless_chrome
来解析抖音视频的下载地址。
0x01 分析抖音网页版
我们以央视新闻的一个视频为例: https://v.douyin.com/DbnFSdG/
,使用网页版打开视频。
可以看到,video
标签下的 source
标签就是我们需要的视频下载地址了。
0x02 headless_chrome
headless_chrome
是通过 DevTools 协议控制无头 Chrome
或 Chromium
的高级 API,它相当于是 Rust 版的 Puppeteer
。我简单对比了 thirtyfour
和 headless_chrome
,因为我没有安装 chrome
,而 headless_chrome
可以自动下载 chrome
二进制文件,为了简单我就选它了。使用方式也很简单:
use std::error::Error;
use headless_chrome::Browser;
use headless_chrome::protocol::cdp::Page;
fn browse_wikipedia() -> Result<(), Box<dyn Error>> {
let browser = Browser::default()?;
let tab = browser.new_tab()?;
tab.navigate_to("https://www.baidu.com")?; tab.wait_for_element("input")?;
let result = tab.get_content()?;
dbg!(&result);
Ok(())
}
复制代码
上面的代码是打开百度搜索,并等待搜索框出现后,输出网页内容。是不是很简单呢?
0x03 解析抖音
访问抖音网页
这一步很简单,只要把上面百度的地址改为抖音的地址就好了,这里无论是短连接还是长链接都是可以的,如果是短连接,最终会重定向至长链接。
let url = "https://v.douyin.com/DbnFSdG/";
let launch_options = LaunchOptionsBuilder::default().headless(true).build()?;
let browser = Browser::new(launch_options)?;
let tab = browser.new_tab()?;
tab.navigate_to(url)?;
tab.wait_for_element("video")?;
let result = tab.get_content()?;
复制代码
我们需要等待 video
标签加载出来后,再去获取网页内容,否则你无法抓到视频地址。
解析网页
我们这里还是使用 scraper
来解析:
let document = scraper::Html::parse_document(result.as_str());
let video_selector = scraper::Selector::parse("video > source").unwrap();
let videos = document.select(&video_selector).map(|x| {
let element = x.value();
let attrs = element.attrs();
for (key, value) in attrs {
if key == "src" {
return value;
}
}
return "";
});
let mut index = 1;
for video_url in videos {
if video_url.starts_with("//") {
println!("下载地址 {index} -> https:{video_url}");
} else {
println!("下载地址 {index} -> {video_url}");
}
index += 1;
}
复制代码
获取到的地址应该是以 //
开头的地址,如果是 //
开头,我们需要在前面添加 https:
。最终输出结果是:
下载地址 1 -> https://v26-web.douyinvod.com/6a4bd3381bcf5eee7544cdfebe848776/6451af29/video/tos/cn/tos-cn-ve-15c001-alinc2/osjoIDeVynA7uGGcPL88A9kQ9A3gDBQUEebnQD/?a=6383&ch=26&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=1253&bt=1253&cs=0&ds=4&ft=X1nbLXvvBQ7AUEeym8Z.6TQjSYdV7CTDtGGq7xVRq8_4&mime_type=video_mp4&qs=0&rc=OTRmZ2RpOzNpZmY1N2QzN0BpMzR3bmk6ZmZlazMzNGkzM0A2YjJiLTNjXi0xMjBjMDJgYSNza2EvcjRnaDVgLS1kLTBzcw%3D%3D&l=20230503074656FF9B5A44752229697D1E&btag=e00018000
下载地址 2 -> https://v3-web.douyinvod.com/27adf479c648be506da39d0baf023ab0/6451af29/video/tos/cn/tos-cn-ve-15c001-alinc2/osjoIDeVynA7uGGcPL88A9kQ9A3gDBQUEebnQD/?a=6383&ch=26&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=1253&bt=1253&cs=0&ds=4&ft=X1nbLXvvBQ7AUEeym8Z.6TQjSYdV7CTDtGGq7xVRq8_4&mime_type=video_mp4&qs=0&rc=OTRmZ2RpOzNpZmY1N2QzN0BpMzR3bmk6ZmZlazMzNGkzM0A2YjJiLTNjXi0xMjBjMDJgYSNza2EvcjRnaDVgLS1kLTBzcw%3D%3D&l=20230503074656FF9B5A44752229697D1E&btag=e00018000
下载地址 3 -> https://www.douyin.com/aweme/v1/play/?video_id=v0300fg10000ch8bkcjc77uf2kdtn1v0&line=0&file_id=c4503af4325c4c0fa0f86f0aed5ce196&sign=c62c24d0398de90bb652511d9a457d73&is_play_url=1&source=PackSourceEnum_AWEME_DETAIL&aid=6383
复制代码
0x04 小结
其实解析步骤是非常简单的,但是如果你没有安装 chrome
,headless_chrome
会下载一个 200M
(Windows) 的 chrome 二进制文件。另外,在 headless_chrome
1.0.5 版本目前存在一个小问题,默认开启了 chrome 的日志模式,这就会导致每次运行都会出现一个命令提示符进程,不过作者已经在 Github
最新分支改掉了。
