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

如何捕获动态列表全部数据?新增值时旧值隐藏的爬取需求

动态列表爬取:合并新旧列表保留完整历史

问题背景

爬取随时间变化的列表时,新增内容会隐藏部分旧内容。需要将新列表中未包含在原列表的新序列追加到原列表,最终保留完整的历史数据。

当前已实现初始列表获取,尝试通过定位新旧列表的差异索引来追加新内容,代码如下:

def achar_ind(lista: list, nova_lista: list):
    inds: list = []
    ind: list = []
    for i in enumerate(nova_lista):
        for k in lista:
            if i[1] == k:
                if not ind:
                    ind += [i[0]]
                else:
                    if ind[-1] + 1 == i[0]:
                        # print(f'**********************\t{i[0]}')
                        ind += [i[0]]
                    else:
                        inds += [ind]
                        ind = [i[0]]

                break
    inds += [ind]
    return inds

def add(lista: list, nova_lista: list):
    a: list = []
    a += max(achar_ind(lista, nova_lista), key=len)
    return a[-1]

grafico += [x for x in novo_grafico[add(grafico, novo_grafico)+1:] if len(novo_grafico) - 1 != add(grafico, novo_grafico)]

简化解决方案

核心需求是找到原列表在新列表中最后一段连续保留的旧内容,再追加后续的新内容。以下是更高效直观的实现:

def append_new_items(original_list: list, new_list: list) -> list:
    # 寻找原列表与新列表的最长连续匹配后缀(未被隐藏的旧内容)
    max_match_len = 0
    # 从最长可能的匹配长度开始倒查,确保找到最长的连续匹配
    for match_len in range(min(len(original_list), len(new_list)), 0, -1):
        if new_list[:match_len] == original_list[-match_len:]:
            max_match_len = match_len
            break
    # 追加新列表中超出匹配部分的所有新元素
    original_list.extend(new_list[max_match_len:])
    return original_list

使用方式

替换原代码的最后一行,直接调用:

grafico = append_new_items(grafico, novo_grafico)

原代码问题分析

原实现逻辑过于复杂,存在以下缺陷:

  • 嵌套循环遍历所有元素,时间复杂度为O(n*m),数据量大时效率低下
  • 连续索引的处理逻辑容易触发边界错误(比如原列表元素在新列表中分散出现的场景)
  • add函数取最长连续索引的末尾值,逻辑不够直观,容易遗漏部分新增内容的场景

内容的提问来源于stack exchange,提问作者Agostinho Sachi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:31:13