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

时间:2019-04-25 14:04:46

标签: python beautifulsoup youtube

我想抓取youtube来根据我的搜索查询收集有关视频的描述。我正在使用BeautifulSoup4这样做。我已经成功找到了视频URL。 我面临的问题是每个类别至少要收集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个视频。如何收集更多视频的网址?

2 个答案:

答案 0 :(得分:0)

尝试将与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个结果,并且在使用driver.page_source获取原始HTML之后,可以使用上面的抓取代码

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

答案 1 :(得分:0)

Selenium更有可能与javaScript Heavy网站一起使用,但是当我们谈论仅抓取数据时,与beautifulSoup相比,它相当慢。

因此,我找到了一种非常简单的方法,无需使用硒即可解决youtube无限滚动问题。

以下是步骤。

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

2。每次循环遍历下面的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个视频。