如何捕获动态列表全部数据?新增值时旧值隐藏的爬取需求
动态列表爬取:合并新旧列表保留完整历史
问题背景
爬取随时间变化的列表时,新增内容会隐藏部分旧内容。需要将新列表中未包含在原列表的新序列追加到原列表,最终保留完整的历史数据。
当前已实现初始列表获取,尝试通过定位新旧列表的差异索引来追加新内容,代码如下:
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
相关产品推荐
相关产品推荐

