jueves, 17 de abril de 2014

El navegador de solo 81 lineas

Leía en Ubuntizando un artículo en el que comentaban un navegador web minimalista, escrito en Python y que solo ocupa 81 lineas de código.

Raudo y veloz decidí probarlo, y la verdad, es que el resultado es bastante bueno... aunque tiene su pequeña trampa.


Bueno, en principio la instalación es de lo más simple, solo hay que copiar este código (el original aquí)  en un editor de texto y grabarlo con un nombre como navegador.py
import sys, re
from PyQt4 import QtGui, QtCore, QtWebKit
class PyBrowser(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setWindowTitle('Simple Web Browser')
     
        v_box = QtGui.QVBoxLayout(self)
        #Navigation Bar
        h_bar = QtGui.QHBoxLayout()
        self.previous = QtGui.QPushButton(self.style().standardIcon(QtGui.QStyle.SP_ArrowLeft), '')
        self.next = QtGui.QPushButton(self.style().standardIcon(QtGui.QStyle.SP_ArrowRight), '')
        self.refresh = QtGui.QPushButton(self.style().standardIcon(QtGui.QStyle.SP_BrowserReload), '')
        self.stop = QtGui.QPushButton(self.style().standardIcon(QtGui.QStyle.SP_BrowserStop), '')
        self.url = QtGui.QLineEdit('')
        self.url.setFixedWidth(550)
        self.okUrl = QtGui.QPushButton(self.style().standardIcon(QtGui.QStyle.SP_DialogOkButton), '')
        self.okUrl.setFlat(True)
        h_bar.addWidget(self.previous)
        h_bar.addWidget(self.next)
        h_bar.addWidget(self.refresh)
        h_bar.addWidget(self.stop)
        h_bar.addWidget(self.url)
        h_bar.addWidget(self.okUrl)
        #Page Frame
        self.web = QtWebKit.QWebView()
        self.web.load(QtCore.QUrl('http://www.google.com'))
        #Status Bar
        self.status = QtGui.QStatusBar()
        self.prog = QtGui.QProgressBar()
        self.load = QtGui.QLabel('Loading...')
        self.status.addWidget(self.load)
        self.status.addWidget(self.prog)
        #Add widgets and layout to window
        v_box.addLayout(h_bar)
        v_box.addWidget(self.web)
        v_box.addWidget(self.status)
        #Shortcut
        self.short = QtGui.QShortcut(QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_J), self.url)
        self.connect(self.previous, QtCore.SIGNAL("clicked()"), self.web.back)
        self.connect(self.next, QtCore.SIGNAL("clicked()"), self.web.forward)
        self.connect(self.refresh, QtCore.SIGNAL("clicked()"), self.web.reload)
        self.connect(self.stop, QtCore.SIGNAL("clicked()"), self.web.stop)
        self.connect(self.url, QtCore.SIGNAL("returnPressed()"), self.doSearch)
        self.connect(self.okUrl, QtCore.SIGNAL("clicked()"), self.doSearch)
        self.connect(self.web, QtCore.SIGNAL("loadProgress(int)"), self.progress)
        self.connect(self.web, QtCore.SIGNAL("loadFinished(bool)"), self.loadComplete)
        self.connect(self.web, QtCore.SIGNAL("loadStarted()"), self.status.show)
        self.connect(self.short, QtCore.SIGNAL("activated()"), self.url.setFocus)
    def progress(self, porc):
        self.prog.setValue(porc)
    def openUrl(self, text):
        self.web.setFocus()
        self.web.load(QtCore.QUrl(text))
    def doSearch(self):
        link = self.url.text()
        pat = re.compile('(.+)\\.(.+)')
        patHttp = re.compile('^http://')
        if pat.match(link) and not patHttp.match(link):
            link = 'http://' + link
        elif not pat.match(link):
            link = 'http://www.google.com/search?q=' + link.replace(' ', '+')
        self.openUrl(link)
    def loadComplete(self):
        self.url.setText(self.web.url().toString())
        self.status.hide()

app = QtGui.QApplication(sys.argv)
pybrowser = PyBrowser()
pybrowser.show()
sys.exit(app.exec_())
Y luego, para ejecutar esta pequeña maravilla, basta con ir a la consola y ejecutarlo con
  • python ./navegador.py

Y aquí es donde vienen los peros. Primero, en una instalación limpia me tira el error de que no esta instalado pyqt4. Bien, parece ser que esta escrito en Python y QT4. Eso quiere decir que para poder ejecutarlo tengo que instalar primero pyqt4-dev-tools
  • sudo aptitude install pyqt4-dev-tools

La instalación descargó ni más ni menos que 27 Mb. Así que el navegador “minimalista” ya no lo parece tanto. Ademas, por lo que puede leer, se basa en webkit, pero claro, eso ya suele estar instalado en un equipo de escritorio.

Y esta vez sí, ejecutando de nuevo en la consola python ./navegador.py, obtenemos nuestro navegador, que se muestra bastante rápido y correcto en su funcionamiento.


A disfrutarlo.

5 comentarios:

  1. ¿Usarías este "navegador" para realizar transacciones financieras? Para mi no es más que un frontend para WebKit. En lo personal considero que el concepto de navegador web es mucho más amplio y complejo que el de ser simplemente un renderizador de páginas web. No sé qué opinen ustedes al respecto.

    ResponderEliminar
    Respuestas
    1. Hola.

      Estoy de acuerdo.

      Saludos.

      Eliminar
    2. Si, un navegador, tal como lo entendemos hoy es mucho más... pero al ser más, también hay mas "espacio" para errores o puertas traseras.

      Eliminar
    3. Concuerdo en que un navegador como tal es mucho mas complejo, pero supongamos el caso de un amigo mio, usa demasiado la terminal y no suele hacer transacciones financieras ni nada que demande mucha seguridad, como les digo su chat es en terminal, sus paginas sencillas son en terminal, pero lamentablemente las redes sociales no funcionan en navegadores en terminal (o al menos no conozco uno que si pueda visualizar ciertas cosas en terminal).
      Usar este "navegador" para revisar facebook, G+, y cosas asi me parece bien!!!

      Eliminar
    4. Es lo bueno de Linux, para cada necesidad, para cada forma de usarlo, tienes una manera de hacerlo

      Eliminar

prekes sodui