我想抓取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个视频。如何收集更多视频的网址?
答案 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个视频。