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

