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

使用Telethon爬取Telegram数据时遭遇sqlite3数据库锁定错误

解决Telethon爬取Telegram时的sqlite3数据库锁定错误

问题场景

我在VS Code中使用Python语言,通过Telethon库爬取Telegram数据,代码如下:

from telethon.sync import TelegramClient
import datetime
import pandas as pd

api_id = 18879654
api_hash = '7d78879e63e0b95612c778765e4665ba3'

chats = ['waqarzaka']


client =  TelegramClient('test', api_id, api_hash)


df = pd.DataFrame()


for chat in chats:
    with TelegramClient('test', api_id, api_hash) as client:
        for message in client.iter_messages(chat, offset_date=datetime.date.today() , reverse=True):
            print(message)
            data = { "group" : chat, "sender" : message.sender_id, "text" : message.text, "date" : message.date}

            temp_df = pd.DataFrame(data, index=[1])
            df = df.append(temp_df)

df['date'] = df['date'].dt.tz_localize(None)

df.to_excel("E:\\tel\\data_{}.xlsx".format(datetime.date.today()), index=False)

运行后出现数据库锁定错误:

PS C:\Users\User> & C:/Users/User/AppData/Local/Programs/Python/Python311/python.exe c:/Users/User/OneDrive/Desktop/hello.py
Traceback (most recent call last):
  File "c:\Users\User\OneDrive\Desktop\hello.py", line 23, in <module>
    with TelegramClient('test', api_id, api_hash) as client:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\User\AppData\Local\Programs\Python\Python311\Lib\site-packages\telethon\client\telegrambaseclient.py", line 294, in __init__   
    session.set_dc(
  File "C:\Users\User\AppData\Local\Programs\Python\Python311\Lib\site-packages\telethon\sessions\sqlite.py", line 168, in set_dc
    self._update_session_table()
  File "C:\Users\User\AppData\Local\Programs\Python\Python311\Lib\site-packages\telethon\sessions\sqlite.py", line 194, in _update_session_table
    c.execute('delete from sessions')
sqlite3.OperationalError: database is locked
PS C:\Users\User> 

解决方案

1. 核心问题:重复创建客户端实例导致数据库冲突

你先初始化了一个client实例,又在循环里重复用with TelegramClient('test', ...)创建同一个会话(对应同一个test.session sqlite数据库文件),多个连接同时操作数据库引发锁定。

2. 修改后的代码

只创建一次客户端连接并复用,同时替换已弃用的append方法为pd.concat:

from telethon.sync import TelegramClient
import datetime
import pandas as pd

api_id = 18879654
api_hash = '7d78879e63e0b95612c778765e4665ba3'

chats = ['waqarzaka']

df = pd.DataFrame()

# 仅创建一次客户端,用上下文管理器管理连接生命周期
with TelegramClient('test', api_id, api_hash) as client:
    for chat in chats:
        # 遍历目标聊天的消息
        for message in client.iter_messages(chat, offset_date=datetime.date.today(), reverse=True):
            print(message)
            data = { 
                "group": chat, 
                "sender": message.sender_id, 
                "text": message.text, 
                "date": message.date
            }

            temp_df = pd.DataFrame(data, index=[0])
            # 用concat替代append(append已被官方弃用)
            df = pd.concat([df, temp_df], ignore_index=True)

# 移除时区信息
df['date'] = df['date'].dt.tz_localize(None)

# 保存到Excel
df.to_excel(f"E:\\tel\\data_{datetime.date.today()}.xlsx", index=False)

3. 额外排查项

  • 如果修改后仍报错,检查是否有残留的Python进程占用test.session文件,打开任务管理器结束所有Python进程后重试
  • 不要在OneDrive等同步目录存放代码和会话文件,同步过程会锁定文件,建议移到本地非同步目录
  • 若问题依旧,可删除test.session文件后重新运行(会触发Telegram账号验证流程)

内容的提问来源于stack exchange,提问作者Ziviz Zaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:50:27