使用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
相关产品推荐
相关产品推荐

