You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:25:32