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

SQLite3插入数据错位问题求助:爬虫写入数据库时第二列跳行

SQLite3插入数据错位问题求助:爬虫写入数据库时第二列跳行

嘿,我看了你的问题,爬虫写入SQLite时第二列跳行确实挺闹心的,咱们来一步步捋捋问题出在哪:

核心问题分析

你的代码逻辑里有两个关键bug,直接导致了数据错位:

  1. 变量作用域混乱:你在get_data和get_descricao函数里定义的data_da_juntada、descricao_da_juntada是局部变量,外面的同名变量根本拿不到函数内的有效值。比如第一个循环插入时,descricao_da_juntada始终是初始的空字符串;第二个循环插入时,data_da_juntada也是空的,这就造成了“日期行空描述,描述行空日期”的错位现象。
  2. 循环逻辑错误:你现在是先遍历所有日期,插一遍带空描述的数据;再遍历所有描述,插一遍带空日期的数据。相当于把日期和描述拆成了两批独立插入,自然会出现第二列跳行的视觉效果。

代码修改建议

我给你调整了逻辑,让日期和描述对应起来再插入,同时修复了变量作用域的问题:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 11:28:10