如何编写同步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)
关键修正说明
- 移除异步语法:同步Playwright所有方法无需
await,直接调用即可解决原代码的语法错误 - 滚动加载优化:通过循环检测页面高度变化,确保无限滚动的内容全部加载完成,避免漏抓数据
- 完整数据导出:添加表头和数据行的写入逻辑,把提取到的商标数据正确保存到XLSX文件
- 资源管理:执行完毕后关闭浏览器上下文和浏览器,避免资源占用
内容的提问来源于stack exchange,提问作者Sahithi
相关产品推荐
相关产品推荐

