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

如何用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,提问作者程家乐

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:02:56