使用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
相关产品推荐
相关产品推荐

