Reddit帖子评论与用户名爬虫未完整抓取问题排查
为什么我的Reddit评论抓取代码无法获取全部内容?
嘿,我帮你分析下为什么你的代码抓不全Reddit评论和用户名——这里有几个关键问题:
动态加载内容没处理:Reddit的评论是滚动加载的,
requests只能拿到页面初始加载的那部分评论,往下滚动或者点击「更多评论」才会加载的内容,静态请求根本拿不到。你的代码只请求了一次页面,自然抓不到后续的评论。新旧页面混合抓取的不匹配:你从新版页面(
soup)提取评论,却从旧版页面(old_soup)提取用户名,这两个页面的评论数量、层级结构可能完全不一样,很容易导致comment_list和username_list长度不匹配,要么漏显示内容,要么直接报错。而且你通过找[–]来定位下一个用户名的方式太脆弱了——页面结构稍微变一下,或者有些评论的格式特殊,就会抓错或者漏抓。页面结构依赖太脆弱:你用
data-test-id='comment'找评论、全局遍历a标签找用户名的方式,完全依赖Reddit当前的页面结构。Reddit经常会调整页面布局,而且像置顶评论、嵌套回复这类特殊评论的结构可能和普通评论不一样,很容易导致部分评论或用户名抓不到。没处理分层评论和加载更多:Reddit的评论是嵌套的,很多深层回复需要点击「查看更多回复」才会展开,静态请求不会触发这些交互,所以这部分内容你也抓不到。
给你几个改进方向:
- 用Reddit官方API(PRAW库):这是最靠谱的方式,直接调用API就能获取所有评论、用户名,不用折腾页面解析,还能轻松处理嵌套评论。比如先安装
pip install praw,然后按照官方文档配置账号后就能批量获取内容。 - 用Selenium模拟浏览器:如果一定要抓网页,用Selenium打开浏览器,模拟滚动、点击「更多评论」的操作,把所有动态加载的内容都渲染出来后再解析,这样就能拿到全部评论。
- 统一页面来源:要么都从新版页面抓评论和用户名,要么都用旧版,确保评论和用户名的对应关系正确。比如在每个评论块里直接找用户名元素,而不是全局找a标签——比如新版页面里,每个
data-test-id='comment'的div里,用户名通常在专门的用户信息模块中,找更稳定的层级选择器会更可靠。
你的代码如下:
import requests from bs4 import BeautifulSoup listt = [] count = 0 username_list = [] comment_list = [] headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"} url = input("Please input reddit url:") page = requests.get(url, headers=headers) old_page_url = "https://old"+url[11:] old_page = requests.get(old_page_url,headers=headers) soup = BeautifulSoup(page.text,"html.parser") old_soup = BeautifulSoup(old_page.text,"html.parser") comments = soup.findAll('div',{'data-test-id':'comment'}) for one_comment in comments: comment_list.append(one_comment.text) for name in old_soup.find_all("a"): listt.append(name.text) for item in listt: if item == '[–]': username_list.append(listt[count+1]) count+=1 for i in range(len((comment_list))): print(f"Comment made by u/{username_list[i]} = {comment_list[i]}")
内容的提问来源于stack exchange,提问作者oniichan
相关产品推荐
相关产品推荐

