Начальная

Windows Commander

Far
WinNavigator
Frigate
Norton Commander
WinNC
Dos Navigator
Servant Salamander
Turbo Browser

Winamp, Skins, Plugins
Необходимые Утилиты
Текстовые редакторы
Юмор

File managers and best utilites

Python в браузере: как выбрать между Brython, PyPy.js, Skulpt и Transcrypt? Браузер на python


Пишем Webkit браузер на Python

In this tutorial we’ll create simple web browser using Python PyQt framework. As you may know PyQt is a set of Python bindings for Qt framework, and Qt (pronounced cute) is C++ framework used to create GUI-s. To be strict you can use Qt to develop programs without GUI too, but developing user interfaces is probably most common thing people do with this framework. Main benefit of Qt is that it allows you to create GUI-s that are cross platform, your apps can run on various devices using native capabilities of each platform without changing your codebase.

Qt comes with a port of webkit, which means that you can create webkit-based browser in PyQt.

Our browser will do following things:

  • load urls entered by user into input box
  • show all requests performed while rendering the page
  • allow you to execute custom JavaScript in page context

Hello Webkit

Let’s start with simplest possible use case of PyQt Webkit: loading some url, opening window and rendering page in this window.

This is trivial to do, and requires around 13 lines of code (with imports and whitespace):

import sys from PyQt4.QtWebKit import QWebView from PyQt4.QtGui import QApplication from PyQt4.QtCore import QUrl app = QApplication(sys.argv) browser = QWebView() browser.load(QUrl(sys.argv[1])) browser.show() app.exec_()

If you pass url to script from command line it should load this url and show rendered page in window.

At this point you maybe have something looking like command line browser, which is already better than python-requests or even Lynx because it renders JavaScript. But it’s not much better than Lynx because you can only pass urls from command line when you invoke it. We definitely need some way of passing urls to load to our browser.

Add address bar

To do this we’ll just add input box at the top of the window, user will type url into text box, browser will load this url. We will use QLineEdit widget for input box. Since we will have two elements (text input and browser frame), we’ll need to add some grid layout to our app.

import sys from PyQt4.QtGui import QApplication from PyQt4.QtCore import QUrl from PyQt4.QtWebKit import QWebView from PyQt4.QtGui import QGridLayout, QLineEdit, QWidget class UrlInput(QLineEdit): def __init__(self, browser): super(UrlInput, self).__init__() self.browser = browser # add event listener on "enter" pressed self.returnPressed.connect(self._return_pressed) def _return_pressed(self): url = QUrl(self.text()) # load url into browser frame browser.load(url) if __name__ == "__main__": app = QApplication(sys.argv) # create grid layout grid = QGridLayout() browser = QWebView() url_input = UrlInput(browser) # url_input at row 1 column 0 of our grid grid.addWidget(url_input, 1, 0) # browser frame at row 2 column 0 of our grid grid.addWidget(browser, 2, 0) # main app window main_frame = QWidget() main_frame.setLayout(grid) main_frame.show() # close app when user closes window sys.exit(app.exec_())

At this point you have bare-bones browser that shows some resembrance to Google Chrome and it uses same rendering engine. You can enter url into input box and your app will load url into browser frame and render all HTML and JavaScript.

Of course the most interesting and important part of every browser are its dev tools. Every browser worth its name should have its developer console. Our Python browser should have some developer tools too.

Let’s add something similar to Chrome “network” tab in dev tools. We will simply keep track of all requests performed by browser engine while rendering page. Requests will be shown in table below main browser frame, for simplicity we will only log url, status code and content type of responses.

Do do this we will need to create a table first, we’ll use QTableWidget for that, header will contain field names, it will auto-resize each time new row is added to table.

class RequestsTable(QTableWidget): header = ["url", "status", "content-type"] def __init__(self): super(RequestsTable, self).__init__() self.setColumnCount(3) self.setHorizontalHeaderLabels(self.header) header = self.horizontalHeader() header.setStretchLastSection(True) header.setResizeMode(QHeaderView.ResizeToContents) def update(self, data): last_row = self.rowCount() next_row = last_row + 1 self.setRowCount(next_row) for col, dat in enumerate(data, 0): if not dat: continue self.setItem(last_row, col, QTableWidgetItem(dat))

To keep track of all requests we’ll need to get bit deeper into PyQt internals. Turns out that Qt exposes NetworkAccessManager class as an API allowing you to perform and monitor requests performed by application. We will need to subclass NetworkAccessManager, add event listeners we need, and tell our webkit view to use this manager to perform its requests.

First let’s create our network access manager:

class Manager(QNetworkAccessManager): def __init__(self, table): QNetworkAccessManager.__init__(self) # add event listener on "load finished" event self.finished.connect(self._finished) self.table = table def _finished(self, reply): """Update table with headers, status code and url. """ headers = reply.rawHeaderPairs() headers = {str(k):str(v) for k,v in headers} content_type = headers.get("Content-Type") url = reply.url().toString() # getting status is bit of a pain status = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) status, ok = status.toInt() self.table.update([url, str(status), content_type])

I have to say that some things in Qt are not as easy and quick as they should be. Note how awkward it is to get status code from response. You have to use response method .attribute() and pass reference to class property of request. This returns QVariant not int and when you convert to int it returns tuple.

Now finally we have a table and a network access manager. We just need to wire all this together.

if __name__ == "__main__": app = QApplication(sys.argv) grid = QGridLayout() browser = QWebView() url_input = UrlInput(browser) requests_table = RequestsTable() manager = Manager(requests_table) # to tell browser to use network access manager # you need to create instance of QWebPage page = QWebPage() page.setNetworkAccessManager(manager) browser.setPage(page) grid.addWidget(url_input, 1, 0) grid.addWidget(browser, 2, 0) grid.addWidget(requests_table, 3, 0) main_frame = QWidget() main_frame.setLayout(grid) main_frame.show() sys.exit(app.exec_())

Now fire up your browser, enter url into input box and enjoy the view of all requests filling up table below webframe.

If you have some spare time you could add lots of new functionality here:

  • add filters by content-type
  • add sorting to table
  • add timings
  • highlight requests with errors (e.g. show them in red)
  • show more info about each request - all headers, response content, method
  • add option to replay requests and load them into browser frame, e.g. user clicks on request in table and this url is loaded into browser.

This is long TODO list and it would be probably interesting learning exercise to do all these things, but describing all of them would probably require to write quite a long book.

Add way to evaluate custom JavaScript

Finally let’s add one last feature to our experimental browser - ability to execute custom JavaScipt in page context.

After everything we’ve done earlier this one comes rather easily, we just add another QLineEdit widget, connect it to web page object, and call evaluateJavaScript method of page frame.

class JavaScriptEvaluator(QLineEdit): def __init__(self, page): super(JavaScriptEvaluator, self).__init__() self.page = page self.returnPressed.connect(self._return_pressed) def _return_pressed(self): frame = self.page.currentFrame() result = frame.evaluateJavaScript(self.text())

then we instantiate it in our main clause and voila our dev tools are ready.

if __name__ == "__main__": # ... # ... page = QWebPage() # ... js_eval = JavaScriptEvaluator(page) grid.addWidget(url_input, 1, 0) grid.addWidget(browser, 2, 0) grid.addWidget(requests_table, 3, 0) grid.addWidget(js_eval, 4, 0)

Now the only thing missing is ability to execute Python in page context. You could probably develop your browser and add support for Python along JavaScript so that devs writing apps targeting your browser could.

Moving back and forth, other page actions

Since we already connected our browser to QWebPage object we can also add other actions important for end users. Qt web page object supports lots of different actions and you can add them all to your app.

For now let’s just add support for “back”, “forward” and “reload”. You could add those actions to our GUI by adding buttons, but it will be easier to just add another text input box.

class ActionInputBox(QLineEdit): def __init__(self, page): super(ActionInputBox, self).__init__() self.page = page self.returnPressed.connect(self._return_pressed) def _return_pressed(self): frame = self.page.currentFrame() action_string = str(self.text()).lower() if action_string == "b": self.page.triggerAction(QWebPage.Back) elif action_string == "f": self.page.triggerAction(QWebPage.Forward) elif action_string == "s": self.page.triggerAction(QWebPage.Stop)

just as before you also need to create instance of ActionInputBox, pass reference to page object and add it to our GUI grid.

Full result should look somewhat like this:

For reference here’s code for final result

pythondigest.ru

python - Python в браузере: как выбрать между Brython, PyPy.js, Skulpt и Transcrypt?

Вот некоторая информация о Brython vs Transcrypt (июль 2016 года, так как Transcrypt был добавлен в качестве опции по этому вопросу OP), почерпнутый, начав проект с Brython несколько месяцев назад и перейдя в Transcrypt (завершено перемещение на прошлой неделе). Мне нравятся Brython и Transcrypt, и я вижу их использование для обоих.

Для людей, которые не знакомы с этим, Brython и Transcrypt используют как "transpile" вход для python для javascript (Edit: возможно, лучше просмотреть Brython как "реализацию Python для браузера", потому что он не создает автономный javascript), Оба требуют синтаксиса Python 3. Brython включает значительное количество стандартных библиотек Python и некоторые из них для работы с веб-вещами, в то время как Transcrypt избегает этого в большинстве случаев и предлагает использовать библиотеки JavaScript.

Brython (Github) может выполните преобразование в браузере. Таким образом, вы пишете на python, а движок brython.js преобразует его в javascript на лету, когда загружается страница. Это действительно удобно и намного быстрее, чем вы думаете. Тем не менее, движок brython.js, который вам нужно включить в ваши страницы, составляет около 500 КБ. Кроме того, возникает вопрос об импорте стандартных библиотек, которые Brython обрабатывает, выбирая отдельные файлы .js с запросами XHR. Некоторые библиотеки уже скомпилированы в brython.js, поэтому не каждый импорт будет загружать новые файлы, но если вы используете много импорта, все может замедляться. Однако есть способы обойти это. Что я сделал, это проверить вкладку сети в инструментах браузера dev, чтобы посмотреть, какие файлы были вытащены при загрузке страницы, а затем удалить все файлы, которые мой проект не использовал в копии папки Brython src, и запустить script, входящий в состав Brython (я думаю, это на Brython/www/scripts/make_VFS.py), который компилирует все доступные библиотеки в один файл с именем py_VFS.js, который вам нужно также связать с вашим html. Обычно он создает один огромный файл размером 2 МБ +, но если вы удаляете то, что не используете, оно может быть довольно маленьким. Выполнение этого способа означает, что вам нужно всего лишь вытащить brython.js, py_VFS.js и ваш код на Python, и никаких дополнительных запросов XHR не потребуется.

Transcrypt (Github) на с другой стороны, распространяется как пакет python 3, который вы можете использовать вручную или зацепить в свою инструментальную цепочку, чтобы заранее скомпилировать python для javascript. Итак, с Transcrypt вы пишите в python, запускаете транскрипцию с питоном, и он выплевывает javascript, с которым вы можете ссылаться в своем проекте. Это больше похоже на традиционный компилятор и на то, что он предлагает некоторый контроль над выходом. Например, вы можете выбрать компиляцию на ES6 или ES5 или попросить его вывести исходные карты (что во время отладки позволяет браузеру перейти непосредственно к соответствующему коду питона, введя сгенерированный код javascript.) Вывод Transcrypt javascript довольно короткий ( или по-другому, это довольно и красно). В моем случае 150kB python преобразуется в 165kB unminified ES5 javascript. Для сравнения, версия моего проекта Brython использовала около 800 КБ после преобразования.

Однако, получая преимущества транскрипции, требуется чтение документов немного (на самом деле немного). Например, с Transcrypt, "правдоподобие" Python для структур данных, таких как dict, set и list, не включается по умолчанию и в глобальном масштабе, это обескураживает из-за потенциальных проблем производительности, связанных с проверкой typechecking. Для ясности: в CPython пустой dict, set или list имеет значение истинности False, тогда как в Javascript он считается "истинным". Пример:

myList = [] if myList: # False in CPython bcs it empty, true in javascript bcs it exists # do some things.

Существует по крайней мере три способа решить эту проблему:

  • Используйте флаг -t при преобразовании python в javascript, например: $transcrypt -t python.py(не рекомендуется, но, вероятно, это не проблема, если вы не проверяете правдивость много раз во внутренних циклах кода, чувствительного к производительности).
  • Используйте __pragma__(tconv) или __pragma__(notconv) в своем коде, чтобы сообщить компилятору транскопа включить автоматическое преобразование в значения правды, подобные питону, локально.
  • Вместо того, чтобы проверять значение истины, вообще избегайте проблемы, просто проверяя len (myList) > 0... Может быть, это будет хорошо для большинства ситуаций, делает работу для моего использования.

Правильно, поэтому мой проект становился все больше, и я хотел предварительно скомпилировать его для увеличения производительности, но с Brython было сложно это сделать (хотя это технически возможно, простой способ использовать онлайн-редактор и нажмите кнопку javascript, чтобы увидеть результат). Я сделал это и связался с сгенерированным javascript из project.html, но по какой-то причине он не работал. Кроме того, мне трудно понять сообщения об ошибках от Brython, поэтому я не знал, с чего начать после этого шага. Кроме того, большой размер выведенного кода и размер движка brython начинаются с меня. Поэтому я решил поближе познакомиться с Transcrypt, который сначала казался более высоким, потому что я предпочитаю инструкции, которые подсказывают мне, как начать работу сразу (с тех пор они были добавлены).

Главное, что он установил после установки Python3.5, было: 1) использовать venv (он как новая встроенная версия virtualenv, которая использует меньше места для каждого проекта) для настройки папки проекта python3.5 (просто type: python3.5 -m venv foldername - обходной путь для ubuntu с проблемами пакета для 3.5). Это делает "имя папки" с подпапкой bin среди прочего. 2) установите пакет Transcrypt python с pip ('foldername/bin/pip install transcrypt'), который устанавливает его в папку имя /lib/python 3.5/site-packages/transcrypt. 3) "активировать" текущий терминал, если вы не хотите вводить полный путь к имени папки /bin/python 3.5 каждый раз. Активировать, набрав: 'source foldername/bin/activate' 4) начать писать код и скомпилировать его в javascript для тестирования. Компиляция из папки, в которую вы вписываете свой код. Например, я использовал имя папки /www/project. Итак, CD в эту папку и запустите: 'transcrypt -b your_python_script.py'. Это помещает вывод в подпапку под названием __javascript__. Затем вы можете подключиться к выведенному javascript из вашего html.

Основные проблемы, перемещающиеся по

У меня довольно простые потребности, поэтому ваш пробег может меняться.

  • Вам нужно заменить стандартные библиотеки brython или python на javascript libs. Так, например, "import json" предоставляется Brython, но в Transcrypt вы можете использовать javascript lib или просто использовать JSON.parse/JSON.stringify непосредственно в вашем коде Python. Чтобы включить мини-версию javascript-библиотеки непосредственно в ваш код python, используйте этот формат (обратите внимание на тройные кавычки):

    __pragma__ ('js', '{}', ''' // javascript code ''')

  • Конкретные функции Brython html, очевидно, не работают с Transcrypt. Просто используйте обычные способы javascript. Примеры: 1) под Brython вы могли ссылаться на определенный тег HTML, используя 'document [' id ']', но с Transcrypt вы бы использовали 'document.getElementById(' id ') (что так же, как вы это делаете это из javascript). 2) Вы не можете удалить node с 'del nodeName' (bcs, который выполняет функцию brython). Используйте что-то вроде node.parentNode.removeChild(node) '. 3) замените все функции DOM brython на альтернативы javascript. например class_name = className; text = textContent; html = innerHTML; parent = parentNode; children = childNodes и т.д. Я думаю, если вам нужно что-то, что содержит альтернативы, требуемые некоторыми более старыми браузерами, тогда для этого есть библиотеки javascript. 4) Brython set_timeout заменяется на javascripts setTimeout 5) Brython html теги, такие как BR(), нужно заменить обычными способами javascript, а также переделать все места, в которых вы использовали синтаксис <= dom. Либо введите текстовую разметку как innerHTML, либо создайте элементы, используя синтаксис javascript, а затем присоедините их, используя обычный синтаксис DOM javascript. Я также заметил, что для флажков brython использует "if checkbox = 'checked": "но Transcrypt доволен", если флажок: "..

  • Я закончил продвигать проект на 2700 строк на прошлой неделе, когда Transcrypt не поддерживал несколько незначительных вещей (хотя их было достаточно легко заменить наполнителями), это были 1) str.lower, str.split(str.split присутствует, но, похоже, это javascript split, который работает по-разному с версией python, поведение которой я полагался), 2) раунд (это, похоже, теперь поддерживается в dev-версии ) и 3) isststance не работал на str, int и float, только на dict, list и set. 4) Еще одно отличие от Brython, которое я заметил, заключается в том, что если я вытащил JSON-представление dict, мне нужно сделать это, используя myDict = dict (data) ', тогда как brython был доволен' myDict = data '. Но это может быть связано с чем-то в Brython json.loads, которое я заменил непосредственно на JSON.parse. 5) Также без специально включенной перегрузки оператора Transcrypts (с использованием -o-переключателя для global или __pragma__('opov') для локального) вы не можете делать такие вещи, как задание операций с использованием перегруженного формата, но должны использовать соответствующие функции. Например.

    a = set([1, 2, 3]) b = set([3, 4, 5]) a.difference(b) # is used instead of a - b a.union(b) # used instead of a | b a.intersection(b) # used instead of a & b a.symmetric_difference(b) # used instead of a ^ b

6) Кроме того, вы не можете итерировать dicts по умолчанию, используя 'for я in dict:', без включения этого (cmd line -i или __pragma__('iconv'), но вы можете не включать его, просто используя клавиши(), например:

for key, value in dict.items(): # do things for each key and value..

Подводя итоги

  • Мне нравится Brython, потому что с ним легко справиться и проверить свой код (просто F5). Это ближе к истинному питону, потому что большая часть стандартной библиотеки есть. Мне не нравится включать механизм транспиляции (Edit: Или можно просмотреть его как виртуальную машину python) в браузере и большой размер выведенного javascript. Если бы я должен был что-то делать (но все-таки использовал Brython), я бы использовал javascript-методы для управления DOM из brython (что вы можете сделать..), вместо того, чтобы так много наклоняться на методы brython, потому что это потраченное время переместилось через к другому транспилеру, когда мои потребности изменились.

  • Мне нравится Transcrypt, потому что выведенный javascript действительно "худой и средний", и поскольку единственная вещь, на которую вы загружаете браузер, - это ваш сгенерированный код javascript, который похож по размеру на ваш код на Python. Также потому, что он поддерживает sourcemaps и потому что он дает мне контроль над выведенным javascript. И использование этого объясняло мне немного о оптимизации.

Надеюсь, что кто-то поможет, кто из них может быть полезен для своего конкретного проекта.

qaru.site

Написать браузер на Python для Windows

Вопрос: Python FAQ: информация для новичков

Во многих других разделах уже есть такие темы. Надо бы догонять.

Для начала, хотелось бы немного рассказать о данном языке программирование (ЯП).Python (питон уж как-то прижилось в русском программистском сообществе, но правильнее будет пайтон) - язык с динамической типизацией данных, мальтипарадигмальный (т.е. поддерживает многие парадигмы программирования : процедурное, ООП, функциональное ( в той или иной мере, по мере изучения питона, многие поймут недостатки этого направления). Достоинства: - очень удобный синтаксис - скорость разработки - большое количество "сахара" от разработчиков языка - кроссплатформенность ( достаточно наличия необходимых библиотек и интерпретатора, что бы запустить вашу программу на другой ОС) - большое кол-во библиотек( пока тройку не трогаем), позволяет не изобретать велосипеды

Где используется? - Компания Google использует Python в своей поисковой системе и оплачивает труд создателя Python — Гвидо ван Россума - Такие компании, как Intel, Cisco, Hewlett-Packard, Seagate, Qualcomm и IBM, используют Python для тестирования аппаратного обеспечения - Служба коллективного использования видеоматериалов YouTube в значительной степени реализована на Python - NSA использует Python для шифрования и анализа разведданных - Компании JPMorgan Chase, UBS, Getco и Citadel применяют Python для прогнозирования финансового рынка - Популярная программа BitTorrent для обмена файлами в пиринговых сетях написана на языке Python - Популярный веб-фреймворк App Engine от компании Google использует Python в качестве прикладного языка программирования - NASA, Los Alamos, JPL и Fermilab используют Python для научных вычислений.

Литература: - Python. Подробный справочник, 4-е издание (Автор: Бизли Д.) - Программирование на Python, 4-е издание, I том (Автор: Лутц М.)( 4-е издание python 3, 3-e издание python 2.6, разницу попозже обсудим) - http://www.python.ru/files/book-ods.pdf

Сайты: - http://python.ru/ - http://python.su/ - Официальный сайт

Советы от себя лично: - Последнее время набирает обороты python 3. . Личный совет, для новичков особенно, не торопитесь садиться за python 3. Спокойно изучайте python 2.7-2.6, особо дискомфорта вы не почувствуете при переходе на python 3., но избавитесь от проблем ( отсутствие библиотек, одна из самых главных). - После изучения может возникнут вопрос: "А куда идти дальше?" После изучения синтаксиса, основных возможностей языка, могу посоветовать ресурс ( он про java and C#, выкиньте оттуда содержания про эти ЯП, и спокойно изучайте другое) сюда, там что примерно нужно знать ( основы ООП, основы SQL, и др.). Можно переключиться на изучение фреймворка django ( тут документация на русском, основные моменты + python сообщество) или допустим изучать GUI на python ( PyQt, TkInter не советую, устарело немного, но для новичков тоже подойдёт).

Что нужно для начало работы с python 2/3: 1) интерпретатор. Скачать можно тут. 2) текстовый блокнот ( или IDE) В принципе все. Все можно запускать из консоли. Пример (python 2.7):

Код Python
1 2 s = 'Hello, World' print s
1)Сохраняем скрипт:Python FAQ: информация для новичков

2)Запускаем через консоль:Python FAQ: информация для новичков

Вот и готово. Первая программа на python 2.7. Чтобы можно было работать в консоли, как описано во втором пункте, необходимо, чтобы python был в переменной окружения PATH.

Список IDE:

Eclipse

Eclipse: Бесплатная IDE. Написана на Java. Неплохая IDE. Большое количество плагинов для python (самые популярные pydev, aptana). Есть поддержка django. Из недостатков стоит отметить слабое автодополнение, немного тяжеловесная. Лично я на ней написал не один крупный проект. Больших нареканий не было. Присутствует отладчик.Скачать

IDLE

IDLE: Бесплатная IDE. Очень удобная для начинающих. Можно быстро написать элементарные скрипты. Большие проекты на ней проблемно писать правда. Присутствует отладчик, неплохое автодополнение в стиле linux консолей (можно через tab или подождать немного)Скачать (насколько мне известно она идёт уже вместе с интерпретатором, но в некоторых системах python уже вшит в систему без IDLE)

NetBeans

NetBens: Тоже бесплатная IDE, ничего плохо сказать лично не могу. Работал на ней мало. По впечатлению, местами может быть и помощнее Eclipse, но нет поддержки django (планируется в будущем). Присутствует отладчик.Скачать

PyCharm

PyCharm: Платная IDE, но на порядок мощнее NetBeans и Eclipse. Прекрасное автодополнение, хорошая подсветка синтаксиса, поддержка django, встроенная поддержка всевозможных SVN. И много другого приятного. ( на данный момент работаю на ней). Самый лучший отладчик из тех IDE на которых я работал с python ( сравним с VS)Скачать

Aptana Studio

Aptana Studio 3: Бесплатная IDE. Очень похожа на Eclipse. Плюсы и минусы те же. С Eclipse перешел на неё.Скачать

Visual Studio

Visual Studio 2010 + Plagin for Python Ничего не могу сказать. Зная VS думаю вещь очень и очень стоящая. Почитать тут.

Eric

Eric: Написанная на Python довольно функциональная среда разработки. Поддерживает разработку на Python и Ruby. Скачать

Очень часто встречаются проблемы с unicode строками в python( 2-ой ветке). Дабы избегать дальнейших вопрос, почитай статью.

Ребята, может надо что-то добавить, напишите сюда или в личку, если есть, добавлю. Или напишу.

Ответ: Информация для новичков, которым что-то нужно сделать с массивом - сложить элементы или ещё что-нибудь.В "чистом" Питоне НЕТ МАССИВОВ!Для массивов надо использовать дополнительные библиотеки, из которых самая популярная - numpy.

forundex.ru

python - Приложение на основе браузера или автономное графическое приложение? user-interface browser

Очевидные преимущества для браузера:

  • вы можете представить один и тот же пользовательский интерфейс независимо от платформы
  • вы можете легко обновить приложение, и все пользователи имеют одну и ту же версию приложения
  • вы знаете среду, в которой будет работать ваше приложение (серверное оборудование / ОС), что упрощает тестирование и поддержку по сравнению с множеством конфигураций операционной системы и оборудования, на которые будет установлено приложение GUI.

И для графического интерфейса:

  • некоторые приложения (например, редактирование изображений), возможно, работают лучше в приложении с собственным графическим интерфейсом
  • не требует доступа к сети

Также см. Мои комментарии по этому вопросу :

Кросс-платформенные графические интерфейсы - это старая проблема. Qt, GTK, wxWindows, Java AWT, Java Swing, XUL - все они страдают от одной и той же проблемы: полученный графический интерфейс не выглядит родным на каждой платформе. Хуже того, каждая платформа имеет несколько иной внешний вид , поэтому, даже если бы вы каким-то образом смогли получить набор инструментов, который выглядел родным на каждой платформе, вам нужно как-то закодировать приложение, чтобы чувствовать себя родным на каждой платформе.

Это сводится к решению: хотите ли вы минимизировать усилия по разработке и иметь графический интерфейс, который не выглядит и не кажется совершенно правильным на каждой платформе, или вы хотите максимизировать пользовательский интерфейс? Если вы выберете второй вариант, вам потребуется разработать общий бэкэнд и пользовательский интерфейс для каждой платформы. [изменить или использовать веб-приложение.]

Еще одна мысль, которую я только что имел: вам также нужно рассмотреть данные о том, что ваше приложение манипулирует и где оно хранится, и о том, как пользователи будут это понимать. Очевидно, что у людей есть данные профиля в facebook, хранящиеся на веб-сервере, но они могут выглядеть по-другому, если вы пишете финансовое приложение, такое как MYOB, и хотите сохранить все свои личные финансовые данные на своем сервере. Вы могли бы заставить это работать, но для этого потребуется много усилий для обеспечения требуемой безопасности и обеспечения того, чтобы база данных была безопасной. В этой ситуации вы можете решить, что общие усилия будут ниже, если вы поедете с собственным графическим интерфейсом.

Когда дело доходит до простого ввода данных с использованием форм ввода пользователем, я бы сказал, что использование решения на основе браузера, вероятно, будет проще и быстрее развиваться.

Если ваша основная особенность не является самим интерфейсом (« Если это основная бизнес-функция - сделайте это самостоятельно, что бы ни случилось », см. Раздел «Защита не-изобретенного синтаксиса от Joel on Software» ), я считаю, что браузер будет иметь возможность выполнять визуализацию и обработку формы лучше, чем создавать графический интерфейс с нуля. Кроме того, не говоря уже о том, что для кодирования графического интерфейса потребуется гораздо больше времени, а не генерировать HTML-формы и обрабатывать их после того, как они будут загружены браузером.

То, что я нашел в прошлом, заключалось в том, что меня попросил друг написать заявку для ввода результатов опроса. Сначала я писал апплет Java, чтобы отображать сам опрос со всеми радио-ящиками, когда он ударил меня, что мне лучше написать простой HTTP-сервер, который будет генерировать формы и обрабатывать их.

То, что действительно происходит, заключается в том, развивается ли вы:

  1. пользовательский интерфейс
  2. приложение для ввода данных

Если вы создаете приложение для ввода данных, оставьте пользовательский интерфейс браузером и сосредоточьтесь на своей основной функциональности.

Имеются довольно убедительные доказательства того, что проблема с козырем в большинстве случаев - это возможность развертывания и поддержки. Приложения для браузеров в целом более низки; внедрение и поддержка более чем нескольких десятков пользователей может в конечном итоге потреблять значительные ресурсы поддержки.

Я видел столик год-два назад, который показал что-то вроде:

Качество пользовательского интерфейса - рабочий стол Гранулярность проверки - Рабочий стол Отзывчивость - рабочий стол Приём пользователя - рабочий стол и т.д. - Рабочий стол и т.д. - Рабочий стол Установка и поддержка - браузер и Браузер выигрывает.

Одна из вещей, которые я ненавижу в отношении веб-интерфейсов, - это то, что они запускаются внутри другого окна. Значит, у вас есть элементы управления - может быть, десятки из них - которые не имеют никакого отношения к вашему приложению. С точки зрения удобства использования это может сбить с толку, хотя большинство из нас адаптировано путем «настройки» дополнительного материала.

Когда я смотрю на мое окно браузера, когда я набираю его, окно, возможно, составляет 12 дюймов в высоту, но окно, в которое я печатаю, может быть всего лишь 3 дюйма. И из этих 12 дюймов в целом, возможно, два полных дюйма заняты панелями браузера, вкладками, строками закладок и панель состояния, ни одна из которых не имеет ничего общего с веб-приложением, с которым я взаимодействую. Там много потерянного пространства (окно редактирования не так широко, как, например, окно в целом), пространство, заполненное вещами, которые мне не нужны, и т. Д. Некоторые из самых фундаментальных элементов управления (кнопка «Назад», я смотрю на вас) может полностью сломать плохо разработанные веб-приложения.

Не говоря уже о том, что, если я наберу достаточно длинный ответ, теперь у меня есть два набора полос прокрутки. .com частично обращается к этому, предоставляя мне изменяемую размерную область текста, но мне все же приходится взаимодействовать с внутренней полосой прокрутки, чтобы прокручивать текст, который я редактирую, затем прокручивать все окно вверх или вниз, чтобы получить доступ к элементам управления сверху или снизу окна редактирования.

В целом, веб-приложение просто не может сравниться с удобством использования настольного приложения. Поэтому для меня вопрос просто становится «вас больше интересует юзабилити или облегчает жизнь (как разработчика)».

Если вы хотите юзабилити, пойдите с настольным приложением, опуститесь вниз. Если вы заинтересованы в развертывании и поддержке веб-приложения, это то, что нужно учитывать, но есть еще много простых способов развертывания настольных приложений, включая создание приложений, которые могут обновлять себя по сети во время выполнения.

Все имеет свои преимущества и недостатки, но:

Я еще не использовал одно приложение на основе браузера на локальном хосте, интрасети или Интернете, которое приятно использовать, является отзывчивым, а пользовательский интерфейс строго не ограничен ограничениями HTML / JS / CSS.

Примечание. Flash / Java-интерфейс является исключением (но это даже хуже в некоторых отношениях, и я не думаю, что это действительно то, о чем вы говорите здесь).

Графический интерфейс богатого клиента, как правило, будет быстрее и лучше интегрирован с внешним видом, с которым пользователь привык иметь дело - это не только означает колокола и свистки, но также означает много времени на сохранение функций, таких как сочетания клавиш.

Веб-интерфейс будет более переносимым, поскольку он не связан разработкой с одной платформой, и если приложение работает на удаленном компьютере, его проще обновлять и тестировать все (исключая GUI ...) в согласованной среде ( ваш сервер). Но вы должны понимать, что, хотя все это здорово и действительно новаторски, оно также имеет некоторые серьезные недостатки. Вы должны не только отлаживать приложение во всех целевых системах, но также и под каждым отдельным браузером, работающим на каждой отдельной целевой системе ... и не забывайте, что многие версии одного и того же браузера могут сосуществовать в течение некоторого времени и что настройки каждого браузера вероятно, будут запускаться разные наборы (и версии) популярных плагинов, что заставляет его вести себя по-другому, и, возможно, сетевые настройки будут настроены пользователями. Если приложение находится в удаленном режиме, оно открывает много интересной новой проблемы, начиная с разных интернет-провайдеров, которые будут упускать разные проблемы в середине или простоты служб из-за сетевых проблем вашего сервера, машин пользователя или где-либо посередине. Удаленное приложение не является вариантом для всех пользователей в странах, где сетевая услуга имеет низкое качество или не имеет разумной стоимости; то же самое верно для вас: вы можете начать предоставлять такую ​​услугу только в том случае, если пропускная способность вашей страны разумна и разумна. И если приложение должно сделать что-то нетривиальное в пользовательской системе, вы, вероятно, обречены на создание большого количества зависимых от платформы кодов.

Как результат, сегодня есть преимущества и недостатки в любом из двух решений. Есть несколько приложений, которые действительно нужно разрабатывать под богатой клиентской моделью, и есть приложения, которые действительно нужно разрабатывать в рамках веб-парадигмы. Хорошо иметь оба варианта, важно иметь четкое представление о том, как наилучшим образом подходит наша стратегия разработки / развертывания / поддержки, и, я могу добавить, глупо идти за тем или другим, как если бы это было представляет собой окончательную серебряную пулю, следуя моменту момента.

code-examples.net

Web crawler с использованием Python и Chrome / Хабрахабр

Добрый день, дорогие друзья.

Недавно, сидя на диване, я задумался о том, что хочется мне сделать своего паука, который что-то бы смог качать с веб сайтов. Но качать он должен был бы не простой загрузкой, а как настоящий милый добрый браузер (т.е. JavaScript чтобы исполнялся).

В моей голове всплыли такие интересные штуки, как Selenium, PhantomJS, Splash и всякое подобное. Все эти штуки были мне немного втягость. Вот какие причины я выявил:

  • Дело в том, что я хотел бы писать на своем любимом питоне, потому что очень не люблю JavaScript, а это уже означает, что большая часть уже не работала бы (или пришлось их как-то склеивать, что тоже отстой).
  • Еще эти безголовые браузеры обновляются как когда.
  • Но вот Selenium очень милая штука, но я не нашел, как там отслеживать загрузку страниц, или хотя бы адекватного способа выдрать куку или задать её. Слышал, что многие любители селениума инжектят в страничку JavaScript, что для меня дико, потому что где-то полгода назад я делал сайтик, который отрывал любые JavaScript вызовы с сайта и потенциально мог определять моего паука. Мне бы очень не хотелось таких казусов. Хочется чтобы мой паук выглядел как браузер максимально точно.
Собственно, к делу. Недавно вышел Headless Chrome. Это означает, что теперь мы аж использовать хром, как кравлер (но это неточно). Однако, я не нашел нормальных утилит для использования его в качестве кравлера. Нашел только chrome-remote-interface из списка сторонних клиентов (остальные были крайне скучными и совсем непонятными на первый взгляд).

Пробежавшись по документации и готовому проекту, и убедившись что никто толком не реализовал клиент под Python, я решил сделать свой клиент.

Протокол у Chrome Remote Debug достаточно простой. Для начала нам надо запустить Chrome вот с такими параметрами:

chrome --incognito --remote-debugging-port=9222 --headlessimage

Теперь у нас есть API, доступное, по адресу http://127.0.0.1:9222/json/, в котором я обнаружил такие методы как list, new, activate, version, которые используются для управления вкладками.

Также, если мы просто перейдем на http://127.0.0.1:9222/, то сможем перейти на прекрасный веб отладчик, который полностью имитирует стандартный. В нем очень удобно отслеживать как работают апишные методы хрома (окно отладки справа эмулируется внутри окна, а окно браузера — отрисовано на канвасе).

image Собственно, перейдя на вкладку list, мы можем узнать, адрес вебсокета, с помощью которого мы сможем общаться с вкладкой.

Дальше мы подсоединяемся через вебсокет к желаемой вкладке, и общаемся с нею. Мы можем:

  • Выполнить запрос
  • Подписаться на события в вкладке
Спустя дни мучительного написания функционала для себя у меня получилась вот такая библиотека.

Что в ней есть:

  • Автоматическая подкачка последней версии протокола
  • Обертка протокола в питонистический вид
  • Синхронный и асинхронный клиент (синхронный только для отладки)
  • Надеюсь, удобная абстракция вкладок
image Вот так выглядит прога, которая подгружает страничку и выдает длину каждого ответа на запрос:import asyncio import chrome_remote_interface if __name__ == '__main__': class callbacks: async def start(tabs): await tabs.add() async def tab_start(tabs, tab): await tab.Page.enable() await tab.Network.enable() await tab.Page.navigate(url='http://github.com') async def network__loading_finished(tabs, tab, requestId, **kwargs): try: body = tabs.helpers.unpack_response_body(await tab.Network.get_response_body(requestId=requestId)) print('body length:', len(body)) except tabs.FailReponse as e: print('fail:', e) async def page__frame_stopped_loading(tabs, tab, **kwargs): print('finish') tabs.terminate() async def any(tabs, tab, callback_name, parameters): pass # print('Unknown event fired', callback_name) asyncio.get_event_loop().run_until_complete(chrome_remote_interface.Tabs.run('localhost', 9222, callbacks)) Тут мы используем систему колбеков. Самые интересные: start и any:
  • start(tabs, tab) — вызывается при старте.
  • any(tabs, tab, callback_name, parameters) — вызывается, в случае если событие не нашлось в списке колбеков.
  • network__response_received(tabs, tab, **kwargs) — пример библиотечного события Network.responseReceived.
Мне мой код показался достаточно элегантным, и я буду его использовать дальше, хоть протокол немного сыроват. Если кто-то хочет обсудить, то пишите сюда, в Github или мне на почту.

Однако, было одно но, из-за которого я все таки плачу. С помощью remote API нельзя производить перехват и модификацию запросов и ответов. Насколько я понял — это возможно через mojo, который позволяет использовать хром в качестве библиотеки.

Однако, я подумал, что компиляция нестабильного хрома и отсутствие Python прослойки для меня будет большим горем (сейчас есть C++ и JavaScript в процессе разработки).

Надеюсь, статья была полезной. Спасибо.

image

habrahabr.ru


Смотрите также

 

..:::Новинки:::..

Windows Commander 5.11 Свежая версия.

Новая версия
IrfanView 3.75 (рус)

Обновление текстового редактора TextEd, уже 1.75a

System mechanic 3.7f
Новая версия

Обновление плагинов для WC, смотрим :-)

Весь Winamp
Посетите новый сайт.

WinRaR 3.00
Релиз уже здесь

PowerDesk 4.0 free
Просто - напросто сильный upgrade проводника.

..:::Счетчики:::..