1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| async def scrape_all_frames(ws, session_id, url): """导航到页面并提取所有 Frame 的内容""" print(f"导航到: {url}") await cdp(ws, session_id, "Page.navigate", {"url": url}) await asyncio.sleep(3) tree = await get_frame_tree(ws, session_id) frames = list_frames(ws, session_id, tree) print(f"发现 {len(frames)} 个 Frame:") for f in frames: print(f" [{f['id'][:12]}...] {f['name'] or '(unnamed)'} - {f['url'][:60]}") data = {} for f in frames: fid = f["id"] try: title_result = await cdp(ws, session_id, "Runtime.evaluate", { "expression": "document.title", "uniqueContextId": fid }) title = title_result.get("result", {}).get("value", "") links_result = await cdp(ws, session_id, "Runtime.evaluate", { "expression": "Array.from(document.querySelectorAll('a')).map(a => ({href: a.href, text: a.textContent.trim().substring(0, 50)}))", "uniqueContextId": fid, "returnByValue": True }) links = links_result.get("result", {}).get("value", []) data[fid] = { "url": f["url"], "title": title, "links_count": len(links), "links": links[:10] } except Exception as e: data[fid] = {"url": f["url"], "error": str(e)} return data
async def wait_for_iframe(ws, session_id, selector, timeout=15): """等待特定 iframe 加载完成""" start = asyncio.get_event_loop().time() while (asyncio.get_event_loop().time() - start) < timeout: result = await cdp(ws, session_id, "Runtime.evaluate", { "expression": f"!!document.querySelector('{selector}')", "returnByValue": True }) if result.get("result", {}).get("value"): tree = await get_frame_tree(ws, session_id) frames = list_frames(ws, session_id, tree) if len(frames) > 1: print(f"iframe 已加载,共 {len(frames)} 个 Frame") return frames[1] await asyncio.sleep(1) print(f"超时:未找到 iframe ({selector})") return None
|