您好,我正在练习我的请求和网络抓取技能,所以我试图在youtube上抓取趋势页面,并拉动趋势视频的标题,此链接为youtube
这是我正在运行的代码
import requests
from bs4 import BeautifulSoup
url = 'https://www.youtube.com/feed/trending'
html = requests.get(url)
soup = BeautifulSoup(html.content, "html.parser")
a = soup.find_all("a", {"id": "video-title"})
print(a)
及其返回的[],我不明白为什么在源代码中返回它的[]
答案 0 :(得分:2)
打印变量html.content
的内容-它是否包含该ID?
我敢打赌,youtube.com是一个高度依赖JavaScript的网站,但是requests
模块没有js引擎。您的浏览器通常不会看到requests
之类的模块。
答案 1 :(得分:2)
您可能需要诸如selenium之类的方法,该方法需要时间才能完全渲染页面。以下目前产生70个标题。
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
url = 'https://www.youtube.com/feed/trending'
d = webdriver.Chrome()
d.get(url)
titles = [title.text for title in WebDriverWait(d,20).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#video-title")))]
print(titles)
d.quit()
答案 2 :(得分:2)
网络日新月异,它变得越来越难以理解。在大多数情况下,服务器不再生成“现代”网页,因为用户会看到它们。相反,脚本群正在被发送给用户,并且基本上将任何\ _(ツ)_ /¯注入到DOM中。
这就是为什么如上所述,您需要在功能完善的浏览器中使用Selenium绑定。
我很抱歉没有对此发表评论,但显然我需要50分才能做到这一点。