如何用Selenium获取无href属性的Wallapop商品链接以爬取详情?
解决Wallapop商品无href时获取详情页数据的方法
方法一:直接用Selenium点击商品元素
既然已经在用Selenium处理页面导航,最直接的方式是定位商品卡片元素,模拟点击进入详情页,提取数据后再返回列表页继续处理。
步骤:
- 用Selenium加载目标搜索页,等待商品列表渲染完成(推荐用
WebDriverWait显式等待,避免因页面未加载完全导致元素定位失败) - 定位所有商品的容器元素(比如截图中的商品卡片,通常是带特定类名的
div或article标签) - 遍历元素时注意:每次循环都要重新获取元素列表,避免页面刷新后元素引用失效;如果点击无反应,可先通过JS滚动到元素位置再点击
- 进入详情页后,用Selenium或BeautifulSoup提取所需数据
- 调用
driver.back()返回列表页,重复上述流程
示例代码片段:
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 import time import random driver = webdriver.Chrome() driver.get("https://es.wallapop.com/app/search?keywords=monitor&filters_source=search_box&latitude=39.46895&longitude=-0.37686") wait = WebDriverWait(driver, 10) # 等待商品列表加载完成,替换为实际的商品卡片类名 wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "ItemCard"))) # 用索引循环避免元素失效 item_count = len(driver.find_elements(By.CLASS_NAME, "ItemCard")) for i in range(item_count): items = driver.find_elements(By.CLASS_NAME, "ItemCard") current_item = items[i] # 滚动到元素位置再点击 driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", current_item) time.sleep(random.uniform(0.5, 1.5)) current_item.click() # 提取详情页数据,示例:获取标题和价格 wait.until(EC.presence_of_element_located((By.TAG_NAME, "h1"))) title = driver.find_element(By.TAG_NAME, "h1").text price = driver.find_element(By.CLASS_NAME, "ItemPrice").text print(f"标题:{title},价格:{price}") # 返回列表页并等待加载 driver.back() wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "ItemCard"))) time.sleep(random.uniform(1, 2)) driver.quit()
方法二:提取商品data属性构造详情链接
Wallapop的商品卡片通常会在元素上存储data-item-id这类属性,你可以提取该ID拼接成详情页URL,直接用Selenium访问。
步骤:
- 用Selenium获取页面源码,传给BeautifulSoup解析
- 遍历商品元素,提取
data-item-id值 - 构造详情页URL(格式一般为
https://es.wallapop.com/item/[商品ID]) - 直接访问构造好的URL,提取详情数据
示例代码片段:
from selenium import webdriver from bs4 import BeautifulSoup import time import random driver = webdriver.Chrome() driver.get("https://es.wallapop.com/app/search?keywords=monitor&filters_source=search_box&latitude=39.46895&longitude=-0.37686") driver.implicitly_wait(10) page_source = driver.page_source soup = BeautifulSoup(page_source, "html.parser") # 遍历商品卡片,替换为实际的标签和类名 for item_card in soup.find_all("div", class_="ItemCard"): item_id = item_card.get("data-item-id") if not item_id: continue detail_url = f"https://es.wallapop.com/item/{item_id}" driver.get(detail_url) # 提取详情数据 wait = WebDriverWait(driver, 10) title = wait.until(EC.presence_of_element_located((By.TAG_NAME, "h1"))).text print(title) driver.back() time.sleep(random.uniform(1, 2)) driver.quit()
关键注意事项
- 反爬规避:Wallapop有反爬机制,频繁操作易触发验证或IP封禁,建议添加随机延迟、使用代理池,模拟真实用户的操作间隔
- 元素定位适配:需根据页面实际HTML结构调整定位器(类名、data属性等),可通过浏览器开发者工具查看元素详情
- 滚动加载处理:如果商品列表是滚动加载更多,需先模拟滚动到底部加载完所有商品,再进行遍历
内容的提问来源于stack exchange,提问作者SkyManu
相关产品推荐
相关产品推荐

