硒:访问被拒绝

Mud*_*yla 5 python selenium google-chrome selenium-chromedriver selenium-webdriver

我正在尝试使用 Selenium 从 LV 网站上抓取一些数据,并在单击“登录”按钮后不断收到“访问被拒绝”屏幕。我觉得有一种保护措施可以防止这种情况,因为当我手动执行相同操作时,一切似乎都工作正常。奇怪的是,我需要单击“登录”按钮两次才能手动登录。

我的代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path=r'chromedriver.exe')
driver.get('https://secure.louisvuitton.com/eng-gb/mylv')
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//span[@class='ucm-wrapper']")))
driver.find_element_by_xpath("//button[@class='ucm-button ucm-button--default ucm-choice__yes']").click()
driver.find_element_by_id('loginloginForm').send_keys('xxx@xxx.com')
driver.find_element_by_id ('passwordloginForm').send_keys('xxxxxx')
driver.find_element_by_id('loginSubmit_').click()

Run Code Online (Sandbox Code Playgroud)

错误:

You don't have permission to access "http://secure.louisvuitton.com/eng-gb/mylv;jsessionid=xxxxxxx.front61-prd?" on this server.
Run Code Online (Sandbox Code Playgroud)

有没有办法用 Selenium 登录并绕过这个?

Deb*_*anB 6

我对您的代码添加了一些调整并运行测试,如下所示:

  • 代码块:

    from selenium import webdriver
    driver.get('https://secure.louisvuitton.com/eng-gb/mylv')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Accept and Continue']"))).click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='loginloginForm']"))).send_keys("Mudyla@stackoverflow.com")
    driver.find_element_by_xpath("//input[@id='passwordloginForm']").send_keys('Mudyla')
    driver.find_element_by_xpath("//input[@id='loginSubmit_']").click()
    
    Run Code Online (Sandbox Code Playgroud)

观察

与您的观察类似,我遇到了同样的障碍,但没有结果,如下所示:

拒绝访问


深潜

看来确实click()发生Sign In了。但是在检查网页DOM 树时,您会发现某些标签引用了具有关键字akam的JavaScript。举个例子:<script>

  • akam-sw.js install script version 1.3.3 "serviceWorker"in navigator&&"find"in[]&&function()
  • <script type="text/javascript" src="https://secure.louisvuitton.com/akam/11/7f0e2ae6" defer=""></script>
  • <noscript><img src="https://secure.louisvuitton.com/akam/11/pixel_7f0e2ae6?a=dD0xOWNjNTRjMmMxYzdmNmMwZjI0NTUwOGZmZDM5ZTQzMWQ5NjI5ZmIwJmpzPW9mZg==" style="visibility: hidden; position: absolute; left: -999px; top: -999px;" /></noscript>

这清楚地表明该网站受到Bot Manager ( Akamai提供的高级机器人检测服务)的保护,并且响应被阻止


机器人经理

根据文章Bot Manager - Foundations

akamai_检测


结论

因此可以得出结论,检测到数据请求是由Selenium驱动的WebDriver实例执行的,并且响应被阻止。


参考

几个文档:


TL; 博士

一些相关讨论:


Mud*_*yla 3

自从我发布这个问题以来已经有一段时间了,但如果有人感兴趣的话,下面是我为解决问题所采取的步骤。

  1. 在十六进制编辑器中打开chromedriver.exe,找到该字符串$cdc并替换为相同长度的其他内容。然后保存并运行修改后的二进制文件。阅读此答案及其回复中的更多内容。

  2. 硒Python代码:

options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path='chromedriver.exe')
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                                                                     'AppleWebKit/537.36 (KHTML, like Gecko) '
                                                                     'Chrome/85.0.4183.102 Safari/537.36'})
Run Code Online (Sandbox Code Playgroud)