从抖音个人资料中抓取所有视频

问题描述 投票:0回答:3

我正在尝试制作一个工具,可以一次性下载 TikTok 上特定用户的每个视频。示例页面:https://www.tiktok.com/@levelsofpiano。我首先检查了 TikTok 个人资料上的 html 树,其中显示了这些“a”标签,其中包含页面上加载的每个视频的视频页面链接。

我尝试使用

wget
来使用
wget https://www.tiktok.com/@levelsofpiano > Output.html
捕获页面,但是在生成的 html 中甚至没有提及
@levelsofpiano
。我猜网站上的内容是动态加载的,所以可怜的
wget
得到的页面大部分是空的。

然后我决定使用

testcafe
(像Selenium这样的UI测试工具)来加载页面,等待20秒,并捕获html输出......但是当我使用此方法时视频不会加载:

这是我的脚本:

import { Selector, ClientFunction } from 'testcafe';
import fs from 'fs';

let username = "levelsofpiano";
fixture `Get Dat Tiktok`.page("https://www.tiktok.com/@" + username);

function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }

/* got this definition from https://testcafe-discuss.devexpress.com/t/can-i-save-a-web-page-as-an-html-file/461 */
const getPageHTML = ClientFunction(() => document.documentElement.outerHTML);

test('Capture page with loaded elements', async t => {
    await sleep(20000); //20 seconds
    await fs.writeFile('./' + username + '.html',await getPageHTML(), function(err, result) {
        if(err) console.log('error', err);
    });    
});

我还能尝试什么来抓取所有这些视频?我可能需要一种方法来滚动页面来加载所有视频(我可以使用 testcafe 或 selenium 来完成。如果我能找到一种方法让它们加载我正在寻找的内容)

html web-scraping
3个回答
1
投票

令人惊讶的是没有 API 来获取所有用户视频。我想出了这个 hacky 解决方案,它首先解析页面上已加载视频的 DOM,然后设置 XHR 覆盖来解析由自动滚动器触发的网络请求中的 JSON。将其粘贴到控制台后,您需要等待它运行(不要手动滚动),然后您可以登录

allVideos
查看视频 ID 数组。

或者,您可以只使用自动滚动功能并继续解析持续加载的视频的 DOM。

window.allVideos = [];
getInitialVideoIDs();

const origOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(method, url) {
  this.addEventListener('load', function() {
    if (this.readyState === 4 && isVideoFetch(url)) {
      const responseData = JSON.parse(this.responseText);
      pushVideoIDs(responseData);
      checkAutoScroller(responseData);
    }
  });
  origOpen.apply(this, arguments);
};

const autoScroller = setInterval(function() {
  window.scrollTo(0, document.body.scrollHeight);
}, 1000);

function isVideoFetch(url) {
  const videoFetchRegEx = /\/api\/post\/item_list\//;
  return videoFetchRegEx.test(url);
}

function pushVideoIDs(responseData) {
  responseData.itemList.forEach(item => {
    if (allVideos.indexOf(item.id) === -1) {
      allVideos.push(item.id);
    }
  });
} 

function checkAutoScroller(responseData) {
  if (!responseData.hasMore) {
    clearInterval(autoScroller);
  }
}

function getInitialVideoIDs() {
  const videos = document.querySelectorAll('.tt-feed .video-feed-item-wrapper');
  videos.forEach(video => {
    const urlObj = new URL(video.href);
    const path = urlObj.pathname;
    const id = (path.match(/\/video\/(\d+)/) || [])[1];
    allVideos.push(id);
  });
}

0
投票

以前的代码也不适合我,但这个工作正常(在 TikTok 频道页面上使用 Chrome 控制台)。

//COPY & PASTE CODE 1:

let goToBottom = setInterval(() => window.scrollBy(0, 400), 1000);

(等待滚动结束)

//COPY & PASTE CODE 2:

clearInterval(goToBottom);
let arrayVideos = [];
console.log('\n'.repeat(50));
const containers = document.querySelectorAll('[class*="-DivItemContainerV2"]');  
for (const container of containers) {
    const link = container.querySelector('[data-e2e="user-post-item"] a');
    const title = container.querySelector('[data-e2e="user-post-item-desc"] a');
    //If the link is https://www.tiktok.com/, set it as the current page URL
    if (link.href === 'https://www.tiktok.com/') link.href = window.location.href;
    arrayVideos.push(title.title + ';' + link.href);
    console.log(title.title + '\t' + link.href);
}

可选,下载为 CSV:

//复制并粘贴代码3:

let data = arrayVideos.join('\n');
let blob = new Blob([data], {type: 'text/csv'});
let elem = window.document.createElement('a');
elem.href = window.URL.createObjectURL(blob);
elem.download = 'my_data.csv';
document.body.appendChild(elem);
elem.click();
document.body.removeChild(elem);

来源:https://responsive-muse.com/export-tiktok-channel-video-titles-urls-using-javascript/


0
投票

如果您选择自己构建下载器,您不仅需要考虑实际下载视频的方式,而且如果您想下载数千个视频,还需要考虑基础设施。

这是因为 TikTok 具有验证码框以及其他智能技术,可以防止您大量下载所有内容。首先,您需要使用代理,例如 IPRoyal 或其他代理,这样您就不会被阻止。

对于我们的 TikTok 仪表板,我们一开始就尝试过这一点,但最终我们从 RapidAPI 过渡到了付费 API 提供商,该提供商可以在不到 1 秒的响应时间内获取有关 TikTok 用户及其视频的各种信息,其中包括视频下载链接也是如此。它更具可扩展性和可靠性。

© www.soinside.com 2019 - 2024. All rights reserved.