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

如何编写同步Playwright代码爬取WIPO美国商标并滚动至页底

WIPO美国商标数据同步爬取与导出解决方案

原代码核心问题

  • 同步Playwright函数里误用了异步的await关键字,直接导致语法错误
  • 滚动逻辑没有等待页面加载,可能抓不到完整数据
  • 缺少数据提取和写入XLSX的完整逻辑

修正后的完整代码

from playwright.sync_api import Playwright, sync_playwright
import bs4
import xlsxwriter
import time

def run(playwright: Playwright) -> None:
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()

    # 访问WIPO全球商标数据库
    print('访问WIPO全球商标数据库')
    page.goto("https://branddb.wipo.int/branddb/en/#")

    # 筛选美国商标
    page.locator("text=US TM").click()
    page.locator("#source_filter a[role=\"button\"]:has-text(\"filter\")").click()
    # 等待筛选结果加载完成
    page.wait_for_load_state("networkidle")

    row = 0
    for i in range(1, 1001): 
        workbook = xlsxwriter.Workbook(f"{i}.xlsx")
        worksheet = workbook.add_worksheet()

        # 滚动加载所有内容(适配无限滚动)
        last_height = page.evaluate("document.body.scrollHeight")
        while True:
            # 滚动到当前页面底部
            page.evaluate("window.scrollTo(0, document.body.scrollHeight);")
            # 等待内容渲染,可根据网络情况调整时长
            time.sleep(2)
            # 检查滚动后页面高度是否变化,判断是否加载完成
            new_height = page.evaluate("document.body.scrollHeight")
            if new_height == last_height:
                break
            last_height = new_height

        # 解析页面表格数据
        soup = bs4.BeautifulSoup(page.content(), 'lxml')
        tr_list = soup.findAll('tr', {'role': 'row'})
        
        if tr_list:
            # 写入表头
            header_cells = tr_list[0].findAll('th')
            for col, header in enumerate(header_cells):
                worksheet.write(row, col, header.get_text(strip=True))
            row += 1

            # 写入每一行数据
            for tr in tr_list[1:]:
                cells = tr.findAll('td')
                for col, cell in enumerate(cells):
                    worksheet.write(row, col, cell.get_text(strip=True))
                row += 1

        # 关闭当前工作簿
        workbook.close()

        # 若有分页,可添加跳转到下一页的逻辑(示例)
        # if page.locator("text=Next").is_enabled():
        #     page.locator("text=Next").click()
        #     page.wait_for_load_state("networkidle")
        #     row = 0
        # else:
        #     break

    # 清理浏览器资源
    context.close()
    browser.close()

# 启动Playwright同步环境
with sync_playwright() as playwright:
    run(playwright)

关键修正说明

  1. 移除异步语法:同步Playwright所有方法无需await,直接调用即可解决原代码的语法错误
  2. 滚动加载优化:通过循环检测页面高度变化,确保无限滚动的内容全部加载完成,避免漏抓数据
  3. 完整数据导出:添加表头和数据行的写入逻辑,把提取到的商标数据正确保存到XLSX文件
  4. 资源管理:执行完毕后关闭浏览器上下文和浏览器,避免资源占用

内容的提问来源于stack exchange,提问作者Sahithi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 15:24:21