欢迎访问宙启技术站
智能推送

Python中使用QWebEnginePage()实现网页抓取

发布时间:2023-12-18 03:34:34

在Python中,可以使用QWebEnginePage类实现网页抓取。QWebEnginePage是PyQt5的一个模块,它是一个基于Chromium的网页呈现器,能够加载和渲染网页,并提供了一些方便的方法来操作和获取网页内容。

下面是一个简单的例子,演示了如何使用QWebEnginePage类来抓取网页内容。

from PyQt5.QtCore import QEventLoop, QTimer
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebEngineWidgets import QWebEnginePage
from PyQt5.QtWebEngineCore import QWebEngineSettings


def load_page(url):
    app = QApplication([])

    # 创建一个QWebEnginePage对象
    page = QWebEnginePage()

    # 防止加载网页时弹出安全警告
    settings = QWebEngineSettings.globalSettings()
    settings.setAttribute(QWebEngineSettings.JavascriptEnabled, True)
    settings.setAttribute(QWebEngineSettings.PluginsEnabled, True)
    settings.setAttribute(QWebEngineSettings.JavascriptCanOpenWindows, True)
    settings.setAttribute(QWebEngineSettings.JavascriptCanCloseWindows, True)

    # 将page与app关联
    page.setHtml("<html><body><p>Loading...</p></body></html>", url)

    # 在网页加载完成后,将网页内容保存到文件
    def save_page(result):
        if result:
            with open('page.html', 'w', encoding='utf-8') as f:
                f.write(result)
        else:
            print("Failed to load page!")

        # 退出应用程序
        app.quit()

    # 等待网页加载完成
    def wait_for_page_load(status):
        if status == QWebEnginePage.LoadFinishedStatus:
            QTimer.singleShot(0, lambda: page.toHtml(save_page))

    page.loadFinished.connect(wait_for_page_load)

    # 运行事件循环
    app.exec_()


if __name__ == "__main__":
    load_page("https://www.example.com")

在这个例子中,我们首先创建了一个QApplication对象,并在这个对象上创建了一个QWebEnginePage对象。然后,我们使用QWebEngineSettings来设置一些加载网页时的属性,比如使JavaScript和插件可用。接下来,我们使用setHtml方法将一个正在加载中的HTML内容加载到了QWebEnginePage对象中。然后,我们定义了一个用于保存网页内容到文件的回调函数save_page,并通过QWebEnginePage的toHtml方法将网页内容转化为HTML字符串并保存到文件中。最后,我们使用QTimer和QEventLoop来等待网页加载完成,这样我们就可以获取到完整的网页内容并将其保存到文件。最后,我们使用app.exec_()运行事件循环。

请注意,使用QWebEnginePage抓取网页可能会有一些限制,并且可能需要处理一些Javascript代码、登录验证等问题。但是,使用QWebEnginePage的优点是它能够呈现完整的网页,包括动态内容和交互功能,并且提供了方便的方法获取网页内容。