如何抓取 youtube 视频以获得比一页更多的视频?

How to scrape youtube videos to get more videos than on one page?

我想抓取 youtube 以根据我的搜索查询收集有关视频的描述。我正在使用 BeautifulSoup4 这样做。我已成功找到视频网址。 我面临的问题是我想为每个类别收集至少 2000 个视频链接。但应一次请求,YouTube 只显示 20 个视频。如何收集更多视频的网址?

from bs4 import BeautifulSoup as bs
import requests

BASE_URL = "https://www.youtube.com"
BASE_SEARCH_URL = "https://www.youtube.com/results?search_query="

query = "travel+blogs"

r = requests.get(BASE_SEARCH_URL + query)
page = r.text
soup = bs(page, 'html.parser')
vids = soup.findAll('a', attrs={'class': 'yt-uix-tile-link yt-ui-ellipsis yt-ui-ellipsis-2 yt-uix-sessionlink spf-link '})

video_urls = [BASE_URL + vid['href'] for vid in vids]

print(video_urls)

我面临的问题是我想为每个类别收集至少 2000 个视频链接。但应一次请求,YouTube 只显示 20 个视频。如何收集更多视频的网址?

尝试将 Selenium 与 BeautifulSoup 一起使用。 Selenium 允许您通过导入滚动到页面底部:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

并使用 driver.find_element_by_tag_name('html').send_keys(Keys.END) 滚动到底部(driver 是 Selenium Webdriver 对象)

对于您的用例,您可以循环滚动到底部大约 100 次,每次填充 20 个结果,您可以使用上面的抓取代码,在使用 [=13] 获取原始 HTML 之后=]

不过,我建议您使用 YouTube 数据 API。它很容易上手,而且是免费的。它会 运行 更快更有效。 https://developers.google.com/youtube/v3/

Selenium 更有可能与 javaScript 重度网站一起使用,但与 beautifulSoup 相比,当我们只谈论抓取数据时,它的速度相当慢。

所以,我找到了一种非常简单的方法来处理 youtube 无限滚动问题而不使用 selenium。

步骤如下。

1.fetch URL https://www.youtube.com/results?search_query=PHP+tutorials

2.loop 到下面 URL 每次增加 1 页。 https://www.youtube.com/results?search_query=PHP+tutorials&page=1

您将在每次迭代中获得 20 个条目。

from bs4 import BeautifulSoup
import requests
for i in range(1,10):
    url = "https://www.youtube.com/results?search_query=php+tutorial"+"&page="+str(i)
    source = requests.get(url).text
    code = BeautifulSoup(source,'lxml')
    print(code.prettify())

您将获得每页包含 20 个视频的代码文件。