class Stock: def __init__(self, driver): self.log = Log('Stocks.log') self.driver = driver self.seleniumWrapper = SeleniumWrapper(self.driver) def dividendPercentage(self, dividendString): fromIndex = dividendString.find('(') fromIndex += 1 toIndex = dividendString.find('%') percentageString = "" for i in range(fromIndex, toIndex, 1): percentageString += dividendString[i] return percentageString def __makeDictionaryByStockStatsRaw(self, stockStatsRaw): stockStatsSplited = stockStatsRaw.split('\n') stockStatsSplited = list(filter(None, stockStatsSplited)) print(stockStatsSplited) data = { 'Prev Close': '', 'Day\'s Range': '', '52 Week Range': '', 'Average Volume (3m)': '', '1-Year Return': '', 'Beta': '', 'Market Cap': '', 'P/E Ratio': '', 'Revenue': '', 'EPS': '', 'Dividend (Yield)': '' } index = 0 while (index < len(stockStatsSplited)): value = "" try: value = data[stockStatsSplited[index]] except: index += 1 continue key = stockStatsSplited[index] index += 1 try: value = data[stockStatsSplited[index]] except: data[key] = stockStatsSplited[index] index += 1 data['Dividend (Yield)'] = self.dividendPercentage( data['Dividend (Yield)']) return data #return a dictionay: stat -> value def getStockStats(self, stockId): url = 'https://www.etoro.com/markets/' url += stockId url += '/stats' print("Trying to download " + url) #self.seleniumWrapper.getRequestWaitUntilLocatedElementByXpath( # url, # '/html/body/ui-layout/div/div/div[2]/et-market/div/div/div/div[3]/et-market-stats/et-market-stats-overview/et-card/section/et-card-content/div[1]') self.seleniumWrapper.getRequest(url) stockStatsRaw = "" try: #ToDo: change to get text by class name or id stockStatsRaw = self.seleniumWrapper.getTextByXpath( '/html/body/ui-layout/div/div/div[2]/et-market/div/div/div/div[3]/et-market-stats/et-market-stats-overview/et-card/section/et-card-content/div[1]' ) except: self.log.write("Can get stats of " + url) return self.__makeDictionaryByStockStatsRaw(stockStatsRaw) def getStockPriceHistory(self, stockId): print("getStockPriceHistory") #self.seleniumWrapper.getRequestWaitUntilLocatedElementByCssSelector ( # 'https://www.google.bg/search?q=' + stockId + '+stock', # '.uch-psvg') self.seleniumWrapper.getRequest('https://www.google.bg/search?q=' + stockId + '+stock') self.seleniumWrapper.clickElementByCssSelector( 'div.dQlDUb:nth-child(8) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)', 4) text = self.seleniumWrapper.getTextByCSSSelector('.uch-psvg') print(text) data = [] #data[ #[stockPrice, date] #] return data def getStockResearchData(self, stockId): print("getStockResearchData") #self.seleniumWrapper.getRequestWaitUntilLocatedElementByCssSelector ( # "https://www.etoro.com/markets/" + stockId + "/research", # '.ew-content') self.seleniumWrapper.getRequest("https://www.etoro.com/markets/" + stockId + "/research") ##apt-graph-box > div:nth-child(2) #"//form[input/@name ='search']" #"//*[div/@class='search']" lowEstimate = self.seleniumWrapper.getTextByCSSSelector('.ew-content') #middleEstimate = self.seleniumWrapper.getTextByClassName('fb-price mb5') #highEstimate = self.seleniumWrapper.getTextByClassName('fb-price mb5 green') print(lowEstimate) data = [] #data.append(lowEstimate) #data.append(middleEstimate) #data.append(highEstimate) print(data) return data def getStockDescription(self, stockId): print("getStockDescription") #self.seleniumWrapper.getRequestWaitUntilLocatedElementByCssSelector ( # "https://www.etoro.com/markets/" + stockId, # 'et-showhide.ng-star-inserted:nth-child(2) > span:nth-child(1) > span:nth-child(3)') self.seleniumWrapper.getRequest("https://www.etoro.com/markets/" + stockId) self.seleniumWrapper.clickElementByCssSelector( 'et-showhide.ng-star-inserted:nth-child(2) > span:nth-child(1) > span:nth-child(3)', 4) description = self.seleniumWrapper.getTextByCSSSelector( 'et-showhide.ng-star-inserted:nth-child(2) > span:nth-child(1) > span:nth-child(1)' ) print(description) print("=============") exchange = self.seleniumWrapper.getTextByCSSSelector( 'a.widget-tag:nth-child(1)') print(exchange) data = [] data.append(exchange) data.append(description) return data
class Markets: def __init__(self, driver): self.seleniumWrapper = SeleniumWrapper(driver) self.stockMarkets = { 'Amsterdam exchange': 'https://www.etoro.com/discover/markets/stocks/exchange/amsterdam', 'Brussles exchange': 'https://www.etoro.com/discover/markets/stocks/exchange/brussels', 'Copenhagen exchange': 'https://www.etoro.com/discover/markets/stocks/exchange/copenhagen', 'Frankfurt exchage': 'https://www.etoro.com/discover/markets/stocks/exchange/frankfurt', 'Helsinki exchage': 'https://www.etoro.com/discover/markets/stocks/exchange/helsinki', 'Hongkong exchange': 'https://www.etoro.com/discover/markets/stocks/exchange/hongkong', 'Lisabon exchange': 'https://www.etoro.com/discover/markets/stocks/exchange/lisbon', 'London exchange': 'https://www.etoro.com/discover/markets/stocks/exchange/london', 'Madrid exchage': 'https://www.etoro.com/discover/markets/stocks/exchange/bolsademadrid', 'Milano exchage': 'https://www.etoro.com/discover/markets/stocks/exchange/borsaitaliana', 'NASDAQ': 'https://www.etoro.com/discover/markets/stocks/exchange/nasdaq', 'NYSE': 'https://www.etoro.com/discover/markets/stocks/exchange/nyse', 'Oslo exchage': 'https://www.etoro.com/discover/markets/stocks/exchange/oslo', 'Paris exchage': 'https://www.etoro.com/discover/markets/stocks/exchange/paris', 'Saudi arabia exchange': 'https://www.etoro.com/discover/markets/stocks/exchange/tadawul', 'Stockholm exchage': 'https://www.etoro.com/discover/markets/stocks/exchange/stockholm', 'Zurich exchange': 'https://www.etoro.com/discover/markets/stocks/exchange/zurich' } self.etfMarkets = {'ETF': 'https://www.etoro.com/discover/markets/etf'} self.driver = driver def getETFMarkets(self): return self.etfMarkets def getStockMarkets(self): return self.stockMarkets def getMarketInfo(self, marketName, dictMarkets): print("Tyring to load: " + marketName + ": " + dictMarkets[marketName]) #self.seleniumWrapper.getRequestWaitUntilLocatedElementByCssSelector ( # dictMarkets[marketName], # '.market-list') self.seleniumWrapper.getRequest(dictMarkets[marketName]) stocks = [] while (True): #.market-list stocksInfo = self.seleniumWrapper.getTextByCSSSelector( '.market-list') #stocksInfo = self.driver.find_element_by_xpath("/html/body/ui-layout/div/div/div[2]/et-discovery-markets-results/div/div") parser = Parser() currentStocks = parser.parseStocksInfo(stocksInfo, marketName) for i in range(len(currentStocks)): stocks.append(currentStocks[i]) try: currentStockCount = self.seleniumWrapper.getTextByXpath( '/html/body/ui-layout/div/div/div[2]/et-discovery-markets-results/div/et-discovery-markets-results-header/div/div[2]/div/div[1]/span[2]/span[1]' ) maxStockCount = self.seleniumWrapper.getTextByXpath( '/html/body/ui-layout/div/div/div[2]/et-discovery-markets-results/div/et-discovery-markets-results-header/div/div[2]/div/div[1]/span[2]/span[3]' ) #check if it is the last page splited = currentStockCount.split('-') if (splited[1] == maxStockCount): print("It is the last page.") break except: print("End text") break try: #click on the next page button element = self.driver.find_element_by_css_selector( '.nav-button-right') except: print("End") break self.seleniumWrapper.clickElementByCssSelector( '.nav-button-right', 4) return stocks def getAllMarketsInfo(self): stocks = [] for key, vlaue in self.stockMarkets.items(): currentStocks = self.getMarketInfo(key, self.stockMarkets) for j in range(len(currentStocks)): stocks.append(currentStocks[j]) return stocks def getAllEtfsInfo(self): etfs = [] for key, vlaue in self.etfMarkets.items(): currentEtfs = self.getMarketInfo(key, self.etfMarkets) for j in range(len(currentEtfs)): etfs.append(currentEtfs[j]) return etfs