Python数据库索引问题:爬取数据重复插入及索引对齐修复需求
问题根源与解决办法
问题出在哪
- 可变默认参数的坑:Python里函数的可变默认参数(比如
organizatorzy=[])只会在函数定义时初始化一次,之后每次调用都会复用同一个列表,爬多页时数据不断累积,导致重复插入。 - 字段拆分插入逻辑错误:现在是把
organizator和rodzaj分开插入到不同行,而不是把一条完整的奖学金记录(标题、组织者、类型等所有字段)作为一行插入,直接造成字段索引对不上,且每处理一页就重复插入已有数据。
具体修复步骤
1. 废弃拆分字段的插入函数,改用完整记录插入
不要单独处理每个字段,先把单条奖学金的所有信息(标题、组织者、类型等)收集成完整的字典或元组,再执行一次INSERT操作插入整行数据。
2. 调整爬取与插入流程
遍历页面时,先爬取当前页的所有单条记录,每条记录收集齐所有字段后逐条插入:
# 假设你有爬取单页记录的函数get_scholarship_info,返回包含所有字段的列表 for page in range(1, pages + 1): # 爬取当前页的所有奖学金记录 scholarship_records = get_scholarship_info(page) for record in scholarship_records: try: # 一次性插入整行,字段和值要对应 query = """ INSERT INTO stypendia (tytul, organizator, rodzaj) VALUES (%s, %s, %s) """ values = (record['tytul'], record['organizator'], record['rodzaj']) cursor.execute(query, values) conn.commit() except Exception as e: # 别直接pass,打印错误方便排查问题 print(f"插入失败: {e}") conn.rollback()
3. 额外防重复措施(可选)
如果担心爬取到重复记录,可以给数据库表的关键字段(比如标题tytul)加唯一约束,或者插入前先检查是否已存在:
# 插入前先查询是否存在该记录 check_query = "SELECT id FROM stypendia WHERE tytul = %s" cursor.execute(check_query, (record['tytul'],)) if not cursor.fetchone(): # 不存在才执行插入 cursor.execute(query, values) conn.commit()
内容的提问来源于stack exchange,提问作者Beeednarek
相关产品推荐
相关产品推荐

