【问题标题】:How to scrape youtube videos to get more videos than on one page?如何抓取 youtube 视频以获取比一页更多的视频?
【发布时间】:2019-09-14 23:58:33
【问题描述】:

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

【问题讨论】:

  • 您应该分析如何在请求中加载更多视频,或者在 url 中使用一些参数进行更多请求。使用开发工具分析 youtube 网络请求
  • 我能够进入这部分。但我现在面临的问题是,经过一定数量的请求后,youtube 会返回验证码页面而不是搜索结果。

标签: python beautifulsoup youtube


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    以下是步骤。

    1.获取网址 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 个视频的页面的代码文件。

    【讨论】:

    • URL 中的 page 参数不再起作用,并且每次迭代,至少在 Chrome(不是无头浏览器)上,都会显示相同的结果。
    猜你喜欢
    • 2016-11-14
    • 2011-06-27
    • 2016-08-26
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多