如何通过Selenium爬取Youtube无限流分页页面

发布时间:2022-5-13 09:54

原理:通过执行 js 来获取页面可滚动的高度,抓取该高度范围内的数据后,再跳转到底部。

这里获取可滚动高度用的是document.documentElement.scrollHeight 而不是 document.body.scrollHeight,用 body 的时候这个返回值一直是 0

代码如下:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
import time

chrome_options = Options()
chrome_options.add_argument('disable_infobars')
driver = webdriver.Chrome(options=chrome_options)

driver.set_window_position(0, 0)
driver.set_window_size(1024, 768)
driver.get("https://www.youtube.com/results?search_query=python")

# Get scroll height
last_height = driver.execute_script("return document.documentElement.scrollHeight")
print("scrollHeight0=" + str(last_height))

j = 1
n = 10
links = []
while True:
    user_data = []
    try:
        user_data = WebDriverWait(driver, timeout=5).until(lambda d: d.find_elements(by=By.ID, value='video-title'))
    except Exception as e:
        print(e)

    for i in user_data:
        links.append(i.get_attribute('href'))

    # Scroll down to bottom
    driver.execute_script("window.scrollTo(0, document.documentElement.scrollHeight);")

    # Wait to load page
    time.sleep(0.5)

    # Calculate new scroll height and compare with last scroll height
    new_height = driver.execute_script("return document.documentElement.scrollHeight")
    print("scrollHeight1=" + str(new_height))
    if new_height == last_height:
        break
    last_height = new_height

    print("finish "+str(j)+" time")
    if j > n:
        break
    j += 1

print(len(links))
print(links)
driver.close()

 

如何下载YouTube网站上的Mp4油管视频 电脑常识

如何下载YouTube网站上的Mp4油管视频

众所周知,每一个视频平台都有自己的独特视频,但我们往往想保存收藏起来,却因没有权限,或者没有办法而苦思烦恼。问你们个问题,你们觉得在YouTube上看视频最爽的体验是什么? 如何下载Y...
GoLang与Java各自生成grpc代码流程介绍 生活杂谈

GoLang与Java各自生成grpc代码流程介绍

1.背景: 由于公司的日志系统使用的是plumelog,最近生产环境老是报 jedis连接池不够,导致丢失日志,而且服务老是重启,怀疑跟日志系统有关,于是自己改造plumelog,使用go grpc...
MySQL同步数据Replication的实现步骤 生活杂谈

MySQL同步数据Replication的实现步骤

MySQL提供了Replication功能,可以实现将一个数据库的数据同步到多台其他数据库。前者通常称之为主库(master),后者则被称从库(slave)。MySQL复制过程采用异步方式,但延时非常...