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

使用bs4与selenium实现爬虫翻页下载车牌图片代码运行异常求助

代码问题排查

核心逻辑错误

  • 翻页后仍用requests请求固定的第一页URL,永远只能拿到第一页的图片内容,和Selenium翻页后的页面完全无关
  • 图片链接判断逻辑写反:str.find() 匹配到内容返回下标值(>=0,判定为True),未匹配返回-1(判定为False),现有逻辑会跳过所有目标站点的图片,仅下载非目标站点的无关资源
  • 路径逻辑错误:反复调用os.chdir切换工作目录,会导致多层嵌套生成文件夹,后续读写路径全部错乱
  • 图片名计数每次重置:每页下载都从1.jpg开始命名,新下载的图片会直接覆盖旧页的同名文件

翻页逻辑错误

  • 每次循环都重新初始化ChromeDriver,每次都重新加载首页点击对应页码,页码超过页面展示的分页范围后完全找不到对应元素,程序直接崩溃
  • 仅用固定time.sleep等待,页面加载速度波动时大概率出现元素未加载完成就执行查找操作,直接报错
  • 无任何异常捕获逻辑,单页加载失败就会导致整个程序终止运行
修复后代码
import os
import time
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 全局计数,避免图片重名覆盖
global_count = 1

def image_downloader(page_source, folder):
    global global_count
    # 固定用绝对路径,不切换工作目录避免路径错乱
    folder_path = os.path.join(os.getcwd(), folder)
    os.makedirs(folder_path, exist_ok=True)
    
    # 直接用Selenium拿到的当前页源码解析,不用重复发请求
    soup = BeautifulSoup(page_source, 'html.parser')
    images = soup.find_all('img')
    for image in images:
        try:
            link = image['src']
            # 修复判断逻辑:仅下载目标站点的图片
            if 'https://iranpelak.com/' in link:
                img_res = requests.get(link, timeout=10)
                img_path = os.path.join(folder_path, f"{global_count}.jpg")
                with open(img_path, 'wb') as f:
                    f.write(img_res.content)
                print(f"已下载:{global_count}.jpg")
                global_count += 1
        except Exception as e:
            print(f"单张图片下载失败:{e}")
            continue

if __name__ == "__main__":
    save_folder = "car_images"
    # 仅初始化一次Driver
    driver = webdriver.Chrome(r"./chromedriver")
    driver.maximize_window()
    wait = WebDriverWait(driver, 20)
    
    try:
        # 处理第一页
        driver.get("https://iranpelak.com/car-search")
        time.sleep(3)
        image_downloader(driver.page_source, save_folder)
        
        # 翻页处理,最大页数可自行调整
        max_page = 1000
        for page_num in range(2, max_page+1):
            try:
                # 显式等待页码元素加载完成再点击
                page_btn = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, str(page_num))))
                page_btn.click()
                # 等待页面加载完成
                time.sleep(5)
                image_downloader(driver.page_source, save_folder)
                print(f"第{page_num}页处理完成")
            except Exception as e:
                print(f"第{page_num}页处理失败:{e}")
                # 没有更多页码就直接退出循环
                break
    finally:
        driver.quit()
运行前置要求
  • 安装依赖包:pip install requests beautifulsoup4 selenium
  • 下载和本地Chrome浏览器版本匹配的ChromeDriver,放在脚本同级目录下
  • 可根据自身网络情况调整等待时间,遇到反爬限制可适当拉长间隔、添加请求头或代理配置

内容的提问来源于stack exchange,提问作者pickle rick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:27:04