从 CBS 网站提取所有季节和剧集视频链接

Extract all seasons and episode video links from CBS website

CBS 有电视剧《挑战》,有很多季,每一季都有很多集。他们在 CBS 网站上:https://www.cbs.com/shows/the-challenge/

我想要所有视频 link 的列表,比如这个(第 11 季的前 4 集)。

https://www.cbs.com/shows/the-challenge/video/C5NCzTv2qJp1GwhcV5KWxeKWN4p6_Mqt/the-challenge-throwing-down-the-gauntlet/
https://www.cbs.com/shows/the-challenge/video/kXdno68B36gd6s06OhdrUDUvAAYY4q_e/the-challenge-derrick-steps-it-up/
https://www.cbs.com/shows/the-challenge/video/RYA43Dqs2bRJsgAtcZIZhN8zVVQ1FIxf/the-challenge-we-can-work-it-out/
https://www.cbs.com/shows/the-challenge/video/lJvc_Lkns9Q2NYkDfmsNQmeajXP3QjRm/the-challenge-the-10-000-pyramid/

如何自动提取所有剧集的视频 link?我能够“查看页面源代码”,但它只显示第 11 季的 12/18 集:(打开 chrome):查看源代码:https://www.cbs.com/shows/the-challenge/,搜索 https://www.cbs.com/shows/the-challenge/video,应该显示 12 个匹配项。

该页面将剧集和剧季“隐藏”在主页中,因此其他剧季没有单独的 URL。我现在的解决方案是手动复制每个视频的 link 地址...

此页面使用 javascript(部分)动态加载。例如,第 13-18 集的 link 就是这样加载的。

要捕获这些,您需要使用浏览器的“开发人员”选项卡(这是一个漫长而复杂的故事;您可以开始阅读它 here, for example).

一旦你有了 link,响应就是 json,它被视为 python 字典,产生所需的输出。

总之:

import requests
cookies = {
    'CBS_ADV_VAL': 'c',
    'CBS_ADV_SUBSES_VAL': '4',
    'ovvuid': '9f064779-4c06-49f1-9cdd-7e64e653145e',
    'OptanonConsent': 'isIABGlobal=false&datestamp=Wed+Sep+09+2020+15%3A44%3A13+GMT-0400+(Eastern+Daylight+Time)&version=6.5.0&hosts=&consentId=d1c945ba-78ea-46e6-ba6f-5329085e06d8&interactionCount=1&landingPath=https%3A%2F%2Fwww.cbs.com%2Fshows%2Fthe-challenge%2F&groups=1%3A1%2C2%3A1%2C3%3A1%2C4%3A1%2C5%3A1',
}

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0',
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Language': 'en-US,en;q=0.5',
    'X-Requested-With': 'XMLHttpRequest',
    'Referer': 'https://www.cbs.com/shows/the-challenge/',
    'Connection': 'keep-alive',
    'Cache-Control': 'max-age=0',
    'TE': 'Trailers',
}

response = requests.get('https://www.cbs.com/shows/the-challenge/xhr/episodes/page/0/size/18/xs/0/season/11/', headers=headers, cookies=cookies)

links = response.json()
for entry in (links['result']['data']):  
    print(entry['url'])

输出:

/shows/the-challenge/video/IBWXQxtaPVmI40RnAACOc_zo0u13Ups1/the-challenge-blind-panic/
/shows/the-challenge/video/uFv8wFmvUFRKfiM29HVT3K_gGCZ4IWYS/the-challenge-last-men-standing/
/shows/the-challenge/video/9GP_ASLg9U_MmFvFmXPHO9liRzjdHhwI/the-challenge-don-t-bet-on-it/

等等,全部18集。然后,您可以将每个 link 与基数 url (https://www.cbs.com) 连接起来,形成最终的 link。