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

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()

修正说明

  1. 添加显式等待:确保页面元素加载完成后再定位,避免获取空元素列表。
  2. 修正变量名:统一变量命名,避免拼写错误和未定义变量。
  3. 处理动态元素:点击"查看手机号"后等待手机号元素加载,再获取内容;用execute_script点击避免元素遮挡问题。
  4. 异常处理:添加try-except捕获获取手机号时的错误,避免程序中断,同时记录错误信息。
  5. 优化列表操作:用临时变量存储单个数据,再添加到对应的列表中,避免覆盖列表变量。

内容的提问来源于stack exchange,提问作者Poreddy Harini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:00:17