BeautifulSoup爬取Reddit标题仅返回8条结果如何解决
问题根源
你只能爬取到8条标题,是三个问题共同导致的:
- 直接用
requests发起请求时,获取到的只是页面首屏的静态HTML代码,Reddit剩余的帖子是用户滚动页面时通过JavaScript动态加载的,requests不会执行页面JS,自然拿不到后续渲染的帖子内容。 - 你用的
div h3选择器匹配范围太宽泛,既会误选页面中非帖子标题的h3元素,也无法适配Reddit动态生成的元素类名规则,很容易出现匹配不全的问题。 - 你没有给请求设置合法的User-Agent请求头,Reddit会识别到默认的爬虫请求头,返回不完整的页面内容甚至直接拦截请求。
修复方案
最稳定的实现方式是直接调用Reddit页面对应的JSON接口,不需要解析HTML、也不需要处理JS渲染,就能拿到完整的帖子数据,参考代码如下:
import requests # 在原搜索路径后加.json即可调用内置接口,limit参数可控制单页返回的帖子数量 target_url = "https://www.reddit.com/r/RedditWritesSeinfeld/search/.json?q=flair%3Aprompt&restrict_sr=1&sr_nsfw=&t=all&sort=top&limit=100" # 配置合法请求头,避免被反爬拦截 request_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } response = requests.get(target_url, headers=request_headers) page_data = response.json() post_titles = [] # 直接从结构化返回数据中提取标题,无需做HTML选择匹配 for post_item in page_data["data"]["children"]: post_titles.append(post_item["data"]["title"]) print(f"当前获取到的标题总数:{len(post_titles)}") for title in post_titles: print(title)
如果需要爬取超过100条的多页内容,只需要提取接口返回值中data.after的字段值,将其作为after参数拼接到下一次请求的参数中,即可实现分页爬取。
如果你一定要通过解析HTML的方式实现,需要使用可执行JS的爬虫工具(比如selenium、playwright、requests-html),等页面滚动加载完所有目标帖子后,再用更精准的选择器匹配标题元素,这种方案实现成本更高,也更容易被反爬规则拦截。
内容的提问来源于stack exchange,提问作者Rikartt
相关产品推荐
相关产品推荐

