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

使用snscrape爬取Mastodon时出现AttributeError错误求助

解决snscrape爬取Mastodon内容时的AttributeError问题

问题分析

你遇到的AttributeError: 'NoneType' object has no attribute 'find_all',根源是snscrape解析Mastodon页面时,soup.find('div', class_='activity-stream')返回了None——也就是没找到预期的页面元素。常见原因包括:

  • Mastodon目标实例的页面结构更新,旧版snscrape的解析逻辑失效
  • 目标实例启用了访问限制,未登录状态下无法获取完整页面内容
  • 请求头配置问题,导致服务器返回的页面不符合预期结构

解决方案

1. 升级snscrape到最新版本

Mastodon页面结构可能迭代,旧版snscrape的选择器可能已失效。执行以下命令升级:

pip install --upgrade snscrape

升级后重新运行爬取命令,验证问题是否解决。

2. 验证目标页面的可访问性与结构

手动访问https://botsin.space/@pomological:

  • 如果页面需要登录才能查看,网页爬取方式会失效,建议改用API方案
  • 检查页面源码,确认是否存在div.activity-stream和div.entry元素。如果不存在,说明页面结构已变更,可等待snscrape官方适配,或自行修改解析逻辑

3. 改用Mastodon API爬取(更稳定可靠)

网页爬取易受页面结构影响,官方API是更稳妥的选择:

  1. 在目标Mastodon实例(botsin.space)的「设置」→「开发」中创建应用,获取访问令牌
  2. 使用Mastodon.py库调用API获取内容:
from mastodon import Mastodon

# 初始化客户端
mastodon = Mastodon(
    access_token='你的访问令牌',
    api_base_url='https://botsin.space/'
)

# 搜索目标用户
user = mastodon.account_search('pomological')[0]
# 获取用户动态(limit可调整,最多40条/次,支持分页获取更多)
toots = mastodon.account_statuses(user['id'], limit=40)

# 遍历输出内容
for toot in toots:
    print(f"发布时间: {toot['created_at']}")
    print(f"内容: {toot['content']}")
    print("---")

4. 临时修改snscrape解析逻辑(应急方案)

如果升级后仍无法解决,且不想改用API,可临时修改snscrape源码:
找到snscrape/modules/mastodon.py第279行,修改为:

activity_stream = soup.find('div', class_='activity-stream')
if not activity_stream:
    raise ValueError("Failed to locate activity stream element; page structure may have changed or access is restricted")
entries = activity_stream.find_all('div', class_='entry')

修改后会抛出更明确的错误,避免直接调用None的方法。注意此修改会随snscrape升级被覆盖,仅作临时应急用。

内容的提问来源于stack exchange,提问作者Lee Wyle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 02:07:19