提问者:小点点

使用selenium python webriver浏览Fidelity股票筛选器抛出有关第3方浏览器插件的错误


我希望这个问题问得合适,我已经为这个问题找了一个多月了。

我一直在使用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驱动程序,相同的错误页面。

如果有人能提出什么建议,那就太好了!!谢谢。


共2个答案

匿名用户

你想用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);