搜索

python实现简易浏览器

发表于 2026-10-17 06:16:34 来源:烟消火灭网

用Python写一个能打开网页、实现显示内容的简易浏览器,核心代码不到40行。浏览这不是实现开玩笑。PyQt5的简易QWebEngineView组件已经把Chromium内核封装好了,你只需要给它一个窗口、浏览一个地址栏、实现几个按钮,简易剩下的浏览渲染和网络请求它全包了。

先装依赖:pip install PyQt5 PyQtWebEngine。实现注意PyQtWebEngine是简易单独包,光装PyQt5不够。浏览装完之后,实现新建一个browser.py,简易开始写。浏览

导入部分很直接——QApplication管应用生命周期,QMainWindow给主窗口,QLineEdit做地址栏,QPushButton做按钮,QWebEngineView负责渲染网页。布局用QVBoxLayout竖着排,上面一行放地址栏和按钮,下面一大块给网页视图。

import sys from PyQt5.QtCore import QUrl from PyQt5.QtWidgets import (QApplication, QMainWindow, QLineEdit, QPushButton, QVBoxLayout, QWidget, QHBoxLayout) from PyQt5.QtWebEngineWidgets import QWebEngineView class Browser(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("简易浏览器") self.resize(1200, 800) self.view = QWebEngineView() self.view.setUrl(QUrl("https://www.baidu.com")) self.url_bar = QLineEdit() self.url_bar.returnPressed.connect(self.navigate) btn_go = QPushButton("跳转") btn_go.clicked.connect(self.navigate) btn_back = QPushButton("后退") btn_back.clicked.connect(self.view.back) btn_forward = QPushButton("前进") btn_forward.clicked.connect(self.view.forward) top = QHBoxLayout() top.addWidget(btn_back) top.addWidget(btn_forward) top.addWidget(self.url_bar) top.addWidget(btn_go) layout = QVBoxLayout() layout.addLayout(top) layout.addWidget(self.view) container = QWidget() container.setLayout(layout) self.setCentralWidget(container) self.view.urlChanged.connect( lambda q: self.url_bar.setText(q.toString())) def navigate(self): url = self.url_bar.text().strip() if not url.startswith("http"): url = "https://" + url self.view.setUrl(QUrl(url)) app = QApplication(sys.argv) win = Browser() win.show() sys.exit(app.exec_()) 

跑起来看看。python browser.py,窗口弹出来,默认加载百度。地址栏敲个"bilibili.com",回车,页面跳过去。后退前进按钮也能用。整个过程没有手动处理过一个HTTP请求,没解析过一行HTML。

有几个细节值得说。地址栏输入时如果用户没打https://,直接写域名会失败,所以代码里做了补全判断。另外urlChanged信号绑定了地址栏更新——页面内部跳转时,地址栏得跟着变,不然用户看到的URL和实际页面不一致,体验很割裂。

QWebEngineView默认用的是Chromium内核,意味着现代网页的CSS、JavaScript、WebSocket它都支持。但代价是打包体积大,PyQtWebEngine的wheel文件大概60MB起步。如果你只是想做个小工具展示本地HTML,用QTextBrowser就够了,轻量得多。要正经浏览网页,WebEngine是绕不开的选择。

实际用的时候会遇到一个问题:新窗口打开链接。比如点击target="_blank"的链接,默认行为是弹出一个新的QWebEngineView,但你没给它配窗口,它就孤零零地飘着。解决办法是继承QWebEngineView,重写createWindow方法,返回一个新的view实例并把它塞进tab或者新窗口里。这段代码加起来大概20行,但涉及信号槽的嵌套,初学容易绕晕。

还有一个坑:SSL证书错误。某些网站证书过期或者自签名,Chromium默认直接拦截,页面白屏。你需要在QWebEnginePage子类里重写certificateError方法,返回True忽略错误。生产环境当然不该这么干,但自己写工具爬内网系统时,这招能省不少事。

这个浏览器目前没有标签页、没有书签、没有历史记录。加标签页的话,把QWebEngineView放进QTabWidget,每个tab一个view实例,地址栏跟着当前tab走。书签用QListWidget加个持久化文件就行。历史记录更简单,每次urlChanged触发时往SQLite里插一条。

写到这里,一个能用的浏览器骨架已经出来了。它不完美,但足够让你理解浏览器到底在干什么——无非是地址栏、渲染引擎、导航控制三件事。Python的优势在于,你不需要从零实现渲染引擎,PyQt已经把最脏最累的活干完了。剩下的事,就是按你的需求往上堆功能。

随机为您推荐
友情链接
版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright © 2016 Powered by python实现简易浏览器,烟消火灭网   sitemap

回顶部