Playwright Python爬取LeetCode结果不一致,如何确保100%准确?
解决LeetCode题目爬取结果不稳定的问题
你的代码出现重复内容或空结果的核心原因是没有等待页面内容完全加载/更新就执行元素查询,依赖slow_mo只是靠延迟“碰运气”,无法应对网络波动或页面渲染差异。以下是确保100%准确的修改方案:
关键修复点
- 用显式等待替代固定延迟,确保元素可交互、页面内容更新后再操作
- 点击下一页后,等待页面内容发生变化(而非直接读取)
- 确保每一步操作都等待目标状态达成
修改后的完整代码
from playwright.sync_api import sync_playwright with sync_playwright() as p: count = 1 browser = p.chromium.launch() # 移除slow_mo,改用显式等待更可靠 page = browser.new_page() # 等待页面完全加载(网络请求趋于稳定) page.goto("https://leetcode.com/problemset/all/", wait_until="networkidle") # 等待Lists按钮可见后点击 lists_btn = page.get_by_role("button", name="Lists") lists_btn.wait_for(state="visible") lists_btn.click() # 等待Top 100列表选项可见后点击,并等待页面切换完成 top_100_btn = page.get_by_text("Top 100 Liked Questions") top_100_btn.wait_for(state="visible") top_100_btn.click() # 等待第一页题目元素加载完成后再开始循环 page.wait_for_selector("a.h-5", state="attached") while True: print(f'\nPage {count}\n') count += 1 # 确保当前页所有题目元素已加载 page.wait_for_selector("a.h-5", state="attached") nodes = page.query_selector_all("a.h-5") for node in nodes: print(node.inner_text()) # 处理下一页逻辑 next_btn = page.get_by_label("next", exact=True) if next_btn.is_enabled(): current_question_count = len(nodes) next_btn.click() # 等待新页面题目数量变化(确保内容已更新) page.wait_for_function( f"() => document.querySelectorAll('a.h-5').length !== {current_question_count}" ) else: break browser.close()
代码说明
wait_until="networkidle":确保页面初始加载完成,网络请求基本停止后再执行后续操作wait_for(state="visible"):确保按钮可见且可交互,避免因元素未渲染导致的无效点击page.wait_for_selector:等待题目元素挂载到DOM后再查询,避免获取空结果wait_for_function:点击下一页后,等待题目数量变化,确保新页面内容已渲染完成,彻底避免重复读取上一页内容
内容的提问来源于stack exchange,提问作者Imran Ahmad
相关产品推荐
相关产品推荐

