【问题标题】:Scrape dynamic HTML (YouTube comments)抓取动态 HTML(YouTube 评论)
【发布时间】:2018-04-12 21:16:05
【问题描述】:

借助 Beautiful Soup 和请求库,我可以抓取 HTML 内容,但不能抓取 JavaScript 或 AJAX 调用加载的内容。

如何通过我的 Python 脚本来模拟这一点?因为当我们滚动页面时 YouTube cmets 会加载。我找到了两种方法;一个使用 Selenium,另一个使用 lxml 请求,我有点看不懂。

示例 (this is the video):

import requests
from bs4 import BeautifulSoup as soup

url = 'https://www.youtube.com/watch?v=iFPMz36std4'
response = requests.get(url)
page_html = response.content
#print page_html

page_soup=soup(page_html,"html.parser")
print page_soup

【问题讨论】:

  • 请在此处以纯文本形式发布代码、错误、示例数据或文本输出,而不是难以阅读的图像,不能复制粘贴以帮助测试代码或在答案中使用,并且对使用屏幕阅读器的人怀有敌意。您可以编辑问题以在问题正文中添加代码。使用{} 按钮来格式化任何代码块,或者使用四个空格缩进以获得相同的效果。 我们无法将您的屏幕截图作为代码运行。
  • 您必须使用浏览器实例,例如 phantomjs 或 headless chrome 来加载页面并呈现动态内容。
  • '我有点听不懂':这就是你的基本困难,就在那里。使用硒很可能做你想做的事。但是,这不是一个教程网站。你需要去找到其中的一个,并学习足够的知识来编写一些代码来尝试做你想做的事情。

标签: python web-scraping beautifulsoup python-requests dynamic-html


【解决方案1】:

你需要使用硒:

这里有个技巧,Youtube只在你向下滚动视频时加载cmets,如果你滚动底部或其他地方,cmets将不会加载,所以首先滚动到向下部分并等待滚动到底部后加载cmets或随时随地:

from selenium import webdriver

import time

driver=webdriver.Chrome()

driver.get('https://www.youtube.com/watch?v=iFPMz36std4')

driver.execute_script('window.scrollTo(1, 500);')

#now wait let load the comments
time.sleep(5)

driver.execute_script('window.scrollTo(1, 3000);')



comment_div=driver.find_element_by_xpath('//*[@id="contents"]')
comments=comment_div.find_elements_by_xpath('//*[@id="content-text"]')
for comment in comments:
    print(comment.text)

部分输出:

#can't post full output its too long
I love Kygo's Stranger Things and Netflix's Stranger Things <3
Stranger Things, Kygo and OneRepublic, could it be better?
Amazing Vibe!!!!!!!!!????

【讨论】:

    【解决方案2】:

    使用 Selenium 可以解决问题。

    虽然我有不同的向下滚动方式。此函数将通过定期调用 javascript 来帮助您向下滚动,并检查窗口的高度在实际向下滚动和之前向下滚动之间是否发生了变化。

    def scrollDown(pause, driver):
        """
        Function to scroll down till end of page.
        """
        import time
        lastHeight = driver.execute_script("return document.body.scrollHeight")
    
        while True:
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(pause)
            newHeight = driver.execute_script("return document.body.scrollHeight")
            if newHeight == lastHeight:
                break
            lastHeight = newHeight
    
    # Main Code
    driver = webdriver.Chrome()
    
    # Instantiate browser and navigate to page
    
    driver.get('https://www.youtube.com/watch?v=iFPMz36std4')
    scrollDown(6, driver)
    
    # Page soup 
    soup = BeautifulSoup(driver.page_source, "html.parser")
    

    【讨论】:

    • 我们可以在不使用 selenium 的情况下(不打开浏览器并向下滚动)来实现吗,比如报废视频的所有 cmets
    • 您应该考虑 youtube 自己的 api,它使您能够轻松地提取此类数据。在这里阅读更多:developers.google.com/youtube/v3/docs/comments/list#usage
    猜你喜欢
    • 2021-08-25
    • 2014-10-03
    • 2016-11-14
    • 1970-01-01
    • 2014-10-28
    • 2019-05-08
    • 2023-02-24
    • 2020-05-25
    • 1970-01-01
    相关资源
    最近更新 更多