Rust实战 Rust简单爬虫解析抖音视频下载地址

0x00 开篇

上一篇文章已经介绍了使用 Rust 来简单爬取 豆瓣前250电影。但这仅限于静态网页,如果想要动态网页,那就需要借助 thirtyfour 或者 headless_chrome 这种类库了。本篇文章将介绍如何使用 headless_chrome 来解析抖音视频的下载地址。

0x01 分析抖音网页版

我们以央视新闻的一个视频为例: https://v.douyin.com/DbnFSdG/ ,使用网页版打开视频。

image-20230503072259171

可以看到,video 标签下的 source 标签就是我们需要的视频下载地址了。

0x02 headless_chrome

headless_chrome 是通过 DevTools 协议控制无头 ChromeChromium 的高级 API,它相当于是 Rust 版的 Puppeteer。我简单对比了 thirtyfourheadless_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 小结

其实解析步骤是非常简单的,但是如果你没有安装 chromeheadless_chrome 会下载一个 200M(Windows) 的 chrome 二进制文件。另外,在 headless_chrome 1.0.5 版本目前存在一个小问题,默认开启了 chrome 的日志模式,这就会导致每次运行都会出现一个命令提示符进程,不过作者已经在 Github 最新分支改掉了。

猜你喜欢

转载自juejin.im/post/7229168408419647544