做推送实用网站网站建设所出现的问题
做推送实用网站,网站建设所出现的问题,网站设计与制作的流程,合肥网站制作套餐背景痛点#xff1a;网页端“看得见却拿不走”的尴尬
做自动化脚本的朋友几乎都踩过同一个坑#xff1a;ChatGPT 网页端把答案漂亮地渲染出来#xff0c;鼠标一划#xff0c;CtrlC 却像失灵了一样。深究下去#xff0c;发现官方在 DOM 层面布了两道“软锁”#xff1a; …背景痛点网页端“看得见却拿不走”的尴尬做自动化脚本的朋友几乎都踩过同一个坑ChatGPT 网页端把答案漂亮地渲染出来鼠标一划CtrlC 却像失灵了一样。深究下去发现官方在 DOM 层面布了两道“软锁”全局copy事件被preventDefault()掉剪贴板直接失效对话气泡外层包了一层user-select:none的 CSS 护甲浏览器默认划词被屏蔽即使强行document.getSelection()也会发现每段回答被拆成零散的span拼接回去时顺序和空格全乱结果就是传统爬虫最爱的innerText/textContent瞬间罢工XPath 拿回来一堆碎片正则拼回去错字连篇。对需要批量沉淀知识库、做结构化数据的开发者来说效率直接打回石器时代。技术方案对比三条路线谁更适合你方案平均成功率平均耗时/条维护成本适用场景Puppeteer/Playwright 重写 DOM 事件92%2.3 s低动态渲染、需要即时交互逆向 REST/GraphQL 端点97%0.8 s高可接受逆向、追求极致速度OCR 截图兜底85%4.1 s中前端加密升级、图片化文字一句话总结想“稳”——选方案1想“快”——选方案2但要随时跟进接口变化想“兜底”——方案3等前端把文字画到canvas时还能救命。核心实现用 Playwright 把“复制”抢回来下面这段代码在 Python 3.8 验证通过逻辑分三步启动浏览器并注入脚本先拆掉copy封锁用模拟人工划词右键菜单的“复制”指令绕过user-select加入随机延迟 异常重试降低被封概率。# pip install playwright1.40.0 import asyncio, random, time, re from playwright.async_api import async_playwright USER_AGENTS [ Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Mozilla/5.0 (Macintosh; Intel Mac OS X 13_4) AppleWebKit/605.1.15 ] async def safe_copy(page, selector, max_retry3): 划词复制返回纯文本 for attempt in range(1, max_retry 1): try: # 1. 随机等待模拟人类 await page.wait_for_timeout(random.randint(300, 700)) # 2. 聚焦回答气泡 await page.click(selector) # 3. 三连击选中全文 await page.click(selector, click_count3, delay80) # 4. 调出右键菜单 await page.click(selector, buttonright) # 5. 点击“复制” await page.keyboard.press(c) # 英文界面快捷键 text await page.evaluate(navigator.clipboard.readText()) if text and len(text) 10: return text except Exception as e: if attempt max_retry: raise RuntimeError(复制失败) from e await asyncio.sleep(1) return async def fetch_answer(prompt: str) - str: async with async_playwright() as p: browser await p.chromium.launch(headlessTrue) context await browser.new_context( user_agentrandom.choice(USER_AGENTS), viewport{width: 1280, height: 800} ) page await context.new_page() # 先干掉 copy 拦截 await page.add_init_script( document.addEventListener(copy, e e.stopImmediatePropagation(), true); ) await page.goto(https://chat.openai.com) # TODO: 自行补充登录/会话恢复逻辑 await page.fill(textarea[placeholder*Send a message], prompt) await page.press(textarea[placeholder*Send a message], Enter) # 等待流式输出完成 await page.wait_for_selector(button[aria-label*Regenerate], timeout30000) # 选最后一条回答 answer_selector .group:nth-last-of-type(1) .markdown text await safe_copy(page, answer_selector) await browser.close() return text if __name__ __main__: print(asyncio.run(fetch_answer(用一句话介绍量子计算)))要点拆解用stopImmediatePropagation把官方preventDefault顶掉比直接重写oncopy更稳划词后通过navigator.clipboard.readText()拿数据避开innerText碎片异常捕获里把max_retry做成参数方便后续在批量任务里动态调整。生产级细节别让“高频”变成“封禁”请求频率实测在 2024.05 的网页版同账号连续提问 25 次后弹验证码。保险策略单账号 ≤ 20 轮/10min随机间隔 8–15 s。User-Agent 轮换上面列表只放两条线上可拉 20 真实 UA配合浏览器指纹插件把navigator.webdriver置空。Cookie 保鲜登录后把__Secure-next-auth.session-token存本地15 分钟刷新一次refreshToken否则接口会突然 401。数据清洗复制回来的文本里常混**、\n\n等 Markdown 符号入库前统一用markdownify转 HTML 再转纯文本可解决 90% 乱码。避坑指南踩过的雷一次说完不要图省事直接querySelector(.markdown).innerText——流式回答还没渲染完就抓回来半截。划词复制偶尔会带多余空格正则re.sub(r\s, , text)压缩一下。若出现“答案被图片化”——前端把文字画到 canvas——立即切 OCR 分支推荐paddleocrCPU 也能 2s 内出结果。多人协作时一定做“会话池”把账号/浏览器实例/代理三元组绑定避免同 IP 多账号高速切换直接撞风控。延伸思考当官方再把墙加高我们还能怎么玩前端如果升级 Shadow DOM 私有 CSS 变量DOM 注入脚本将失效可考虑在浏览器扩展层用devtools protocol截获网络层渲染指令接口若加入sig签名参数需要动态插桩 JSVMP 算法维护成本陡增此时不如直接转官方付费 API成本换稳定合规底线抓取内容再发布需遵守平台 ToS 及版权要求内部知识库场景建议加“仅员工可见”水印避免二次分发风险。性能实测小数据本地 MBP 1410 条问答指标Puppeteer复制逆向 APIOCR 截图成功率92%97%85%平均耗时2.3 s0.8 s4.1 s验证码触发0/100/100/10代码维护量低高中进一步学习 完整代码仓库我把三种方案的完整代码、UA 池、代理轮换都整理到了一个仓库直接克隆就能跑https://github.com/yourname/chatgpt-extract-kit示例链接请替换为自己的仓库如果你只想最快体验“让 AI 开口说话”的爽感又懒得和网页复制斗智斗勇不妨换个思路——直接动手搭一条属于自己的语音通道。我上周就在从0打造个人豆包实时通话AI实验里照着教程 30 分钟跑通了“ASR→豆包大模型→TTS”全链路麦克风一对答案秒级回读比复制粘贴香太多。小白也能顺利体验我这种前端半桶水都能一次点亮推荐试试。