WebScraping爬取Telegram网页版语音时长失败问题求助
问题原因及解决方案
核心原因
你的代码爬不到目标元素,主要是这几个问题:
- 动态内容未加载:Telegram网页版是单页应用,初始HTML仅包含页面框架,聊天内容、语音时长这类元素都是浏览器执行JavaScript后动态渲染出来的。
requests库只能获取静态初始HTML,不会运行JS,自然拿不到这些动态生成的元素。 - 缺少登录验证:访问个人聊天页面需要登录状态,
requests.get是无状态请求,没有携带你的登录Cookie或认证令牌,服务器只会返回未登录的框架页面,不会返回你的聊天数据。 - 代码变量错误:你定义了解析后的对象
soup2,但后续调用的是soup.find_all,变量名不匹配,这也会导致无法正确查找元素。 - 前端路由无效:URL中的
#@myname是前端路由,服务器不会处理这部分内容,requests请求时服务器返回的还是初始页面,不会自动跳转到指定聊天窗口。
解决方案
用支持JS渲染的工具爬取
改用Selenium或Playwright这类模拟真实浏览器的工具,它们会自动执行JS并加载动态内容。示例(Selenium):from selenium import webdriver from selenium.webdriver.common.by import By from bs4 import BeautifulSoup import re import time # 初始化浏览器驱动(需提前下载对应浏览器的驱动,比如ChromeDriver) driver = webdriver.Chrome() driver.get('https://web.telegram.org/k/#@myname') # 留足时间手动完成登录 time.sleep(10) # 获取渲染后的完整页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, 'lxml') audio_elements = soup.find_all('div', class_=re.compile('audio-time')) if audio_elements: print(audio_elements[0].text) else: print("未找到目标元素") driver.quit()修正代码变量名
把代码中的soup.find_all改成soup2.find_all,确保变量引用一致,避免低级错误。携带登录Cookie(仅辅助,仍可能无法获取动态内容)
如果坚持用requests,可以先在浏览器登录Telegram Web,通过开发者工具复制登录后的Cookie,在请求时携带:import requests from bs4 import BeautifulSoup import re telegramURL = 'https://web.telegram.org/k/' headers = { 'Cookie': '粘贴你浏览器中Telegram页面的Cookie内容' } audiolength = requests.get(telegramURL, headers=headers) soup2 = BeautifulSoup(audiolength.text, 'lxml') audio2 = soup2.find_all('div', class_=re.compile('audio-time')) print(audio2)注意:Cookie有有效期,过期后需要重新获取,且这种方式仍可能拿不到动态加载的聊天数据,因为核心内容还是通过JS异步接口拉取的。
内容的提问来源于stack exchange,提问作者irenavox
相关产品推荐
相关产品推荐

