使用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是更稳妥的选择:
- 在目标Mastodon实例(botsin.space)的「设置」→「开发」中创建应用,获取访问令牌
- 使用
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
相关产品推荐
相关产品推荐

