我最近决定使用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()
感谢任何帮助,谢谢
答案 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
。