Как открыть ссылку в Python. Работа с WebBrowser и решение проблемы с Internet Explorer
В ходе работы над курсачом для универа столкнулся со стандартным модулем Python — WebBrowser. Через этот модуль я хотел реализовать работу голосового помощника — Lora с дефолтным браузером, но всё пошло не так гладко как ожидалось. Давайте для начала расскажу вам что это за модуль и как он вообще работает.
WebBrowser — это вшитый в Python модуль, который предоставляет собой высокоуровневый интерфейс, позволяющий просматривать веб-документы.
Для начала работы импортируйте модуль командой:
import webbrowser
Теперь возникает выбор как открыть ссылку. Есть два стула:
1. Написать через одну строчку:
webbrowser.open(url, new=0, autoraise=True)
webbrowser.open('https://vk.com', new=2)
Если new = 0, URL-адрес открывается, если это возможно, в том же окне браузера. Если переменная new = 1, открывается новое окно браузера, если это возможно. Если new = 2, открывается новая страница браузера («вкладка»), если это возможно.
Значение autoraise можно смело пропускать, ибо оно открывает браузер поверх всех окон, а большинство современных браузеров плюёт на эту переменную даже в значении False.
2. Не мучиться с запоминанием параметров new и писать по-человечески:
webbrowser.open_new(url)
Данная конструкция открывает URL-адрес в новом ОКНЕ браузера по умолчанию, если это возможно, в противном случае откроет URL-адрес в единственном окне браузера.
webbrowser.open_new_tab(url)
В этом случае URL-адрес откроется на новой странице (”tab») браузера по умолчанию, если это возможно, в противном случае эквивалентно open_new ().
Предположим, что вам не нужен браузер по умолчанию. Для выбора браузера существует классная команда .get()
webbrowser.get(using=None)
Грубо говоря, вы просто указываете какой браузер вам использовать.
Например, открытие новой вкладки в Google Chrome:
webbrowser.get(using='google-chrome').open_new_tab('https://vk.com')
Таблица названий браузеров:
| Type Name | Class Name |
|---|---|
| ‘mozilla’ | Mozilla(‘mozilla’) |
| ‘firefox’ | Mozilla(‘mozilla’) |
| ‘netscape’ | Mozilla(‘netscape’) |
| ‘galeon’ | Galeon(‘galeon’) |
| ‘epiphany» | Galeon(‘epiphany’) |
| ‘skipstone’ | BackgroundBrowser(‘skipstone’) |
| ‘kfmclient’ | Konqueror() |
| ‘konqueror» | Konqueror() |
| ‘kfm’ | Konqueror() |
| ‘mosaic’ | BackgroundBrowser(‘mosaic’) |
| ‘opera’ | Opera() |
| ‘grail’ | Grail() |
| ‘links’ | GenericBrowser(‘links’) |
| ‘elinks’ | Elinks(‘elinks’) |
| ‘lynx’ | GenericBrowser(‘lynx’) |
| ‘w3m’ | GenericBrowser(‘w3m’) |
| ‘windows-default’ | WindowsDefault |
| ‘macosx’ | MacOSX(‘default’) |
| ‘safari’ | MacOSX(‘safari’) |
| ‘google-chrome’ | Chrome(‘google-chrome’) |
| ‘chrome» | Chrome(‘chrome’) |
| ‘chromium» | Chromium(‘chromium’) |
| ‘chromium-browser’ | Chromium(‘chromium-browser’) |
Но не всегда получается обойтись одним только .get() и в этом случае на помощь приходит функция .register(), например:
import webbrowser webbrowser.register('Chrome', None, webbrowser.BackgroundBrowser('C:\Program Files (x86)\Google\Chrome\Application\chrome.exe')) webbrowser.get('Chrome').open_new_tab('vk.com')
Мы указали путь к Google Chrome, назвали его и теперь все ссылки открываются только в нём. Надеюсь немного разобрались с модулем WebBrowser и теперь перейдём к моей маленькой проблеме.
Проблема
Как говорилось ранее, для курсового проекта я выбрал создание голосового ассистента. Хотелось его научить переходить по ссылкам и искать информацию в поисковике. Конечно можно было бы «напиповать» множество библиотек для этого, но принципиально хотелось реализовать это через стандартный модуль WebBrowser.
Так как у большинства современных браузеров строка ввода ссылки и поисковая строка это одно и то же, то, казалось бы, можно просто передать запрос туда же, куда передаётся ссылка.
import webbrowser webbrowser.open_new_tab('https://vk.com') webbrowser.open_new_tab('яблоки')
По логике этого кода должны открыться две вкладки:
- Сайт vk.com
- Запрос в поисковике — яблоки
Раз нам позволяют открывать только ссылки в дефолтном браузере, так и будем открывать только ссылки.
Шаги решения

- Делаем поисковый запрос в наш поисковик (яндекс, гугл и т.д. и т.п.)
- Вытаскиваем ссылку

И, как уже многие догадались, просто вставляем нашу ссылку без того, что идёт после «text=»
import webbrowser webbrowser.open_new_tab('https://vk.com') webbrowser.open_new_tab('https://yandex.ru/search/?lr=10735&text=')
webbrowser.open_new_tab('https://yandex.ru/search/?lr=10735&text='+'еда')
webbrowser.open_new_tab('https://yandex.ru/search/?lr=10735&text=%s'%'еда')
webbrowser.open_new_tab('https://yandex.ru/search/?lr=10735&text=<>'.format('еда'))
Для начала мы понимаем, что ссылка несёт в себе домен (.ru, .com и т.д.), в запросе же, как правило, точку не ставят (купить машину, фильм онлайн и т.д.), а в ссылке пробел.
Следовательно, мы будем искать точку и пробел в том, что ввёл пользователь. Реализовать мы сможем это благодаря модулю re, который также изначально встроен в Python. Python предлагает две разные примитивные операции, основанные на регулярных выражениях: match выполняет поиск паттерна в начале строки, тогда как search выполняет поиск по всей строке. Мы воспользуемся операцией search.
import webbrowser import re call = input('Введите ссылку или запрос: ') if re.search(r'\.', call): webbrowser.open_new_tab('https://' + call) elif re.search(r'\ ', call): webbrowser.open_new_tab('https://yandex.ru/search/?text='+call) else: webbrowser.open_new_tab('https://yandex.ru/search/?text=' + call)
Немного объясню код.
Пользователь вводит ссылку или текст запроса в переменную call.
if re.search(r'\.', call): webbrowser.open_new_tab('https://' + call)
Первое условие проверяет переменную call на точку внутри неё. Символ ‘\’ обязателен, иначе модуль не понимает, что перед ним символ точка.
elif re.search(r'\ ', call):
В этом условии всё тоже самое что и в первом, но проверка ведётся уже на пробел. А пробел говорит о том, что перед нами поисковой запрос.
else: webbrowser.open_new_tab('https://yandex.ru/search/?text=' + call)
А else, в свою очередь, присваивает всё что написал пользователь без пробелов и точек в поисковый запрос.
Проверка на пробел является обязательной, иначе WebBrowser открывает Internet Explorer.
Всем спасибо за внимание! Надеюсь данная статья кому-нибудь окажется полезной.
- python
- python3
- webbrowser
- python webbrowser
- браузер
- работа с браузером
- открытие ссылок в python
- ненормальное программирование
как закрыть окно проигрывателя после просмотра видео с помощью Python
Задача такая — должно запуститься видео, пройти до окончания и окно проигрывателя закрыться автоматически. Этот код запускает видеопроигрыватель и видео проигрывается. Но после окончания видео, окно проигрывателя не убирается,если не нажать на красный крестик в правом верхнем углу. Как сделать,что бы окно проигрывателя исчезало после окончания видео?
import subprocess subprocess.call("d:\\file.avi", shell=True)
Есть проигрыватель на Python но он даже не проигрывает видео
import kivy kivy.require('1.9.0') import time import os import sys import psutil import logging from kivy.app import App from kivy.uix.video import Video from kivy.config import Config from kivy.core.window import Window Config.set('graphics', 'position', 'custom') Config.set('graphics', 'left', 0) Config.set('graphics', 'top', 500) Config.set('graphics', 'resizable', 'False') #Config.set('graphics', 'borderless', 1) Config.set('graphics', 'width', 1127) Config.set('graphics', 'height', 636) class MyApp(App): video = None def build(self): Window.bind(on_keyboard=self.on_keyboard) # bind our handler self.video = Video(source="f:\\video.mp4") self.video.state='play' #self.video.options = self.video.allow_stretch=True self.video.pos_hint = self.video.bind(eos=self.VideoDone) return self.video def VideoDone(self, value, value2): print ("video done", value, value2) def on_stop(self): # The Kivy event loop is about to stop, set a stop signal; # otherwise the app window will close, but the Python process will # keep running until all secondary threads exit. print ('stopping and closing kivy') #self.video.state='stop' def on_keyboard(self, window, key, scancode, codepoint, modifier): print (window, key, scancode, codepoint, modifier) if codepoint == 'p': print ('pausing with p pressed') self.video.state='stop' if codepoint == 's': print ('starting with s pressed') self.video.state='play' if codepoint == 'r': print ('re-starting with r pressed') self.video.seek(0, precise=True) if __name__ == '__main__': print ("hi") MyApp().run()
Как авторизоваться на YouTube с помощью Python (Request)?
Добрый вечер.
Поставил себе задачу спарсить данный из Youtube Library Music (https://www.youtube.com/audiolibrary/music) методом запросов.
Естественно youtube запросил авторизацию.
Я почти не работал с модулем requests , и не могу точно осознать , какой путь решения данной проблемы будет более правильным:
Попробовать сначала отправить запрос на Авторизацию : ( https://accounts.google.com/signin/v2/identifier?f. ) , а после в сохранённой сессии продолжить выполнять задачу по парсингу..
Или пройти сразу по ссылке (https://www.youtube.com/audiolibrary/music) , и залогиниться там.
Этот вопрос довольно простой , да и проблема не в нём.
Проблема в том , что я не знаю , как залогиниться. При post запросе Form Data ( в ней должны быть отправляемые логин и пароль ) содержит много странностей , но где и куда вставлять пароль я так и не понял.
Понятное дело , что авторизация на ютуб это не на форум для знакомств заходить , но не может же быть всё так проблематично?
В чём моя ошибка и куда стоит смотреть для её решения?
Поискав на хабре нашёл информацию о том , что простыми пост-гет запросами на ютубе не пошарить , неужели без селениума не обойтись? А если и с ним , то как передать открытую с помощью него сессию , чтобы работать с ней дальше через requests?
Буду рад любому мнению.
- Вопрос задан более трёх лет назад
- 841 просмотр
Комментировать
Решения вопроса 1

ScriptKiddo @ScriptKiddo
Алгоритм прост.
Определяете, возможно ли получить данные, отключив JS. Например, с помощью этой инструкции
https://developers.google.com/web/tools/chrome-dev.
Если с отключенным JS нужных данных не появляется, тогда у вас остается два варианта:
— Разбираться в логике получения данных, ковыряя JS скрипты, которые обрабатывают данные. Найти их можно, на вкладке Sources
Вкладка Sources
— Использовать Selenium, имитируя действия пользователя
Для выбора элементов на странице вам пригодится язык запросов XPath Тутор
Расширение для отладки Xpath Helper
Кнопки ищутся примерно по такому селектору:
Как написать парсер телеграм‑каналов на Python

В предыдущей статье об асинхронном программировании на Python мы разобрали основные моменты, связанные с построением асинхронного приложения и функций. Теперь рассмотрим полезный пример, который вовсю использует принципы асинхронности, — простой парсер данных из Telegram
Содержание статьи
- async for
- Как написать парсер телеграм-каналов на Python
- Шаг 1. Создаем приложение API для Telegram
- Шаг 2. Устанавливаем библиотеку telethon
- Шаг 3. Получаем первые данные из Telegram
- Шаг 4. Получаем диалоги
- Шаг 5. Получаем сообщения из выбранного канала
async for
Чтобы пример с парсером был понятнее, сначала поговорим о циклах внутри асинхронных функций. Вспомним финальный пример из первой части статьи, посвященной асинхронному программированию на Python, с получением данных о погоде.

Добавим еще одну функцию, которая будет отображать прогресс измерения давления.

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

Все хорошо отрабатывает, и проблем нет. Но пойдем дальше в сторону реальных условий работы. Бывает, что функции отдают не готовую последовательность, а асинхронный генератор или асинхронный итератор. Это специальные контейнеры, которые содержат данные и при каждом обращении асинхронно выдают по одному объекту.
Перепишем функцию процесса измерения.

Раз функция def ticker ( ) теперь генератор, то мы должны каждый раз его вызывать, когда она нам понадобится. Классический способ перебора всех значений, возвращаемых генератором, — это подстановка его вызова в цикл for. Перепишем функцию измерения давления.

Теперь, если запустим код, столкнемся с интересной ошибкой.

Из текста может показаться, что генератор не является итерируемым объектом. Но на самом деле проблема здесь в другом. Мы работаем с асинхронным генератором, а значит, и цикл, который его перебирает, тоже должен быть асинхронным.

Все снова отлично работает! Зачем это нужно, спросите вы? Прямо сейчас и узнаем.
Как написать парсер телеграм-каналов на Python
Основы языка Python
Курс для всех, а не только для IT-специалистовTelegram — один из самых популярных источников контента. Каналов в мессенджере столько, что следить за всеми самостоятельно просто нереально, не говоря уж об использовании и анализе получаемой информации.
Но зачем все делать вручную, когда за нас это может сделать приложение? Совместим приятное с полезным: напишем приложение для парсинга данных из любого телеграм-канала и параллельно закрепим тему асинхронных компонентов.
- Все о парсинге данных на бесплатном вебинаре Контур.Школы.
Шаг 1. Создаем приложение API для Telegram
Для начала необходимо завести аккаунт в Telegram, если его еще нет. Затем переходим по ссылке https://my.telegram.org/auth и авторизуемся с помощью номера телефона.
Код подтверждения придет прямо в мессенджере Telegram. Необходимо его ввести в поле Confirmation code.
.png)
В открывшемся окне переходим по ссылке API Development Tools. Вас перебросит в окно создания приложения. Необходимо заполнить основные поля.
Значения полей можно указывать любые. Для нас они не играют особой роли. Ставим точку напротив Desktop и подтверждаем заполнение кнопкой Create application.

Следующее окно отобразит важные параметры вашего приложения, которые нам и будут нужны для создания приложения на Python, — это App api_id и App api_hash.
Шаг 2. Устанавливаем библиотеку telethon
Теперь у нас есть все необходимое, чтобы приступить к созданию приложения в Python. Первым делом нам понадобится библиотека telethon, чтобы авторизоваться и получить доступ к данным аккаунта. Устанавливаем ее обычным способом.

Далее импортируем необходимые модули и сразу создадим переменные с данными для авторизации.

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

Здесь ‘test_tg’ — это название файла, который будет создан для хранения авторизационных данных приложения. Далее необходимо создать тот самый цикл обработки событий (event loop). Это будет асинхронная функция main ( ) , в которой мы пока напишем команду-заглушку pass. И сразу запустим этот цикл, используя один из методов запуска библиотеки telethon.

Теперь наше приложение необходимо запустить, чтобы пройти одноразовую авторизацию. Примерно так же вы устанавливаете приложение на компьютер и авторизуете его с помощью QR-кода. Запустите приложение — и в окне терминала увидите приглашение ввести проверочный код.

Можно ввести номер телефона — тогда следующее сообщение попросит одноразовый код, который придет в Telegram.

Если все выполнили верно, то ниже в терминале получите сообщение:

А также в списке файлов появится файл с авторизационными данными, имеющий расширение *.session.
Готово! Все последующие запуски вашего приложения уже будут выполняться без запроса одноразовых паролей. И код, написанный в обработчике событий main ( ) , будет сразу исполняться.
Шаг 3. Получаем первые данные из Telegram
Настало время сбора данных. Начнем с того, что у telethon есть неплохая документация, основные методы из которой мы и рассмотрим. Первая информация, которая нам доступна, — о нашем аккаунте.

Если проверим тип полученного объекта, то увидим знакомое сообщение.

Мы получаем корутину. То есть все методы клиента Telegram асинхронны. Еще бы — без асинхронности мы не смогли бы получать информацию одновременно из нескольких чатов, а отправка фотографии другу вообще застопорила бы все процессы на глобальном уровне.
Поэтому все методы вызываем только через await.
Полученный объект me содержит огромное количество свойств, включая ваше имя, фамилию, номер телефона, фотографию и много еще чего персонального, что афишировать не нужно. Просмотреть содержимое объекта удобно в режиме отладки.
Шаг 4. Получаем диалогиЧтобы получить список диалогов, воспользуемся еще одним методом клиента .get_dialogs( ).

В dialogs получим общее количество диалогов. Оно включает не только каналы, на которые мы подписаны, но и личные переписки. Можете посмотреть их количество в отладчике или воспользоваться функцией len(dialogs) и испытать шок от итогового количества. У меня 1540 диалогов.

Зачем специалисту Python
Бесплатный вебинар в Контур.ШколеТак как в dialogs нам, по сути, возвращается итерируемый объект, мы можем легко его перебрать с помощью обычного цикла for, чтобы найти именно тот канал или переписку, которые нам нужны.
Каждый элемент полученного dialogs — это объект класса Dialog библиотеки telethon. Посмотреть методы и свойства этого объекта можно в документации. Переберем диалоги по названиям и найдем нужный.
Шаг 5. Получаем сообщения из выбранного каналаУбедитесь, что нужный канал находится и вы получаете об этом сообщение. Когда канал у вас на руках, можно получить из него все сообщения, которые когда-либо были написаны.
Воспользуемся методом client.iter_messages(dialog), чтобы получить сообщения.

- Важно посмотреть на тип полученного значения у messages.

Получаем не готовый список, как в случае с диалогами, а итератор. Это не должно быть проблемой, потому что элементы итератора мы можем получить так же, как и элементы списка, — закинуть в цикл for.

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

Это именно то, о чем мы говорили в начале: нужен асинхронный for, чтобы перебирать элементы асинхронного итератора. Исправим эту ошибку и получим желаемый результат.

Единственное, что рекомендуется добавить, — обычную задержку между чтением каждого сообщения во избежание блокировок вашего аккаунта со стороны сервисов Telegram. Пусть будет медленно, зато спокойно и уверенно.
Напоследок рекомендуем также ознакомиться со всеми свойствами и методами объекта message. Основные из них, которые могут пригодиться при сборе полных данных, вынесены в таблицу.
date Свойство Содержит дату сообщения edit_date Свойство Содержит дату редактирования сообщения file Свойство Содержит файл, который приложен к сообщению download_media( ) Метод Позволяет загрузить файл, приложенный к сообщению is_reply Свойство Показывает, является ли сообщение ответом на другое сообщение forward Свойство Содержит информацию о первоисточнике, если текущее сообщение было переслано Конечно, в разных ситуациях могут потребоваться разные данные, но у этой статьи нет цели перепечатать всю документацию библиотеки telethon. На этой полезной ноте мы и завершим наше знакомство с асинхронным миром программирования.