Как сделать браузер на python
Можно ли управлять веб-браузером, например Firefox, с помощью Python?
Я хотел бы делать такие вещи, как
-
запустите браузер
принудительно нажимает на URL-адреса
сделать скриншоты
Selenium Remote Control - это проект, который очень близок к тому, что вам нужно. В Python очень легко работать с подпакетом selenium.webdriver , который поставляется вместе с ним. Когда-то это были два проекта. Они теперь объединены.
Установка
Использование
Примечания
Документация может немного запутать для Selenium, потому что есть два режима взаимодействия с браузерами. Как и режим webdriver , есть возможность поговорить с "автономным сервером удаленного управления Selenium". Этот подход является тем, что задокументировано сначала в официальной документации но я хотел бы придерживаться webdriver для простой задачи здесь.
ответил(а) 2010-07-30T09:20:00+04:00 11 лет, 3 месяца назадЕсли вам нужно сделать скриншоты, вам нужно отобразить страницы. Я бы рекомендовал использовать Selenium (как упоминалось Тимом), или затем spynner.
Вот пример кода, который вам нужен, используя spynner:
ответил(а) 2010-07-30T13:46:00+04:00 11 лет, 3 месяца назадwxWebConnect - это библиотека wxWidgets для управления Gecko (движок рендеринга Mozilla). Вместе с wxPython он позволит вам написать собственный (минимальный) веб-браузер в Python и, следовательно, контролировать клики.
ответил(а) 2010-07-30T11:18:00+04:00 11 лет, 3 месяца назадЭффективный способ управления браузером в Python - использовать PyQt4.QtWebKit .
ответил(а) 2010-07-30T13:23:00+04:00 11 лет, 3 месяца назадВопрос немного стар, но я не вижу ссылок на pywebkitgtk, вы должны попробовать. Я разработал spynner, используя привязки pyqt.qtwebkit, но программисты, которые предпочитают pygtk, должны попробовать pywebketgtk (что для меня больше питонично). Обратите внимание, что привязки Qt более полные (или, по крайней мере, это был последний раз, когда я проверил).
ответил(а) 2010-12-14T17:49:00+03:00 10 лет, 11 месяцев назадЗависит от того, чего вы на самом деле хотите достичь. Если вам нужно сделать некоторые автоматические вещи без вмешательства пользователя, вы можете просто использовать базовый движок браузера, например Gecko или WebKit, без загрузки самого браузера. Есть готовые Python привязки к этим доступным двигателям.
Браузеры сами не предоставляют такой API для внешних процессов. Для Firefox вам нужно будет вставить некоторый код на стороне браузера в chrome, либо в качестве расширения, либо в плагин.
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):
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.
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.
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:
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.
Now fire up your browser, enter url into input box and enjoy the view of all requests filling up table below webframe.
- 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.
then we instantiate it in our main clause and voila our dev tools are ready.
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.
just as before you also need to create instance of ActionInputBox, pass reference to page object and add it to our GUI grid.
Для дополнительных кнопок: - выход, минимизация, максимизация и т.д. Для навигации в Интернете. Все закладки созданы с помощью экземпляра QToolBar().
Код панели закладок
После создания панелей инструментов добавляются кнопки, так как там много кода. Я покажу только конечный результат как скриншот и последние несколько строк кода в функции init.
Последние несколько строк кода:
Добавьте сайт в закладку.txt
Загрузите закладки из файла документа.
Создайте кнопку "закладки", при нажатии откроется новая вкладка с этим сайтом.
Теперь это та часть, с которой у меня возникают проблемы. Если я удалю строку - triggered.connect, и я не добавлю никаких функций к этой кнопке, все запускается и работает без ошибок. Он хранит и может загружать закладки. Однако, когда эта строка добавлена, она падает, и кнопка не создается (приложение не выходит, поскольку есть инструкция except, которая улавливает ошибку - в которой pyqt не показывает, какая это ошибка). Это функция add_new_tab():
Первоначально я открываю вкладки "двойным щелчком" на панели вкладок с помощью этой функции:
Как вы можете видеть на триггере - я передаю ссылку как QUrl, и я добавляю тестовую метку. Проблема, которую я им как-то не хочу работать, и я не могу найти почему, потому что Python PyQT5 не показывает ошибку, он просто закрывается с кодом возврата.
Скриншоты как объяснение:
Ссылка не добавлена в bookmarks.txt
Ссылка добавлена в bookmarks.txt
Pickle выполняет сброс ссылки в.txt
Запускается оператор "except", а строка triggered.connect не закомментирована.
Приложение продолжает работать, но загруженных кнопок закладок не существует.
Модуль webbrowser обеспечивает интерфейс высокого уровня, позволяющий пользователям просматривать веб-документы. В большинстве случаев, простой вызов функции open() из этого модуля сделает все правильно.
В Unix графические браузеры предпочтительны в разделе X11, но текстовые браузеры будут используемый, если графические браузеры недоступны или X11 дисплей недоступен. При используемый браузеров в текстовом режиме вызывающий процесс блокируется до тех пор, пока пользователь не выйдет из браузера.
Если переменная среды BROWSER существует, она интерпретируется как os.pathsep -separated список браузеров, чтобы попытаться опередить настройки платформы по умолчанию. Если значение части списка содержит строка %s , то она интерпретируется как командная строка браузера литерал для используемый с URL-адресом аргумента, заменяющим %s ; если деталь не содержит %s , она просто интерпретируется как имя запускаемого браузера. [1]
Для платформ, отличных от Unix, или когда удаленный браузер доступен в Unix, процесс управления не будет ждать, пока пользователь закончит работу с браузером, а позволит удаленному браузеру поддерживать собственные окна на дисплее. Если удаленные браузеры недоступны в Unix, процесс управления запустит новый браузер и будет ждать.
Скрипт webbrowser может быть используемый в качестве интерфейса командной строки для модуля. В качестве аргумента он принимает URL-адрес. Он принимает следующие необязательные параметры: -n по возможности открывает URL-адрес в новом окне браузера; -t открывает URL-адрес на новой странице браузера («tab»). Варианты, естественно, взаимоисключающие. Пример использования:
Определено следующее исключение:
exception webbrowser. Error ¶
Исключение возникает при возникновении ошибки управления браузером.
Определены следующие функции:
webbrowser. open ( url, new=0, autoraise=True ) ¶
Отображение url с помощью браузера по умолчанию. Если new равно 0, по возможности url открывается в том же окне браузера. Если new равно 1, по возможности открывается новое окно браузера. Если new равно 2, по возможности открывается новая страница браузера («tab»). Если autoraise True , окно поднимается по возможности (обратите внимание, что во многих оконных менеджерах это происходит независимо от настройки этой переменной).
Обратите внимание, что на некоторых платформах, пытаясь открыть имя файла с помощью этой функции, может работать и запускать связанную с операционной системой программу. Однако это не поддерживается и не переносится.
Поднимает событие аудита webbrowser.open с аргументом url .
webbrowser. open_new ( url ) ¶
Открыть url в новом окне браузера по умолчанию, если это возможно, в противном случае открыть url в единственном окне браузера.
webbrowser. open_new_tab ( url ) ¶
Открыть url на новой странице («tab») браузера по умолчанию, если это возможно, в противном случае эквивалентно open_new() .
webbrowser. get ( using=None ) ¶
Возвращает объект контроллера для using типа браузера. Если using None , возвращает контроллер для браузера по умолчанию, соответствующего среде вызывающего абонента.
webbrowser. register ( name, constructor, instance=None, *, preferred=False ) ¶
Зарегистрировать тип браузера name. После регистрации типа браузера функция get() может возвращает контроллер для этого типа браузера. Если instance не предоставляется или является None , constructor вызывается без параметров для создания сущность при необходимости. Если instance предоставляется, constructor никогда не будет вызываться и может быть None .
Установка preferred в значение True делает этот браузер предпочтительным результатом для вызова get() без аргумента. В противном случае эта точка входа полезна только в том случае, если планируется задать переменную BROWSER или вызвать get() с непустым аргументом, соответствующим имени объявленного обработчик.
Изменено в версии 3.7: preferred ключевой-только параметр был добавлен.
Предопределен ряд типов браузера. В этой таблице приведены имена типов, которые могут быть переданы функции get() , и соответствующие экземпляры для классов контроллеров, все из которых определены в этом модуле.
- «Konqueror» является файловым менеджером для среды рабочего стола KDE для Unix и имеет смысл использовать только при работе KDE. Какой-то способ надежного обнаружения KDE был бы хорошим; KDEDIR переменной недостаточно. Следует также отметить, что имя «kfm» используемый даже при использовании команды konqueror с KDE 2 — реализации выбирается оптимальная стратегия для запуска Konqueror.
- Только на платформах Windows.
- Только на платформе Mac OS X.
Добавлено в версии 3.3: Добавлена поддержка Chrome/Chromium.
Вот несколько простых примеров:
Объекты контроллера браузера¶
Контроллеры браузера предоставляют следующие методы, которые параллельны трем функциям удобства на уровне модулей:
controller. open ( url, new=0, autoraise=True ) ¶
Отображение url с помощью браузера, обрабатываемого этим контроллером. Если new равно 1, по возможности открывается новое окно браузера. Если new равно 2, по возможности открывается новая страница браузера («tab»).
controller. open_new ( url ) ¶
Открыть url в новом окне браузера, обработанном этим контроллером, если это возможно, в противном случае открыть url в единственном окне браузера. Псевдоним open_new() .
controller. open_new_tab ( url ) ¶
Открыть url на новой странице («tab») браузера, обрабатываемой этим контроллером, если это возможно, в противном случае эквивалентно open_new() .
Читайте также: