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

Selenium爬虫异常:Interpol红色通缉令数据爬取结果错误

Selenium爬取Interpol红色通缉令数据错误的排查与解决

针对你遇到的无关数据混入、重复结果问题,核心原因通常集中在页面加载时机、元素交互逻辑、数据存储管理这几个环节,以下是具体排查点和解决方案:


1. 页面异步加载未等待,导致采集旧数据

Interpol的搜索结果是动态异步加载的,选择国籍/年龄区间后直接采集,会拿到上一次搜索的残留数据。

  • 解决:用显式等待替代强制休眠
    等待结果列表加载完成或页面状态更新后再采集:
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    # 选择国籍/年龄后,等待结果列表元素出现
    WebDriverWait(driver, 12).until(
        EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".red-notice-card"))
    )
    # 可选:等待加载动画消失
    WebDriverWait(driver, 10).until(
        EC.invisibility_of_element_located((By.CSS_SELECTOR, ".loading-spinner"))
    )
    

2. 下拉框交互逻辑错误,未正确触发页面刷新

如果下拉框是非标准HTML <select>(Interpol的下拉是自定义组件),直接点击选项可能未触发搜索刷新,导致页面停留在上一个国家的结果。

  • 解决:模拟完整的下拉展开-选择流程
    # 点击国籍下拉框展开选项列表
    driver.find_element(By.CSS_SELECTOR, "#nationality-filter .dropdown-toggle").click()
    # 等待选项加载完成,再点击目标国家
    target_country = WebDriverWait(driver, 8).until(
        EC.element_to_be_clickable((By.XPATH, "//div[@id='nationality-filter']//span[text()='Afghanistan']"))
    )
    target_country.click()
    # 等待页面URL或结果更新(确保搜索已触发)
    WebDriverWait(driver, 10).until(
        EC.url_contains("nationality=AFG")
    )
    

3. 数据容器未重置,跨国家数据污染

如果每次循环前没有清空存储数据的列表/字典,上一个国家的残留数据会混入当前结果。

  • 解决:在每个国家/年龄循环开始时初始化空容器
    # 遍历所有国家
    for country_name in country_list:
        # 每次循环都初始化空列表,避免数据残留
        current_results = []
        # 执行选择国家、年龄区间、采集数据的逻辑
        # ...
        # 将current_results写入CSV
        with open("red_notices.csv", "a", encoding="utf-8", newline="") as f:
            writer = csv.DictWriter(f, fieldnames=["name", "age", "nationality"])
            writer.writerows(current_results)
    

4. 未处理分页,导致重复采集第一页数据

部分国家的结果有多页,若未翻页会重复采集第一页;翻页后未等待加载,也会拿到重复内容。

  • 解决:循环处理分页,直到无下一页
    while True:
        # 采集当前页所有结果
        items = driver.find_elements(By.CSS_SELECTOR, ".red-notice-card")
        for item in items:
            # 提取姓名、年龄、国籍
            name = item.find_element(By.CSS_SELECTOR, ".notice-name").text.strip()
            age = item.find_element(By.CSS_SELECTOR, ".notice-age").text.strip()
            nationality = item.find_element(By.CSS_SELECTOR, ".notice-nationality").text.strip()
            current_results.append({"name": name, "age": age, "nationality": nationality})
        
        # 尝试点击下一页
        try:
            next_btn = WebDriverWait(driver, 6).until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, ".pagination-next:not(.disabled)"))
            )
            next_btn.click()
            # 等待新页面加载(用旧页元素失效作为判断条件)
            WebDriverWait(driver, 10).until(EC.staleness_of(items[0]))
        except:
            # 无下一页,退出循环
            break
    

5. 未添加去重逻辑,导致重复结果

同一人员可能在多个年龄区间出现,或页面重复渲染元素,需要用唯一标识去重。

  • 解决:用通缉令编号作为去重键
    seen_notice_ids = set()
    
    for item in items:
        notice_id = item.find_element(By.CSS_SELECTOR, ".notice-reference").text.strip()
        if notice_id in seen_notice_ids:
            continue
        seen_notice_ids.add(notice_id)
        # 提取其他信息并保存
        # ...
    

额外注意事项

  • 每次操作后添加1-2秒休眠(time.sleep(1)),避免触发网站反爬机制;
  • 定期保存数据,避免程序崩溃丢失内容;
  • 检查元素定位器是否稳定,优先用文本、固定类名或属性,避免依赖动态生成的ID。

内容的提问来源于stack exchange,提问作者Gabriel Beran Ribeiro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:37:04