【问题标题】:Beautifulsoup Python Youtube Scrape not workingBeautifulsoup Python Youtube Scrape 不工作
【发布时间】:2020-11-21 17:44:50
【问题描述】:

我正在尝试从格式为https://www.youtube.com/c/%s/videos %accountName 的 youtube 帐户中抓取 Youtube URL + 标题。例如Apple

Youtube 中可点击文本(标题)的类是ytd-grid-video-renderer #video-title.yt-simple-endpoint.ytd-grid-video-renderer - 在检查器模式下单击标题对象时(Firefox)

我没有得到任何结果,但 URL 'url'(在 webCommandMetadata 中的某处)和标题'simpleText' 显示在 request.content 中

例子:

url = "https://www.youtube.com/c/%s/videos" % account
req = requests.get(url, timeout=30)
soup = BeautifulSoup(req.content, 'html.parser')
# latest_videos_html = soup.select('.yt-lockup-content:not(:has(span.yt-uix-livereminder)) .yt-lockup-title a')[:6]
# latest_videos_html = soup.select('.yt-lockup-content:not(:has(span.yt-uix-livereminder)) .yt-simple-endpoint a')[:18]
latest_videos_html = soup.select('ytd-grid-video-renderer #video-title.yt-simple-endpoint.ytd-grid-video-renderer')[:18]

print(latest_videos_html)`

我的问题是:我怎么知道在soup.select 中输入什么以及如何调试它以便我将来自己解决这个问题?

感谢您的支持!

【问题讨论】:

  • 你必须用 selenium 替换请求。请求不会从 youtube 加载 javascript 代码
  • 您可以考虑查看 youtube-dl 如何抓取 YouTube 页面。它也是用 Python 编写的。

标签: python web-scraping beautifulsoup request


【解决方案1】:

您在浏览器中看到的内容主要由 javascript 加载。通过使用简单的 GET 请求,您不会收到页面的动态内容。

通过查看 YouTube 上的用户页面,我发现您没有获得很多正确的 HTML 信息,而是在 body 标记中获得 JSON。

为了回答您的问题,将来当您想从网站上抓取某些内容时,首先要确保您在使用 requests.get 时确实拥有该内容,而不是假设您获得的内容与浏览器获得的内容相同。

现在,专门针对YouTube的问题,如果你将req.text保存在一个文件中并在文件编辑器中打开它并打开<body>标签,你会在<script>标签下看到(第二个)变量 window["ytInitialData"] 设置为非常长的 JSON。

其中包含每个视频所需的所有可用信息(标题、时长、视频 ID 等)。我建议你解析那个 JSON,看看它是否能解决你的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-08
    • 2019-02-17
    • 1970-01-01
    • 2017-08-11
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多