← 返回 Day 130 正文

Day 130 · 图解

Day 130 - Playwright 现代爬虫 图解

1. Selenium vs Playwright 架构

Selenium:                          Playwright:
Python                             Python
  │ W3C HTTP 协议                    │ 驱动进程(pip 自带,一条 install 命令)
  ▼                                  ▼
ChromeDriver(每个浏览器一个)        CDP / 内部协议直连
  ▼                                  ▼
Chrome                              Chromium / Firefox / WebKit
                                    (内核由 playwright install 统一管理,无版本地狱)

2. 自动等待(actionability)流程

graph TD A[locator.click] --> B{元素存在?} B -- 否 --> W[等待 0.1s 重试] W --> B B -- 是 --> C{可见?} C -- 否 --> W C -- 是 --> D{尺寸稳定<br/>动画结束?} D -- 否 --> W D -- 是 --> E{未被遮挡?} E -- 是 --> F[执行点击 ✅] E -- 否 --> W W -.超时(默认30s).-> X[抛 TimeoutException]
graph TD
    A[locator.click] --> B{元素存在?}
    B -- 否 --> W[等待 0.1s 重试]
    W --> B
    B -- 是 --> C{可见?}
    C -- 否 --> W
    C -- 是 --> D{尺寸稳定<br/>动画结束?}
    D -- 否 --> W
    D -- 是 --> E{未被遮挡?}
    E -- 是 --> F[执行点击 ✅]
    E -- 否 --> W
    W -.超时(默认30s).-> X[抛 TimeoutException]

3. BrowserContext 并发模型

             1 个浏览器进程(重,慢启动)
                    │
     ┌──────────────┼──────────────┐
     ▼              ▼              ▼
 Context A      Context B      Context C     (秒级创建,≈无痕窗口)
  UA/UA-A        UA-B           UA-C          各自 Cookie/存储隔离
     │              │              │
   page          page           page          模拟 N 个独立用户并发

4. Locator(惰性+重试) vs WebElement(快照)

Selenium WebElement:  find_element 拿到"引用快照" ──页面刷新──► StaleElementReferenceException 💥

Playwright Locator:   locator() 只是"描述"(CSS/XPath 字符串)
                      ──每次操作时实时查找 + 自动重试──► 永远指向当前 DOM ✅