堆叠:Windows 8.1, Python 3.4.3.4, Selenium 2.46, Chromedriver 2.16
我使用Selenium Python绑定Chromedriver从以下网址自动执行某些下载:r'http://financials.morningstar.com/'
我已设置以下chromedriver首选项:
chromeOptions = webdriver.ChromeOptions()
prefs = {'download.default_directory':symbol_dir}
chromeOptions.add_experimental_option('prefs', prefs)
chromeOptions.add_extension(self.chromeUBlock_path)
chromedriver_path = self.chromedriver_path
此外,我已经设置了以下selenium代码来运行下载,它可以正常运行并下载到正确的文件位置等。
symbol = 'AAPL' # test symbol
IS_anl_statement = 'income-statement'
IS_anl_abbrev = 'is'
url_anl = self.mstar_base_url + r'{}/{}.html?t={}®ion=usa&culture=en-US'
IS_anl = webdriver.Chrome(executable_path=chromedriver_path, chrome_options=chromeOptions)
IS_anl.set_page_load_timeout(90)
try:
IS_anl.get(url_anl.format(IS_anl_statement, IS_anl_abbrev, symbol))
anl_element = WebDriverWait(IS_anl, 90).until(EC.element_to_be_clickable(
(By.LINK_TEXT, 'Annual')))
anl_csv_element = WebDriverWait(IS_anl, 90).until(EC.element_to_be_clickable(
(By.CSS_SELECTOR,self.css_path_export)))
anl_csv_element.click()
for i in range(1,10,1):
time.sleep(i/50)
if os.path.isfile(anl_file_string)==True:
break
except Exception as e:
print(e)
IS_anl.quit()
但是,使用以下缩写运行下载时(只需将balance-sheet
替换为income-statement
,就像这样:
BS_anl_statement = 'balance-sheet'
BS_anl_abbrev = 'bs'
和剩下的Selenium代码完全相同我得到了可怕的下载错误:
Failed-Path Too Long
这很奇怪,因为实际的文件路径不太长。事实上,我在3个不同的目录中测试了下载,每个目录的文件路径都比上一个短。最后的示例路径是:r"C:\mstar_data\\"
我被困住了。我在两次下载尝试之间看到的唯一区别是实际的CSV
链接。但即使在这种情况下,Income-Statement
下载网址实际上比Balance-Sheet
长,所以我再次陷入困境。他们在这里:
I / S CSV网址:
http://financials.morningstar.com/ajax/ReportProcess4CSV.html?&t=XNAS:ZUMZ®ion=usa&culture=en-US&cur=&reportType=is&period=12&dataType=A&order=asc&columnYear=5&curYearPart=1st5year&rounding=3&view=raw&r=573205&denominatorView=raw&number=3
B / S CSV网址:
http://financials.morningstar.com/ajax/ReportProcess4CSV.html?&t=XNYS:A®ion=usa&culture=en-US&cur=&reportType=bs&period=12&dataType=A&order=asc&columnYear=5&curYearPart=1st5year&rounding=3&view=raw&r=558981&denominatorView=raw&number=3
任何有关这种不一致的帮助都将是一个很大的帮助,非常感谢。感谢。
答案 0 :(得分:1)
我能够找到解决此问题的方法。 @Skandigraun是对的,有一段代码试图过早地使用下载的文件。
我使用@Override
protected void onCreate(Bundle bundle) {
connection = Connection.getInstance(this);
connection.addObserver(this);
}
@Override
protected void onStart() {
connection.connect();
}
@Override
protected void onDestroy() {
connection.deleteObserver(this);
connection.disconnect();
}
@Override
protected void onActivityResult(int request, int result, Intent data) {
if (Connection.REQUEST_CODE == request) {
connection.onActivityResult(result);
}
}
@Override
public void update(Observable observable, Object data) {
if (observable != connection) {
return;
}
// Your presentation logic goes here...
}
清除所有临时文件,互联网历史记录等。
我重新启动了电脑。
我修改了以下关于Skandigraun评论的代码块:
Advanced Uninstaller
为:
for in range(1, 10, 1):
time.sleep(i/50)
if os.path.isfile(anl_file_string)==True:
break
我补充道:
for i in range(1, 10, 1):
time.sleep(i/20) # changed from 50 to 20
if os.path.isfile(anl_file_string)==True:
break
现在代码运行稳定性更高。我相信os调用测试文件是否存在过快/频繁发生并导致下载失败。我将finally:
IS_anl.quit()
语句添加到finally
循环以关闭浏览器,无论发生什么。如果访问站点时出现问题,超时错误等,则会阻止脚本挂起。