可以构建一个完全在我的终端上运行的网络浏览器吗?
没有 GUI,
没有 Electron,
只有 Python、套接字和 ANSI 转义码。
结果它教会了我比任何课程都多的HTTP、HTML 解析、TTY 渲染和套接字知识。
关注【索引目录】服务号,更多精彩内容等你来探索!
为什么要这么做?
因为它:
迫使你从原始层面理解 HTTP 请求和响应
教你手动解析 HTML的基础知识
展示如何在没有浏览器引擎的情况下重新创建渲染和布局
非常有趣
另外,当您演示它时,您会看起来就像 90 年代电影中的黑客。
️ 它能做什么(以及不能做什么)
✅ 向任何 URL 发出 GET 请求
✅ 解析 HTML<title>和基本文本内容
✅ 删除脚本、样式和图像
✅ 在终端中呈现带有颜色的纯文本内容
无 CSS 或 JS
无图像或多媒体
无花哨的布局
... 目前还没有。
代码(简化)
让我们分解一下原型的关键部分:
1. 发出原始 HTTP 请求
import requests
url = input("Enter a URL: ")
response = requests.get(url)
html = response.text
2. 剥离并解析内容
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
title = soup.title.string if soup.title else "No Title"
text = soup.get_text()
3. 使用 ANSI magic 进行渲染
from colorama import Fore, Style
print(Fore.CYAN + f"\n== {title} ==" + Style.RESET_ALL)
print(Fore.GREEN + text[:2000] + Style.RESET_ALL) # Truncated for now
奖励:像老板一样将标题居中
import shutil
columns = shutil.get_terminal_size().columns
print(Fore.CYAN + title.center(columns) + Style.RESET_ALL)
轰隆隆——你的终端就变成了一个非常原始的浏览器。
我的惨痛教训
并非所有网站都返回 HTML(
application/json否则text/plain会很快崩溃)UTF-8 编码问题真实存在(而且很奇怪)
许多页面需要用户代理——一些网站会阻止原始 Python 请求
解决方法示例:
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers)
更高层次的想法
接下来您可以采取以下措施:
添加带有输入的导航(例如“按下
n下一个链接”)用于
curses创建可滚动视图添加书签支持或历史记录
尝试以纯文本形式呈现 HTML 表格
你不仅仅是在构建一个浏览器。你正在从头开始构建你的网络思维模型。
为什么你应该尝试一下
大多数开发人员在非常高的层次上与 Web 进行交互——React 组件、API 端点、模板引擎。
这完全颠覆了这一点。你将学到:
浏览器实际上对 HTML做了什么
网络内容是如何构建和传输的
你的终端里
requests到底隐藏着多少能量BeautifulSoup
轮到你了
如果你是一名 Python 开发人员,那么这就是你的挑战:
无需浏览器,即可构建浏览器。
让网络顺应你的终端。
并非因为它有用,而是因为它能让你了解现代工具所隐藏的奥秘。
看看发生什么故障。**

