Selenium爬取Indiamart无输出问题求助(附代码)
解决Selenium爬取Indiamart无输出的问题
你的代码存在多处变量错误、元素操作逻辑问题,导致无法获取数据,以下是具体问题和修正方案:
代码中的核心问题
- 变量名错误
- 定义了
company_names,但循环里写成了comapany_names(拼写错误),还引用了未定义的names,直接导致循环条件不成立,列表始终为空。 namelist.append(names)里的names未定义,应该添加循环中获取的name变量。
- 定义了
- 列表操作错误
view_mobilenumber是元素列表,不能直接调用click(),需通过索引定位单个元素:view_mobilenumber[i].click()。- 循环中把
addresslist(列表)重赋值为字符串address[i].text,后续调用append会报错,需改用临时变量存储地址再添加到列表。
- 动态元素未处理
- 页面加载后元素可能未渲染完成,直接
find_elements会获取空列表;点击"查看手机号"后,手机号是动态加载的,需要等待元素加载后再获取。 contactlist是点击后才显示的元素,提前定位会得到空列表,应在点击后再定位当前条目手机号。
- 页面加载后元素可能未渲染完成,直接
修正后的代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pandas as pd import time # 设置ChromeDriver服务 service = Service(r'C:\Users\vamsi\OneDrive\Documents\Selenium\chromedriver.exe') driver = webdriver.Chrome(service=service) driver.get("https://dir.indiamart.com/impcat/boneless-chicken.html") driver.maximize_window() # 等待页面元素加载,显式等待10秒 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.XPATH, '//h2[@class="lcname"]'))) # 定位元素 company_names = driver.find_elements(By.XPATH, '//h2[@class="lcname"]') addresses = driver.find_elements(By.XPATH, '//p[@class="sm clg"]') view_btns = driver.find_elements(By.XPATH, '//a[@class="mo viewn vmn"]') namelist = [] addresslist = [] numberlist = [] # 取最小长度避免索引越界 min_length = min(len(company_names), len(addresses), len(view_btns)) for i in range(min_length): # 获取公司名称 name = company_names[i].text namelist.append(name) # 获取地址 addr = addresses[i].text addresslist.append(addr) # 点击查看手机号,处理可能的元素遮挡 try: driver.execute_script("arguments[0].click();", view_btns[i]) # 等待手机号元素加载 contact_elem = wait.until(EC.presence_of_element_located((By.XPATH, f'(//span[@class="pns-h duet"])[{i+1}]'))) contact = contact_elem.get_attribute("innerHTML") numberlist.append(contact) except Exception as e: # 点击失败或未获取到手机号时添加空值 numberlist.append(None) print(f"第{i+1}条数据获取手机号失败: {e}") time.sleep(1) # 避免频繁操作被反爬 # 构建DataFrame data = {'company_names': namelist, 'address': addresslist, 'contactlist': numberlist} df = pd.DataFrame(data) print(df) driver.quit()
修正说明
- 添加显式等待:确保页面元素加载完成后再定位,避免获取空元素列表。
- 修正变量名:统一变量命名,避免拼写错误和未定义变量。
- 处理动态元素:点击"查看手机号"后等待手机号元素加载,再获取内容;用
execute_script点击避免元素遮挡问题。 - 异常处理:添加try-except捕获获取手机号时的错误,避免程序中断,同时记录错误信息。
- 优化列表操作:用临时变量存储单个数据,再添加到对应的列表中,避免覆盖列表变量。
内容的提问来源于stack exchange,提问作者Poreddy Harini
相关产品推荐
相关产品推荐

