如何将Selenium抓取的数据拆分存储为两组关联衔接的列表?
问题解决
现有代码及运行结果
lokk = [] nums = 7 for _ in range(nums): inner = driver.find_element_by_xpath( "/html/body/div[1]/div[2]/div/div/div/div[2]/div/div/div/div[2]/div[2]/div/div/div[2]/div[5]/span[1]").get_attribute( "innerHTML") lokk.append(inner) time.sleep() print(lokk)
运行后得到数据:['1', '2', '3', '4', '5', '6', '7']
预期需求
需要将抓取数据分为两组:
- 第一组:包含前6个元素,如
['1', '2', '3', '4', '5', '6'] - 第二组:包含全部7个元素,如
['1', '2', '3', '4', '5', '6', '7']
后续再次抓取时,新分组需以上一次第二组的最后一个元素为起始:
- 新第一组:
['7', '8', '9', '10', '11', '12'] - 新第二组:
['7', '8', '9', '10', '11', '12', '13']
尝试的代码及问题
尝试的代码如下:
lok = [] num = 6 for _ in range(num): inner = driver.find_element_by_xpath( "/html/body/div[1]/div[2]/div/div/div/div[2]/div/div/div/div[2]/div[2]/div/div/div[2]/div[5]/span[1]").get_attribute( "innerHTML") lok.append(inner) time.sleep(10) print(lok) lokk = [] nums = 7 for _ in range(nums): inner = driver.find_element_by_xpath( "/html/body/div[1]/div[2]/div/div/div/div[2]/div/div/div/div[2]/div[2]/div/div/div[2]/div[5]/span[1]").get_attribute( "innerHTML") lokk.append(inner) time.sleep() print(lokk)
存在的问题:
- 抓取第二组7个元素时,页面数据已更新,无法得到预期结果
- 后续运行时,上一组的第7个元素无法成为新组起始,新组会从下一个元素开始
解决方案
核心问题是重复抓取时没有复用已获取的最后一个元素,且两次独立循环导致页面数据更新后前后数据断层,可以按以下思路修改:
- 每次抓取时,先获取足够的连续数据,再从中拆分两组;后续抓取以上一次的最后一个元素为起点,只补充新数据。
- 维护一个全局的历史数据列表,避免重复抓取已获取的元素。
修改后的代码示例:
import time from selenium import webdriver driver = webdriver.Chrome() # 根据你的浏览器调整驱动 # 假设这里已经打开目标页面并完成初始化 # 初始抓取:获取7个元素 total_data = [] initial_count = 7 for _ in range(initial_count): inner = driver.find_element_by_xpath( "/html/body/div[1]/div[2]/div/div/div/div[2]/div/div/div/div[2]/div[2]/div/div/div[2]/div[5]/span[1]").get_attribute( "innerHTML") total_data.append(inner) time.sleep(10) # 根据页面更新频率调整休眠时间 # 拆分初始两组 group1 = total_data[:6] group2 = total_data[:7] print("初始第一组:", group1) print("初始第二组:", group2) # 后续抓取逻辑:以上一次第二组最后一个元素为起点 while True: # 可以根据需求改成固定次数循环 # 获取当前需要补充的元素数量:需要凑够新的7个(含上一次最后一个),所以补充6个新元素 need_count = 6 new_data = [] # 先把上一次的最后一个元素加入新数据 new_data.append(total_data[-1]) # 抓取6个新元素 for _ in range(need_count): inner = driver.find_element_by_xpath( "/html/body/div[1]/div[2]/div/div/div/div[2]/div/div/div/div[2]/div[2]/div/div/div[2]/div[5]/span[1]").get_attribute( "innerHTML") new_data.append(inner) time.sleep(10) # 更新全局数据 total_data.extend(new_data[1:]) # 只加新的6个,避免重复 # 拆分新的两组 new_group1 = new_data[:6] new_group2 = new_data[:7] print("新第一组:", new_group1) print("新第二组:", new_group2) # 可以在这里加停止条件,比如抓取N轮后break # break
关键说明
- 用
total_data维护所有已抓取的元素,避免重复获取 - 初始抓取7个元素后直接拆分两组,不需要分开两次循环,避免页面更新导致数据不一致
- 后续抓取时,先把上一组最后一个元素加入新数据列表,再抓取6个新元素,刚好凑够7个,拆分后自然满足要求
- 休眠时间要根据页面实际更新频率调整,确保每次抓取时页面已经更新到下一个元素
内容的提问来源于stack exchange,提问作者damian2345673
相关产品推荐
相关产品推荐

