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

Python数据库索引问题:爬取数据重复插入及索引对齐修复需求

问题根源与解决办法

问题出在哪

  1. 可变默认参数的坑:Python里函数的可变默认参数(比如organizatorzy=[])只会在函数定义时初始化一次,之后每次调用都会复用同一个列表,爬多页时数据不断累积,导致重复插入。
  2. 字段拆分插入逻辑错误:现在是把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:40:35