83 lines
3.3 KiB
Markdown
83 lines
3.3 KiB
Markdown
|
|
这个任务非常适合用 **Playwright** 来实现,因为它对页面加载的等待机制非常智能。
|
|||
|
|
|
|||
|
|
为了保持代码的健壮性,我为你编写了一个独立的脚本。它遵循了我们之前规划的逻辑:**启动浏览器 -> 模拟输入 -> 触发搜索 -> 等待结果渲染 -> 全屏截图**。
|
|||
|
|
|
|||
|
|
### 🐍 Python 自动化脚本实现
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
import os
|
|||
|
|
import time
|
|||
|
|
from playwright.sync_api import sync_playwright
|
|||
|
|
from datetime import datetime
|
|||
|
|
|
|||
|
|
def search_baidu_and_screenshot(keyword="java教程"):
|
|||
|
|
# 1. 准备截图目录
|
|||
|
|
save_dir = f"./data/screenshots/{datetime.now().strftime('%Y-%m-%d')}"
|
|||
|
|
if not os.path.exists(save_dir):
|
|||
|
|
os.makedirs(save_dir)
|
|||
|
|
|
|||
|
|
file_path = os.path.join(save_dir, f"baidu_search_{keyword}.png")
|
|||
|
|
|
|||
|
|
with sync_playwright() as p:
|
|||
|
|
# 启动浏览器 (headless=False 可以让你看到操作过程)
|
|||
|
|
print("[*] 正在启动 Chromium 浏览器...")
|
|||
|
|
browser = p.chromium.launch(headless=False)
|
|||
|
|
context = browser.new_context(viewport={'width': 1280, 'height': 800})
|
|||
|
|
page = context.new_page()
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
# 2. 访问百度
|
|||
|
|
print(f"[*] 正在访问百度...")
|
|||
|
|
page.goto("https://www.baidu.com", wait_until="networkidle")
|
|||
|
|
|
|||
|
|
# 3. 定位搜索框并输入关键字
|
|||
|
|
# 百度搜索框的 ID 通常是 'kw'
|
|||
|
|
print(f"[*] 输入搜索关键词: {keyword}")
|
|||
|
|
page.fill("#kw", keyword)
|
|||
|
|
|
|||
|
|
# 4. 点击“百度一下”按钮
|
|||
|
|
# 百度搜索按钮的 ID 通常是 'su'
|
|||
|
|
page.click("#su")
|
|||
|
|
|
|||
|
|
# 5. 等待搜索结果加载
|
|||
|
|
# 我们等待结果列表容器出现,确保内容不是空白
|
|||
|
|
print("[*] 等待搜索结果渲染...")
|
|||
|
|
page.wait_for_selector("#content_left", timeout=10000)
|
|||
|
|
|
|||
|
|
# 稍微额外等待一下,让图片或样式加载更完整
|
|||
|
|
time.sleep(2)
|
|||
|
|
|
|||
|
|
# 6. 截图并保存
|
|||
|
|
print(f"[*] 正在保存截图至: {file_path}")
|
|||
|
|
page.screenshot(path=file_path, full_page=True)
|
|||
|
|
print("[√] 任务完成!")
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"[!] 操作过程中发生错误: {e}")
|
|||
|
|
# 发生错误时截取当前页面备查
|
|||
|
|
page.screenshot(path=os.path.join(save_dir, "error_state.png"))
|
|||
|
|
|
|||
|
|
finally:
|
|||
|
|
browser.close()
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
search_baidu_and_screenshot("java教程")
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 💡 开发要点解析:
|
|||
|
|
|
|||
|
|
1. **选择器 (Selectors)**:
|
|||
|
|
* 百度搜索框的 ID 是 `#kw`。
|
|||
|
|
* 百度搜索按钮的 ID 是 `#su`。
|
|||
|
|
* 搜索结果的主体容器 ID 是 `#content_left`。使用 `wait_for_selector` 是为了防止在页面还没跳转完就执行截图。
|
|||
|
|
2. **全屏截图 (`full_page=True`)**:
|
|||
|
|
* 这个参数非常有用,它会自动滚动页面并拼接,将整个搜索结果列表(包括滚动条下方的内容)完整保存下来。
|
|||
|
|
3. **视口设置 (`viewport`)**:
|
|||
|
|
* 设置固定的分辨率可以保证不同环境下截图的一致性,方便后续交给 **Umi-OCR** 进行固定区域的文字识别。
|
|||
|
|
4. **环境准备**:
|
|||
|
|
如果你还没有安装 Playwright 运行环境,请执行以下命令:
|
|||
|
|
```bash
|
|||
|
|
pip install playwright
|
|||
|
|
playwright install chromium
|
|||
|
|
```
|