使用代理时无头 Chrome 返回空值 HTML
Headless Chrome returning empty HTML when using a Proxy
我想使用无头浏览器来抓取一些网站,需要使用代理服务器。
我有点迷茫,正在寻求帮助。
当我禁用代理时,它每次都能正常工作。
当我禁用无头模式时,我得到一个空的浏览器 window,但是如果我在具有“https://www.whatsmyip.org”的 URL 栏上按回车键,页面加载(使用代理服务器显示不同的 IP)。
我对其他网站也有同样的错误,不仅仅是 whatsmyip.org 有这个结果。
我是 运行ning Centos7、Python 3.6 和 Selenium 3.14.0。
我也在 Windows 机器 运行ning 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>
不是网站。
这里有两个问题:
- 您需要等待浏览器加载网站。
browser.page_source
没有 return 你想要的。
第一个问题通过等待元素出现在 DOM 中解决。通常,你会想抓取一些东西,这样你就知道如何识别元素。添加代码以等待该元素存在。
第二个问题是 page_source
不是 return 当前 DOM 而是浏览器加载的初始 HTML。如果 JavaScript 从那以后修改了页面,您将不会以这种方式看到它。
解决方案是找到 html
元素并请求 outerHtml
属性:
from selenium.webdriver.common.by import By
htmlElement = driver.find_element(By.TAG_NAME, "html")
dom = htmlElement.get_attribute("outerHTML")
print(dom)
有关详细信息,请参阅示例:https://www.seleniumhq.org/docs/03_webdriver.jsp#introducing-the-selenium-webdriver-api-by-example
没有解决问题的小伙伴们看看这个(python):
options.add_arguments("disable-blink-features=AutomationControlled")
有些站点可以检测到自动化软件并故意阻止正确加载内容。
来源:ChromeDriver with Selenium displays a blank page
我想使用无头浏览器来抓取一些网站,需要使用代理服务器。
我有点迷茫,正在寻求帮助。
当我禁用代理时,它每次都能正常工作。
当我禁用无头模式时,我得到一个空的浏览器 window,但是如果我在具有“https://www.whatsmyip.org”的 URL 栏上按回车键,页面加载(使用代理服务器显示不同的 IP)。
我对其他网站也有同样的错误,不仅仅是 whatsmyip.org 有这个结果。
我是 运行ning Centos7、Python 3.6 和 Selenium 3.14.0。
我也在 Windows 机器 运行ning 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>
不是网站。
这里有两个问题:
- 您需要等待浏览器加载网站。
browser.page_source
没有 return 你想要的。
第一个问题通过等待元素出现在 DOM 中解决。通常,你会想抓取一些东西,这样你就知道如何识别元素。添加代码以等待该元素存在。
第二个问题是 page_source
不是 return 当前 DOM 而是浏览器加载的初始 HTML。如果 JavaScript 从那以后修改了页面,您将不会以这种方式看到它。
解决方案是找到 html
元素并请求 outerHtml
属性:
from selenium.webdriver.common.by import By
htmlElement = driver.find_element(By.TAG_NAME, "html")
dom = htmlElement.get_attribute("outerHTML")
print(dom)
有关详细信息,请参阅示例:https://www.seleniumhq.org/docs/03_webdriver.jsp#introducing-the-selenium-webdriver-api-by-example
没有解决问题的小伙伴们看看这个(python):
options.add_arguments("disable-blink-features=AutomationControlled")
有些站点可以检测到自动化软件并故意阻止正确加载内容。
来源:ChromeDriver with Selenium displays a blank page