如何用Python从Lazada指定店铺批量提取商品名称与价格?
从Lazada马来西亚Guardian店铺批量提取商品名称与价格
所需工具与依赖
- Python 3.8+(M1 Mac原生支持,无需Rosetta)
- 依赖库:
playwright(处理动态渲染页面)、pandas(数据导出)
先安装依赖:
pip install playwright pandas playwright install chromium
注:
playwright会自动适配M1 Mac的arm架构chromium,无需额外配置。
核心代码实现
这个方案针对Lazada的动态渲染页面设计,能解决静态请求拿不到数据的问题:
import asyncio from playwright.async_api import async_playwright import pandas as pd import random async def scrape_lazada_guardian(): # 存储所有商品数据 products = [] total_pages = 102 async with async_playwright() as p: # 启动浏览器,无头模式可改为False查看实际操作 browser = await p.chromium.launch(headless=True, args=["--disable-blink-features=AutomationControlled"]) context = await browser.new_context( user_agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" ) page = await context.new_page() for page_num in range(1, total_pages + 1): # 构造当前页URL url = f"https://www.lazada.com.my/guardian/?q=All-Products&from=wangpu&langFlag=en&pageTypeId=2&page={page_num}" try: await page.goto(url, wait_until="networkidle") # 随机延迟避免反爬 await asyncio.sleep(random.uniform(2, 5)) # 提取商品名称和价格(需根据实际页面元素调整选择器) # 打开浏览器F12,右键元素复制CSS选择器替换以下内容 product_names = await page.locator("div.RfADt").all_text_contents() product_prices = await page.locator("span.mhWLw").all_text_contents() # 配对数据并存储 for name, price in zip(product_names, product_prices): products.append({ "商品名称": name.strip(), "价格": price.strip(), "页码": page_num }) print(f"已完成第 {page_num} 页,提取 {len(product_names)} 个商品") except Exception as e: print(f"第 {page_num} 页提取失败: {str(e)}") # 重试一次 await asyncio.sleep(3) try: await page.goto(url, wait_until="networkidle") product_names = await page.locator("div.RfADt").all_text_contents() product_prices = await page.locator("span.mhWLw").all_text_contents() for name, price in zip(product_names, product_prices): products.append({ "商品名称": name.strip(), "价格": price.strip(), "页码": page_num }) print(f"第 {page_num} 页重试成功") except Exception as retry_e: print(f"第 {page_num} 页重试失败: {str(retry_e)}") await browser.close() # 导出数据到CSV df = pd.DataFrame(products) df.to_csv("lazada_guardian_products.csv", index=False, encoding="utf-8-sig") print(f"数据导出完成,共 {len(products)} 个商品,文件:lazada_guardian_products.csv") if __name__ == "__main__": asyncio.run(scrape_lazada_guardian())
关键注意事项
- 选择器调整:代码中的
div.RfADt和span.mhWLw是示例选择器,实际需打开Lazada页面,用浏览器开发者工具定位商品名称、价格的元素,替换为正确的CSS选择器。 - 反爬应对:
- 保留随机延迟,避免短时间大量请求触发验证码
- 若遇到验证码,可将
headless=True改为False,手动完成验证后继续运行 - 频繁被拦截时,可添加代理IP(需自行配置)
- M1 Mac适配:
playwright安装的chromium是原生arm版本,无需额外设置,直接运行即可。
内容的提问来源于stack exchange,提问作者程家乐
相关产品推荐
相关产品推荐

