Безголовый Chrome возвращает пустой HTML при использовании прокси - PullRequest
1 голос
/ 27 марта 2019

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

Я немного растерялся и ищу помощи.

Когда я отключаю прокси, он каждый раз работает идеально.

Когда я отключаю безголовый режим, я получаю пустое окно браузера, но если я нажимаю клавишу ВВОД в строке URL, которая имеет «https://www.whatsmyip.org", страница загружается (с использованием прокси-сервера с другим IP-адресом).

У меня такая же ошибка и для других веб-сайтов, этот результат имеет не только whatsmyip.org.

Я использую Centos7, Python 3.6 и Selenium 3.14.0.

Я также попробовал его на компьютере с Windows, на котором работает Anaconda, и получил те же результаты.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver import DesiredCapabilities
from selenium.webdriver.common.proxy import Proxy, ProxyType

my_proxy = "x.x.x.x:xxxx" #I have a real proxy address here
proxy = Proxy({
    'proxyType': ProxyType.MANUAL,
    'httpProxy': my_proxy,
    'ftpProxy': my_proxy,
    'sslProxy': my_proxy,
    'noProxy': ''
})

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--allow-insecure-localhost')
chrome_options.add_argument('--allow-running-insecure-content')
chrome_options.add_argument("--ignore-ssl-errors");
chrome_options.add_argument("--ignore-certificate-errors");
chrome_options.add_argument("--ssl-protocol=any");        
chrome_options.add_argument('--window-size=800x600')
chrome_options.add_argument('--disable-application-cache')

capabilities = dict(DesiredCapabilities.CHROME)
proxy.add_to_capabilities(capabilities)
capabilities['acceptSslCerts'] = True
capabilities['acceptInsecureCerts'] = True

browser = webdriver.Chrome(executable_path=r'/home/glen/chromedriver', chrome_options=chrome_options, desired_capabilities=capabilities)

browser.get('https://www.whatsmyip.org/')

print(browser.page_source)     

browser.close()

Когда я запускаю код, мне возвращается следующее:

<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body></body></html>

Не сайт.

1 Ответ

2 голосов
/ 27 марта 2019

Здесь есть две проблемы:

  1. Вам нужно подождать, пока браузер загрузит веб-сайт.
  2. browser.page_source не возвращает то, что вы хотите.

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

Вторая проблема заключается в том, что page_source возвращает не текущий DOM, а исходный HTML-код, загруженный браузером.Если JavaScript изменил страницу с тех пор, вы не увидите ее таким образом.

Решение состоит в том, чтобы найти элемент html и запросить свойство outerHtml:

from selenium.webdriver.common.by import By
htmlElement = driver.find_element(By.TAG_NAME, "html")
dom = htmlElement.getAttribute("outerHtml")
print(dom)

Подробности см. В примерах: https://www.seleniumhq.org/docs/03_webdriver.jsp#introducing-the-selenium-webdriver-api-by-example

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...