SQLite3插入数据错位问题求助:爬虫写入数据库时第二列跳行
SQLite3插入数据错位问题求助:爬虫写入数据库时第二列跳行
嘿,我看了你的问题,爬虫写入SQLite时第二列跳行确实挺闹心的,咱们来一步步捋捋问题出在哪:
核心问题分析
你的代码逻辑里有两个关键bug,直接导致了数据错位:
- 变量作用域混乱:你在
get_data和get_descricao函数里定义的data_da_juntada、descricao_da_juntada是局部变量,外面的同名变量根本拿不到函数内的有效值。比如第一个循环插入时,descricao_da_juntada始终是初始的空字符串;第二个循环插入时,data_da_juntada也是空的,这就造成了“日期行空描述,描述行空日期”的错位现象。 - 循环逻辑错误:你现在是先遍历所有日期,插一遍带空描述的数据;再遍历所有描述,插一遍带空日期的数据。相当于把日期和描述拆成了两批独立插入,自然会出现第二列跳行的视觉效果。
代码修改建议
我给你调整了逻辑,让日期和描述对应起来再插入,同时修复了变量作用域的问题:
1. 重构爬虫核心逻辑
from selenium import webdriver from selenium.webdriver.common.by import By from bs4 import BeautifulSoup import time from sqlprocessos import get_numproc, insert_data options = webdriver.ChromeOptions() options.add_argument("--headless=new") def get_process_date(conexao, url, process): driver = webdriver.Chrome(options=options) print(url) driver.get(url) time.sleep(5) driver.switch_to.frame('mainframe') iframe_content = driver.page_source soup = BeautifulSoup(iframe_content, 'html.parser') # 先收集所有有效日期和描述(避免空值干扰) collected_dates = [] possible_mov = ['Data da juntada: ', 'Data de recebimento: ', 'Data de remessa: ', 'Data do trânsito: ', 'Data de arquivamento: ', 'Data da conclusão: ', 'Data: ', 'Data de devolução: '] for mov in possible_mov: try: date_text = soup.find('label', text=mov).find_next('label').text.strip() collected_dates.append(date_text) except Exception: continue collected_descs = [] possible_desc = ['Juiz: ', 'Descrição da Juntada: ', 'Descrição', 'Tipo de arquivamento: ', 'Descrição: '] for desc in possible_desc: try: desc_text = soup.find('label', text=desc).find_next('label').text.strip() collected_descs.append(desc_text) except Exception: continue # 生成表名 table_name = "p" + str(process).replace('-','').replace('.','') # 优先插入日期和描述对应的组合 for date, desc in zip(collected_dates, collected_descs): insert_data(conexao, table_name, date, desc) print(f"已插入:日期={date},描述={desc}") # 处理剩余的日期/描述(如果数量不一致) for remaining_date in collected_dates[len(collected_descs):]: insert_data(conexao, table_name, remaining_date, "") for remaining_desc in collected_descs[len(collected_dates):]: insert_data(conexao, table_name, "", remaining_desc) driver.switch_to.default_content() driver.quit() base_url = 'https://www3.tjrj.jus.br/consultaprocessual/#/consultapublica?numProcessoCNJ=' num_procs = get_numproc() # 假设你的数据库连接是在这里初始化的 conexao = ... # 你的SQLite连接代码 for num in num_procs: url = base_url + num get_process_date(conexao, url, num) time.sleep(5) conexao.close()
2. 优化数据库插入函数
把数据库连接作为参数传入,避免全局变量的潜在问题:
def insert_data(conexao, tabela, data, descricao): cursor = conexao.cursor() comando = f'INSERT INTO {tabela} (DATA, MOVIMENTO) VALUES (?, ?)' valores = (data, descricao) cursor.execute(comando, valores) conexao.commit()
额外调试建议
- 替换固定
time.sleep(5)为Selenium的显式等待(WebDriverWait),比如等待app-movimento元素加载完成,避免页面未加载就解析导致的元素找不到问题。 - 调试时多打印
collected_dates和collected_descs的内容,确认收集到的数据是否符合预期,方便快速定位问题。
备注:内容来源于stack exchange,提问作者Renan Liporaci
相关产品推荐
相关产品推荐

