Python3从youtube一次解析超过30个视频

时间:2015-11-05 11:46:39

标签: python youtube beautifulsoup

我最近决定使用python进行解析,我编写了一个项目,我需要从所有的youtubers视频中获取数据。我决定只是去他们频道的视频标签很容易,并解析它的所有链接。但是,当我解析它时,我一次只能获得30个视频。我想知道为什么这是因为当你加载更多时,链接似乎永远不会改变。以及如果有办法绕过它。 这是我的代码

import bs4 as bs
import requests

page = requests.get("/run/media/morpheous/PORTEUS/Workspace/Python/Parsing/parse.py")
soup = bs.BeautifulSoup(page.text, 'html.parser')
soup.find_all("a", "watch-view-count")
k = soup.find_all("div", "yt-uix-sessionlink yt-uix-tile-link  spf-link  yt-ui-ellipsis yt-ui-ellipsis-2")
storage = open('data.csv', 'a')
storage.write(k.get('href')
storage.close()

感谢任何帮助,谢谢

1 个答案:

答案 0 :(得分:1)

我首先应该说我同意@jonrsharpe。使用YouTube API是更明智的选择。

但是,如果你必须通过抓取来做到这一点,这里有一个建议。它不是非常简单,但实际上看起来比它复杂。

我们以MKBHD的视频页面为例。页面底部的加载更多按钮包含一个带有此属性的button标记(您可以使用浏览器'检查元素'功能查看这个值):

data-uix-load-more-href="/browse_ajax?action_continuation=1&continuation=4qmFsgJAEhhVQ0JKeWNzbWR1dllFTDgzUl9VNEpyaVEaJEVnWjJhV1JsYjNNZ0FEZ0JZQUZxQUhvQk1yZ0JBQSUzRCUzRA%253D%253D"

当您单击加载更多按钮时,它会向此/browse_ajax网址发出AJAX请求。响应是一个JSON对象,如下所示:

{
    content_html: "the html for the videos",
    load_more_widget_html: "      \n\n\n\n    \u003cbutton class=\"yt-uix-button yt-uix-button-size-default yt-uix-button-default load-more-button yt-uix-load-more browse-items-load-more-button\" type=\"button\" onclick=\";return false;\" aria-label=\"Load more\n\" data-uix-load-more-href=\"\/browse_ajax?action_continuation=1\u0026amp;continuation=4qmFsgJAEhhVQ0JKeWNzbWR1dllFTDgzUl9VNEpyaVEaJEVnWjJhV1JsYjNNZ0FEZ0JZQUZxQUhvQk03Z0JBQSUzRCUzRA%253D%253D\" data-uix-load-more-target-id=\"channels-browse-content-grid\"\u003e\u003cspan class=\"yt-uix-button-content\"\u003e  \u003cspan class=\"load-more-loading hid\"\u003e\n      \u003cspan class=\"yt-spinner\"\u003e\n      \u003cspan class=\"yt-spinner-img  yt-sprite\" title=\"Loading icon\"\u003e\u003c\/span\u003e\n\nLoading...\n  \u003c\/span\u003e\n\n  \u003c\/span\u003e\n  \u003cspan class=\"load-more-text\"\u003e\n    Load more\n\n  \u003c\/span\u003e\n\u003c\/span\u003e\u003c\/button\u003e\n\n\n"
}

content_html包含新视频页面的html。您可以解析该内容以获取该页面中的视频。要进入下一页,您需要使用load_more_widget_html值并提取再次显示的网址:

data-uix-load-more-href="/browse_ajax?action_continuation=1&continuation=4qmFsgJAEhhVQ0JKeWNzbWR1dllFTDgzUl9VNEpyaVEaJEVnWjJhV1JsYjNNZ0FEZ0JZQUZxQUhvQk1yZ0JBQSUzRCUzRA%253D%253D"

该网址中唯一改变的是continuation参数的值。您可以继续向此要求继续' url,直到返回的JSON对象没有load_more_widget_html