Selenium webdriver Python Selenium无法获取数据

Selenium webdriver Python Selenium无法获取数据,selenium-webdriver,selenium-chromedriver,python-3.6,selenium-firefoxdriver,Selenium Webdriver,Selenium Chromedriver,Python 3.6,Selenium Firefoxdriver,我试图从www1.nseindia.com下载24个月的数据,但在Chrome和Firefox驱动程序上失败。它只是在将所有值填充到所需位置后冻结,并且不会单击。该网页没有响应 下面是我正在尝试执行的代码: import time from selenium import webdriver from selenium.webdriver.support.ui import Select id_list = ['ACC', 'ADANIENT'] # Chrome def EOD_data_

我试图从www1.nseindia.com下载24个月的数据,但在Chrome和Firefox驱动程序上失败。它只是在将所有值填充到所需位置后冻结,并且不会单击。该网页没有响应

下面是我正在尝试执行的代码:

import time
from selenium import webdriver
from selenium.webdriver.support.ui import Select

id_list = ['ACC', 'ADANIENT']

# Chrome
def EOD_data_Chrome():
    driver = webdriver.Chrome(executable_path="C:\Py388\Test\chromedriver.exe")
    driver.get('https://www1.nseindia.com/products/content/equities/equities/eq_security.htm')
    s1= Select(driver.find_element_by_id('dataType'))
    s1.select_by_value('priceVolume')
    s2= Select(driver.find_element_by_id('series'))
    s2.select_by_value('EQ')
    s3= Select(driver.find_element_by_id('dateRange'))
    s3.select_by_value('24month')
    driver.find_element_by_name("symbol").send_keys("ACC")
    driver.find_element_by_id("get").click()
    time.sleep(9)
    s6 = Select(driver.find_element_by_class_name("download-data-link"))
    s6.click()

# FireFox(Gecko)
def EOD_data_Gecko():
    driver = webdriver.Firefox(executable_path="C:\Py388\Test\geckodriver.exe")
    driver.get('https://www1.nseindia.com/products/content/equities/equities/eq_security.htm')
    s1= Select(driver.find_element_by_id('dataType'))
    s1.select_by_value('priceVolume')
    s2= Select(driver.find_element_by_id('series'))
    s2.select_by_value('EQ')
    s3= Select(driver.find_element_by_id('dateRange'))
    s3.select_by_value('24month')
    driver.find_element_by_name("symbol").send_keys("ACC")
    driver.find_element_by_id("get").click()
    time.sleep(9)
    s6 = Select(driver.find_element_by_class_name("download-data-link"))
    s6.click()


EOD_data_Gecko()

# Change the above final line to    "EOD_data_Chrome()" and still it just remains stuck...
请帮助下载24个月的数据,代码中缺少什么。。。当我在普通浏览器中执行相同操作时,通过手动单击,它是成功的

在浏览器中手动执行此操作时,可以按以下方式更改值:

Set first drop down to : Security wise price volume data
"Enter Symbol"  :  ACC
"Select Series"   :  EQ
"Period" (radio button: "For Past") : 24 Months
然后单击“获取数据”按钮,在大约3-5秒内加载数据,然后当您单击“下载CSV格式的文件”时,您可以在下载中获得CSV文件

需要使用Python中任何已知的用于刮取的库的帮助:Selenium、Beautifulsoup、Requests、Scrasty等。。。其实并不重要,除非是python

编辑:@Patrick Bormann,请找到截图。。。“获取数据”按钮起作用。。

当您说它是手动工作的时候,您是否尝试过用动作链模拟单击,而不是内部单击功能

from selenium.webdriver.common.action_chains import ActionChains
easy_apply = Select(driver.find_element_by_id('dateRange'))
actions = ActionChains(driver)
actions.move_to_element(easy_apply)
actions.click(easy_apply)
actions.perform()
然后模拟鼠标移动到特定值

另外,我自己试过了,按下“获取数据”按钮时,我没有得到任何数据,因为它似乎有你提到的“获取”类,但这个按钮不起作用,但正如你所看到的,还有第二个按钮叫做“完全下载”,也许ypu试着使用这个按钮?因为GetData按钮在Firefox和Chrome上不起作用(当我测试它时)

你是否已经尝试通过链接捕捉它

更新

当OP在这个紧急事件中寻求帮助时,我提出了一个有效的解决方案

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
from selenium.webdriver.support.ui import Select


chrome_driver_path = "../chromedriver.exe"


driver = webdriver.Chrome(executable_path=chrome_driver_path)
driver.get('https://www1.nseindia.com/products/content/equities/equities/eq_security.htm')
driver.execute_script("document.body.style.zoom='zoom 25%'")
time.sleep(2)
price_volume = driver.find_element_by_xpath('//*[@id="dataType"]/option[2]').click()
time.sleep(2)
date_range = driver.find_element_by_xpath('//*[@id="dateRange"]/option[8]').click()
time.sleep(2)
series = driver.find_element_by_name('series')
time.sleep(2)
drop = Select(series)
drop.select_by_value("EQ")
time.sleep(2)
driver.find_element_by_name("symbol").send_keys("ACC")
ez_download = driver.find_element_by_xpath('//*[@id="wrapper_btm"]/div[1]/div[3]/a')
actions = ActionChains(driver)
actions.move_to_element(ez_download)
actions.click(ez_download)
actions.perform()
给你,抱歉,花了一点时间,不得不带我儿子上床睡觉。。。 这个解决方案提供了这样的输出:我希望它是正确的。如果要选择其他下拉菜单,可以更改select中的字符串(字符串因为索引太多而太难处理)或xpath中的数字,因为数字突出显示索引。时间通常仅用于需要时间在网页上构建自己的元素。但我有过这样的经历:太快的变化有时会导致错误。请随意更改时间限制,看看它是否仍然有效

我希望你现在能继续为在印度的生活赚钱。 祝你一切顺利,帕特里克

如果您有任何问题,请随时提问

更新2

经过一个漫长的夜晚和另一天,我们发现冻结源于网站,正如网站使用的:

Boomerang | Akamai Developer Developer.Akamai.com/tools/…Boomeragis 用于实时用户监控的JavaScript库(通常称为RUM)。 Boomerang衡量真实页面的性能特征 荷载和相互作用。本页文档仅供mPulse参考 飞镖有关回飞棒的通用API文档可以找到 atdocs.soasta.com/boomeragapi/。 . 我从html标题中发现了什么

这显然是一个机器人检测网络/javascript。借助此SO帖子:

以及该帖子的第二段:

我终于解决了这个问题: 我们换了房间

将chromedriver中的var_键设置为其他类似的内容:

var key = '$dsjfgsdhfdshfsdiojisdjfdsb_';
此外,我将代码更改为:

import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import Select
from selenium.webdriver.chrome.options import Options
options = webdriver.ChromeOptions()

chrome_driver_path = "../chromedriver.exe"
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
options.add_argument('--disable-blink-features=AutomationControlled')

driver = webdriver.Chrome(executable_path=chrome_driver_path, options=options)
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")


driver.get('http://www1.nseindia.com/products/content/equities/equities/eq_security.htm')
driver.execute_script("document.body.style.zoom='zoom 25%'")
time.sleep(5)
price_volume = driver.find_element_by_xpath('//*[@id="dataType"]/option[2]').click()
time.sleep(3)
date_range = driver.find_element_by_xpath('//*[@id="dateRange"]/option[8]').click()
time.sleep(5)
series = driver.find_element_by_name('series')
time.sleep(3)
drop = Select(series)
drop.select_by_value("EQ")
time.sleep(4)
driver.find_element_by_name("symbol").send_keys("ACC")
actions = ActionChains(driver)
ez_download = driver.find_element_by_xpath('/html/body/div[2]/div[3]/div[2]/div[1]/div[3]/div/div[1]/form/div[2]/div[3]/p/img')
actions.move_to_element(ez_download)
actions.click(ez_download)
actions.perform()
#' essential because the button has to be loaded
time.sleep(5)
driver.find_element_by_class_name('download-data-link').click()

代码终于起作用了,OP很高兴。

我将在深夜尝试处理它。我会回到你身边。我会从现在开始,当我有事情要做的时候再回来,坚持下去,我做完了,我的解决方案也起作用了。请看。如果一切顺利,我会很高兴你能将我的答案标记为正确并投赞成票。如果仍然有错误,请不要犹豫,回到我身边!我很高兴能帮上忙!等等,我现在就换。。