3

使用 Beautiful Soup 和 Request Library,我可以抓取 HTML 内容,但不能抓取 JavaScript 或 AJAX 调用加载的内容。

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

示例(这是视频):

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
4

2 回答 2

1

您需要使用硒:

这是一个技巧,Youtube 仅在您向下滚动视频时加载评论,如果您滚动底部或其他地方,评论将不会加载,因此首先滚动到该向下部分,然后在滚动到底部或任何时候等待加载评论:

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!!!!!!!!!
于 2017-10-31T18:50:15.167 回答
-1

使用 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")
于 2017-11-01T09:56:37.697 回答