如何让PyQt5等待n秒后再返回完全加载的网页数据
解决方案
你当前代码的loadFinished信号仅触发于页面基础资源加载完成,Cloudflare的前端校验脚本需要额外时间执行完成后才会生成实际可采集的页面内容,因此需要在页面加载完成后添加指定时长的等待,再提取页面HTML。
修改后的代码
from PyQt5.QtCore import QTimer, QEventLoop, QUrl from PyQt5.QtWebEngineWidgets import QWebEngineView # 原有全局APP实例逻辑可保留 def get_html(url, wait_seconds=5): class Render(QWebEngineView): def __init__(self, url, wait_sec): self.html = None self.app = APP.instance() QWebEngineView.__init__(self) self.loadFinished.connect(lambda result: self._on_load_finished(result, wait_sec)) self.load(QUrl(url)) while self.html is None: self.app.processEvents(QEventLoop.ExcludeUserInputEvents | QEventLoop.ExcludeSocketNotifiers | QEventLoop.WaitForMoreEvents) self.app.quit() def _callable(self, data): self.html = data def _on_load_finished(self, result, wait_sec): # 加载完成后等待指定秒数,待Cloudflare校验完成再提取HTML QTimer.singleShot(wait_sec * 1000, lambda: self.page().toHtml(self._callable)) return Render(url, wait_seconds).html
关键说明
- 新增
wait_seconds参数可自定义等待时长,默认5秒,可根据Cloudflare校验实际耗时调整为3-10秒 - 用
QTimer.singleShot实现延迟逻辑不会阻塞Qt事件循环,可保证Cloudflare校验脚本正常执行,不要使用Python原生time.sleep,该方法会阻塞事件循环导致页面渲染停摆,无法完成校验
内容的提问来源于stack exchange,提问作者Mahdi_J
相关产品推荐
相关产品推荐

