Получить текущую открытую страницу Chrome в html без ее сохранения

Я реализую скрипт python в основном на основе pyautogui. Одна из вещей, которую делает скрипт, — это открытие веб-страницы Chrome. После этого мне нужно будет получить доступ к DOM этой открытой в данный момент веб-страницы. Поскольку я не открывал браузер с селеном, я не могу использовать его для анализа DOM. Однако мой вопрос: доступна ли эта открытая в настоящее время хромированная страница / сохранена ли она где-то на жестком диске, чтобы я мог получить к ней доступ с помощью селена? Как файл .html? Я проверил здесь много других вопросов, и пользователи говорят о кеше Chrome, но там нет html-файлов. Мне просто нужно иметь доступ к текущей открытой странице, а не ко всем историческим данным в кеше. Открытие веб-браузера непосредственно с помощью селена также не является вариантом, поскольку большинство проанализированных веб-сайтов имеют технологию капчи и дистилляции. Спасибо.


person Angelo    schedule 21.09.2018    source источник
comment
Эммм... что именно вам нужно? Просто DOM, как html? Вы можете получить исходный код с помощью webdriver.page_source, который вы сможете сохранить позже. Он будет содержать отображаемый в данный момент html (в основном тот же, что вы получаете с помощью CTRL-U в любом браузере), но не внешние ресурсы (никаких файлов css/js/pic/whataver, только ссылка на них)   -  person skandigraun    schedule 21.09.2018
comment
@skandigraun Мне нужны DOM, но помните, что я не открываю браузер Chrome с помощью селена.   -  person Angelo    schedule 21.09.2018
comment
почему это вопрос о селене, если вы не хотите использовать селен. И нет, современные браузеры не сохраняют текущую страницу на диск. Но поскольку неясно, какой у вас доступ к браузеру (кроме того, что вы не используете селен), не уверен, что сможем помочь с такими небольшими деталями.   -  person Kiril S.    schedule 21.09.2018
comment
@КирилС. Спасибо Кирилл. Итак, давайте рассмотрим этот пример. У вас есть веб-сайт (чисто в качестве примера), такой как streeteasy.com Теперь, когда вы пытаетесь получить к нему доступ с помощью селена, Distil Network поймет, что вы используете селен, и вы не уйдете далеко. Теперь обходной путь, на мой взгляд, состоит в том, чтобы открыть браузер без селена, перейти на нужную страницу с помощью pyautogui, а затем получить доступ к содержимому страницы, возможно, с помощью селена. Но как селен может получить доступ к содержимому веб-страницы, не открытой с помощью селена? Вот почему я пометил селен как тему.   -  person Angelo    schedule 21.09.2018
comment
Ааа, скоро я научусь читать :D. На самом деле это возможно. Если вы запустите исходный Chrome с аргументом --remote-debugging-port=PORT_NR, а затем посетите localhost:PORT_NR из другого браузера, вы получите доступ ко всем содержимое исходного браузера, включая консоль разработчика. Также доступна некоторая документация по API (хотя и очень скудная), ищите chrome devtools protocol. Однако, посещая порт с селеном, у вас должно быть относительно легкое время для работы.   -  person skandigraun    schedule 21.09.2018
comment
взгляните на это: stackoverflow.com/questions/33225947/, некоторые сайты действительно примитивны в отношении обнаружения селена, поэтому вы можете переопределить его. Иначе то, что сказал скандиграун, или используя какой-то аддон. Я не думаю, что вы можете подключиться к существующему экземпляру браузера с помощью селена, или, если бы вы могли, это, вероятно, все равно активировало бы защиту этого сайта...   -  person Kiril S.    schedule 21.09.2018
comment
@skandigraun спасибо! Итак, я уже проверяю в Интернете и провожу некоторые исследования, но вы дали мне отличную подсказку. Извиняюсь за мое невежество, я попытался запустить следующий код Python, но он выдает сообщение об ошибке: subprocess.call([rC:\Program Files (x86)\Google\Chrome\Application\chrome.exe --remote-debugging- port=PORT_NR]) --› ошибка: [WinError 2] Система не может найти указанный файл. Есть ли шанс, что вы можете сказать, что не так?   -  person Angelo    schedule 21.09.2018
comment
@KirilS.Спасибо, Кирилл. Я прочитал эту страницу около 50 раз :) и поэтому я решил, что попытка выиграть Дистиль, вероятно, будет для меня слишком сложной задачей. Поэтому я пытался найти способ найти элементы на веб-странице, которые я не открываю с помощью селена :(   -  person Angelo    schedule 21.09.2018
comment
Назовите его как subprocess.call (["CHROME_EXECUTEABLE_PATH", "--remote-debugging-port=9222"]) — аргумент должен быть новым элементом массива. PORT_NR должен быть фактическим числом. Затем зайдите на localhost:9222 в новом браузере.   -  person skandigraun    schedule 21.09.2018
comment
@skandigraun большое спасибо, очень признателен. Мне удалось успешно запустить subprocess.call. Я открыл там, например, streeteasy.com. Если бы у вас был пример того, как я могу получить любой простой контент на этом этапе, используя 'localhost:9222/json' это действительно сделало бы мой день. Еще раз спасибо за вашу помощь   -  person Angelo    schedule 21.09.2018
comment
Если вы работаете без Selenium, вам понадобится подключение к веб-сокету. Отправьте запрос GET в /json и получите нужный URL-адрес веб-сокета (webSocketDebuggerUrl). Откройте соединение через веб-сокет и отправьте команду, например {"method": "DOM.getDocument", "id":12}. Идентификатор обязателен, может быть любым целым числом. Кроме того, должен быть действительный JSON. Найдите доступные методы, связанные с DOM, здесь: chromedevtools.github.io/devtools-protocol/1. -3/DOM (Если это хоть немного поможет, создам ответ, прежде чем моды убьют нас за миллион комментариев...)   -  person skandigraun    schedule 21.09.2018
comment
@skandigraun Думаю, у тебя достаточно подсказок. Если вы создадите ответ, я смогу проголосовать за него и убедиться, что вы получите вознаграждение за вашу помощь. Спасибо еще раз   -  person Angelo    schedule 21.09.2018
comment
О да... милые интернет-точки, вот и я :D   -  person skandigraun    schedule 21.09.2018


Ответы (1)


Если вы запустите исходный хром с аргументом --remote-debugging-port=PORT_NR и посетите localhost:PORT_NR из другого браузера, у вас будет доступ ко всему содержимому браузера, включая консоль разработчика.

Если у вас есть это, у вас есть несколько путей:

  1. Вы можете посетить http://localhost:PORT_NR в любом другом браузере (или даже в том же браузере), и вы должен иметь полный доступ к содержимому оригинального Chrome. С Selenium вам должно быть относительно легко обойтись.

  2. Вы также можете использовать devtools api (документация... есть... ну... есть возможности для улучшения. Ищите chrome devtools protocol, чтобы быть пораженным отсутствием документации). Например, вы можете перейти по адресу http://localhost:PORT_NR/json, чтобы получить доступные URI отладки. Возьмите соответствующую конечную точку веб-сокета (webSocketDebuggerUrl). Откройте соединение через веб-сокет и введите команду, например {"method": "DOM.getDocument", "id":12}. Вы можете найти доступные команды, связанные с DOM, здесь: https://chromedevtools.github.io/devtools-protocol/1-3/DOM

person skandigraun    schedule 21.09.2018