爬取Daraz分类时,如何回退循环并更新变量直至满足条件?
爬取Daraz Bangladesh嵌套分类时处理空一级子类的实现方案
问题场景
爬取https://www.daraz.com.bd/的父分类及嵌套子分类,采用三层循环结构:
- 第一层循环:遍历所有主分类
- 第二层循环:遍历主分类下的一级子类
- 第三层循环:遍历一级子类下的二级子类
当前需求:当获取到的一级子类文本sub_cat_1为空或None时,递增CSS选择器中.Level_1_Category_No{num}的数字(比如从1改为2),更新一级子类列表后重新执行第二层循环。
实现步骤
- 在主分类循环内部初始化一级分类计数器
level1_num,初始值为1,用于动态生成CSS选择器。 - 使用
while循环包裹一级子类的获取与遍历逻辑,直到获取到有效的非空一级子类列表。 - 遍历一级子类时,若发现空文本项,立即递增计数器,重新获取一级子类列表并重置循环。
- 修正原代码中
if条件的语法错误,用if not sub_cat_1:统一判断空文本或None的情况。
修改后的完整代码
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By import time import csv driver = webdriver.Chrome() # 需确保已配置ChromeDriver路径 driver.get("https://www.daraz.com.bd/") time.sleep(10) main_category = driver.find_elements(By.CSS_SELECTOR, '.lzd-site-menu-root-item span') with open("all_category_subcat.csv", "w", encoding="utf-8", newline="") as f: writer = csv.writer(f) writer.writerow(["Main Category", "Sub Category 1", "Sub Category 2"]) for i in main_category: hover = ActionChains(driver).move_to_element(i) hover.perform() main_cat = i.text print(main_cat) level1_num = 1 # 初始化一级分类计数器 while True: # 动态生成CSS选择器 sub_category_one = driver.find_elements(By.CSS_SELECTOR, f".Level_1_Category_No{level1_num} .lzd-site-menu-sub-item > a span") has_empty = False # 标记是否存在空文本项 for y in sub_category_one: hover = ActionChains(driver).move_to_element(y) hover.perform() sub_cat_1 = y.text.strip() # 去除首尾空白,避免空白字符被误判为非空 print("--------------", sub_cat_1, "--------------") if not sub_cat_1: has_empty = True break # 跳出当前一级子类循环,准备更新选择器 # 若一级子类有效,继续爬取二级子类 sub_category_two = driver.find_elements(By.CSS_SELECTOR, ".lzd-site-menu-grand-active span") for z in sub_category_two: sub_cat_2 = z.text.strip() print(sub_cat_2) writer.writerow([main_cat, sub_cat_1, sub_cat_2]) if not has_empty: break # 没有空项,退出while循环,进入下一个主分类 # 存在空项,递增计数器,重新获取一级子类列表 level1_num += 1 print(f"发现空一级子类,更新选择器为Level_1_Category_No{level1_num}") driver.quit()
关键说明
- 用f-string动态生成CSS选择器,实现计数器的替换
- 加入
strip()处理文本,避免空白字符导致的误判 - 通过
has_empty标记控制是否需要更新选择器重新循环 - 用
while True循环实现"更新-重试"的逻辑,直到获取到有效的一级子类列表
内容的提问来源于stack exchange,提问作者boyenec
相关产品推荐
相关产品推荐

