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

使用Playwright爬取eBay平板类优惠商品的代码问题咨询

Playwright爬取eBay平板类优惠商品的代码问题咨询

看起来你在尝试用Playwright爬取eBay平板类优惠商品的信息,但代码里存在一些逻辑问题可能导致执行异常,我来帮你梳理和修正一下:

你的原始代码:

from playwright.sync_api import Playwright, sync_playwright

with sync_playwright() as playwright:
    chromium = playwright.chromium
    browser = chromium.launch()
    context = browser.new_context()
    page = context.new_page()
    page.goto("https://www.ebay.com/deals/tech/ipads-tablets-ereaders")
    button = page.locator("button.load-more-btn.btn.btn--secondary")
    try:
        while button:
            button.scroll_into_view_if_needed()
            button.click()
    except:
        pass
        items = page.locator("div.dne-itemtile.dne-itemtile-large").all()
        for item in items:
            print(item.locator("img").get_attribute("src"))
            print(item.locator("span.first").text_content())
            print(item.locator("span.ebayui-ellipsis-2").text_content())
            print()
        print(len(items), "items")

代码里的核心问题:

  • 循环判断逻辑无效:button是一个Locator对象,永远会被判定为真,会导致无限循环点击按钮,直到抛出异常才会进入后续逻辑,这不是合理的终止方式。
  • 缩进错误:你把爬取商品的代码缩进在了pass之后,这会导致这些代码只有在异常发生时才执行,而且实际缩进层级错误,逻辑会混乱。
  • 缺少加载等待:点击加载更多后,页面需要时间加载新内容,直接循环点击可能会出现按钮还未就绪、新内容未加载完成的情况。

修正后的代码:

from playwright.sync_api import Playwright, sync_playwright, expect

with sync_playwright() as playwright:
    chromium = playwright.chromium
    # 可以设置headless=False方便查看执行过程
    browser = chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()
    page.goto("https://www.ebay.com/deals/tech/ipads-tablets-ereaders", wait_until="domcontentloaded")
    
    # 循环点击加载更多按钮,直到按钮不可见
    while True:
        try:
            # 等待按钮出现并可点击,超时3秒则认为按钮已消失
            load_more_btn = page.locator("button.load-more-btn.btn.btn--secondary")
            expect(load_more_btn).to_be_visible(timeout=3000)
            load_more_btn.scroll_into_view_if_needed()
            load_more_btn.click()
            # 等待新内容加载,也可以用更精准的等待(比如等待商品数量增加)
            page.wait_for_timeout(1000)
        except:
            # 按钮不可见或无法点击时,退出循环
            break
    
    # 爬取所有商品信息
    items = page.locator("div.dne-itemtile.dne-itemtile-large").all()
    print(f"共抓取到 {len(items)} 个商品")
    for index, item in enumerate(items, 1):
        print(f"--- 商品 {index} ---")
        # 获取图片链接
        img_src = item.locator("img").get_attribute("src")
        print(f"图片链接: {img_src if img_src else '无图片链接'}")
        # 获取价格
        price = item.locator("span.first").text_content()
        print(f"价格: {price.strip() if price else '无价格信息'}")
        # 获取商品标题
        title = item.locator("span.ebayui-ellipsis-2").text_content()
        print(f"商品标题: {title.strip() if title else '无标题信息'}")
        print()
    
    context.close()
    browser.close()

关键改进点:

  • 合理终止循环:通过expect判断加载更多按钮是否可见,超时则认为按钮已消失,退出循环,避免无限点击。
  • 修复缩进问题:把爬取商品的代码放在循环之后,确保所有加载操作完成后再执行爬取。
  • 增加等待机制:点击后等待一段时间让页面加载新内容,也可以改用等待商品数量变化的方式,比固定等待更精准。
  • 增加异常兼容:对每个元素的获取增加空值判断,避免个别商品信息缺失导致代码崩溃。
  • 优化输出格式:让商品信息的输出更清晰易读。

如果还有部分商品信息获取不到,可以检查元素选择器是否匹配最新的页面结构,或者调整等待策略哦~

备注:内容来源于stack exchange,提问作者Swelan Auguste

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 08:25:31