当使用 Selenium 和 Python 传递值时,动态下拉列表不会在 https://www.nseindia.com/ 上填充自动建议

Posted

技术标签:

【中文标题】当使用 Selenium 和 Python 传递值时,动态下拉列表不会在 https://www.nseindia.com/ 上填充自动建议【英文标题】:Dynamic dropdown doesn't populate with auto suggestions on https://www.nseindia.com/ when values are passed using Selenium and Python 【发布时间】:2020-10-08 22:19:42 【问题描述】:
driver = webdriver.Chrome('C:/Workspace/Development/chromedriver.exe')
driver.get('https://www.nseindia.com/companies-listing/corporate-filings-actions')
inputbox = driver.find_element_by_xpath('/html/body/div[7]/div[1]/div/section/div/div/div/div/div/div[1]/div[1]/div[1]/div/span/input[2]')
inputbox.send_keys("Reliance")

我正在尝试从website 中抓取表格,您在其上方的文本字段中输入公司名称后会出现该表格。附加的代码块适用于普通谷歌搜索和 wolfram 网站的类似下拉列表,但是当我在所需网站上运行我的脚本时,基本上只是在文本字段中输入所需的文本 - 下拉列表显示“未找到记录',而手动完成时效果很好。

【问题讨论】:

【参考方案1】:

我执行了您的测试并添加了一些调整并运行测试如下:

代码块:

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

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'C:\WebDrivers\chromedriver.exe')
driver.get('https://www.nseindia.com/companies-listing/corporate-filings-actions')
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@id='Corporate_Actions_equity']//input[@placeholder='Company Name or Symbol']"))).send_keys("Reliance")

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


深入研究

似乎 Get Data 元素上带有文本的元素上的 click() 确实发生了。但是在检查 webpage 的 DOM Tree 时,您会发现一些 <script> 标记引用具有关键字 akamjavascripts。举个例子:

<script type="text/javascript" src="https://www.nseindia.com/akam/11/3b383b75" defer=""></script> <noscript><img src="https://www.nseindia.com/akam/11/pixel_3b383b75?a=dD02ZDMxODU2ODk2YTYwODA4M2JlOTlmOGNkZTY3Njg4ZWRmZjE4YmMwJmpzPW9mZg==" style="visibility: hidden; position: absolute; left: -999px; top: -999px;" /></noscript>

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


机器人管理器

根据文章Bot Manager - Foundations:


结论

所以可以断定,对数据的请求被检测到是由Selenium驱动的WebDriver实例执行的,响应被阻塞了。


参考文献

一些文档:

Bot Manager Bot Manager : Foundations

tl;博士

几个相关的讨论:

Selenium webdriver: Modifying navigator.webdriver flag to prevent selenium detection Unable to use Selenium to automate Chase site login

【讨论】:

非常感谢您的回答!我知道我必须改变我的整个方法来从网站上抓取我想要的东西,并在学习新事物的过程中。如果有兴趣 - 我在检查 JS 文件时掌握了这个 --> (www1.nseindia.com/corporates/corpInfo/equities/…) JSON 格式让我很容易得到我想要的。 useautomationextension 现已弃用。 chromedriver 源代码中似乎不再有任何自动化扩展。他们现在做了什么以及如何绕过检测?

以上是关于当使用 Selenium 和 Python 传递值时,动态下拉列表不会在 https://www.nseindia.com/ 上填充自动建议的主要内容,如果未能解决你的问题,请参考以下文章

将会话ID从Selenium传递到Python请求

如何使用 Python 将选项传递给 Selenium Chrome 驱动程序?

按值查找元素 Selenium/Python

使用python selenium检索href值

如何在传递到节点之前替换 Selenium 网格中的能力值

带有Python的Selenium Webdriver - 无法使用Selenium Web驱动程序在Web应用程序中提供输入(Date)