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
相关产品推荐
相关产品推荐

