我希望这个问题问得合适,我已经为这个问题找了一个多月了。
我一直在使用python selenium来访问富达股票筛选器。我是selenium的新手,对Python也相当陌生,我用这个只是为了翻阅页面并下载所有内容,因为该网站一次只允许你下载大约7000个条目中的500个条目。一切都很好,但是现在当我尝试登录网站时,它会抛出一个错误。
这个错误提到了一个技术问题,由于第三方浏览器扩展和尝试隐身模式。然而,这个错误不会出现在我的普通chrome浏览器上,尽管尝试了隐身模式和其他选项(如下),但它仍然存在,并且只在大约3月份开始,尽管自去年9月以来运行良好。我不知道是更新了chrome/chomedriver(使用最新的),还是网站以某种方式阻止了我。
基本代码如下,这是从不同的地方拼凑起来的,但它确实有效:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common import by
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC
import selenium.common.exceptions as exceptions
from selenium.webdriver.common.keys import Keys
import time
import os
#activate driver using executable path provided in quotes
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome('driver/chromedriver')
#go to stock screener page
driver.get('https://research2.fidelity.com/pi/stock-screener#results')
### below code requires setting username and password
username_fidelity="ABC"
password_fidelity="XYZ"
username_textbook_fidelity=driver.find_element_by_id("userId")
username_textbook_fidelity.send_keys(username_fidelity)
username_textbook_fidelity=driver.find_element_by_id("password")
username_textbook_fidelity.send_keys(password_fidelity)
login_button_fidelity=driver.find_element_by_id("Login")
login_button_fidelity.submit()
输入用户名/密码iis后,它会显示一个有关技术错误的错误页面。当我使用普通的chrome浏览器时,这不会足球。错误消息说:
我们目前发现某些第三方浏览器插件存在问题,导致访问富达网站时出现问题。请尝试以隐身模式运行浏览器-或在我们与第三方合作解决问题时使用替代浏览器。如果您继续收到此页面,请联系客户支持并向他们提供以下参考编号。参考错误:18.8cee2117.1653688699.1eaaf206
我不确定如何提供一个可重复的示例,因为它涉及Fidelity用户名/密码,但我认为如果您在登录时尝试上述代码,您会明白我的意思。
我尝试过的东西(我对这些意思的理解有限,但我读到它们可能相关,但没有用):
我尝试设置用户代理,但它似乎与我的普通chrome浏览器相同。(Mozilla/5.0(Macintosh;Intel MacOSX10_15_7)AppleWebKit/537.36(KHTML,如Gecko)Chrome/102.0.5005.61Safari/537.36)
我也尝试了很多其他的东西,包括删除所有selenium chromeriver选项,以便它们匹配chrome命令行的东西(根据url chrome://version/),但这不起作用。Selenium浏览器有所有这些命令行参数,而普通的chrome浏览器没有。下面的代码删除了(chrome://version/)中的所有“命令行”参数,除了“telte-degging-port=0”,不知道为什么。但它不起作用。
chrome_options = webdriver.ChromeOptions()
exclude_these = ['allow-pre-commit-input',
'disable-background-networking',
"disable-client-side-phishing-detection",
"disable-default-apps",
"disable-hang-monitor",
"disable-popup-blocking",
"disable-prompt-on-repost",
"disable-sync",
"enable-automation",
"enable-blink-features",
"enable-logging",
"log-level",
"no-first-run",
"no-service-autorun",
"password-store",
"remote-debugging-port",
"test-type",
"use-mock-keychain"]
chrome_options.add_experimental_option("excludeSwitches", exclude_these)
driver = webdriver.Chrome('driver/chromedriver',
options=chrome_options)
我尝试禁用扩展、自动化、incgnito模式(如其所述),这些都不起作用:
chrome_options.add_argument("--disable-extensions")
chrome_options.add_experimental_option('useAutomationExtension', False)
chrome_options.add_argument("--incognito")
我尝试使用mozilla火狐与gecko驱动程序,相同的错误页面。
如果有人能提出什么建议,那就太好了!!谢谢。
你想用undetected_chromedriver来克服这一点。
https://github.com/ultrafunkamsterdam/undetected-chromedriver
只需Pip3安装未检测到的ChromeDrive
并做你正在做的事情(一些为驱动程序指定选项/首选项的方式可能需要更改,请查看上面github上的帮助)
还有,不要去存量筛选器url强制登录
首先浏览www.fidelity.com(get),获取_abckcookie(阿卡迈),然后通过浏览登录https://digital.fidelity.com/prgw/digital/login/full-page
做你的用户名/通行证/登录的事情
显然,Fidelity会检测浏览器何时由web驱动程序启动并拒绝登录。保存cookie不会做任何事情,因为web驱动程序无论如何都会自动执行。
解决方案是从带有调试端口的命令行启动浏览器并使web驱动程序连接到它。然后像以前一样使用登录逻辑。在Ubuntu 16.04,Chromev.111.0.5563.64上测试,例如。
命令行:
chrome --remote-debugging-port=9222 --user-data-dir="~/chrome-data"
Java程序:
ChromeOptions options = new ChromeOptions();
options.addArguments("−−incognito");
options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");
System.setProperty("webdriver.chrome.driver", driverPath);
webDriver = new ChromeDriver(options);