# # Script creates a flatfile with datapoints for stocks taken from Nordnet #Import needed modules import requests import json import sys from tabulate import tabulate from datetime import datetime import time #Set some variables filepath = "/var/www/html/borsdata.html" country = "NO" # NO, SE, DK, FI, DE, US, CA url1 = ("https://www.nordnet.no/market/stocks?sortField=name&sortOrder=ascending&exchangeCountry=" + country + "&page=1") url2 = "https://www.nordnet.no/api/2/login" url3 = ("https://www.nordnet.no/api/2/instrument_search/query/stocklist?apply_filters=exchange_country%3D" + country + "&sort_order=asc&sort_attribute=name&limit=100") url4 = ("https://www.nordnet.no/market/stocks?sortField=name&sortOrder=ascending&exchangeCountry=" + country + "&page=1") #Start a Session, a cookie will be stored in session s = requests.Session() s.get(url1) #update request headers for that session headers = { "accept": "application/json", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "en-US,en;q=0.9", "client-id": "NEXT", "Connection": "keep-alive", "Host": "www.nordnet.no", "Referer": "https://www.nordnet.no/", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "Windows", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36" } s.headers.update(headers) #Authenticate to the API response2 = s.get(url2) #print(response2) #Should return a 200 (OK) #Add another header to session addheader = { "x-nn-href": url4 } s.headers.update(addheader) #Create table headers for data fulltable = [] fulltable.append(["Name","Symbol","ISIN","Is_Tradable","Currency","Last","Open","Close","Volume","High","Low","PE","PS","EPS","PB","dividend_per_share","dividend_yield","yield_1d","yield_1w","yield_1m","yield_3m","yield_ytd","yield_1y","yield_3y","yield_5y","owners","report_type","report_date"]) #Get json data from X number of 100 lines iter = 0 num = 1 while (iter <= num): mystring = (url3 + "&offset=" + str(iter) + "00") responseX = s.get(mystring) text = responseX.text data = json.loads(text) # Get number of iterations you need to run if iter == 0: num = int(data['total_hits']) if num > 100: num = num // 100 else: num = 0 for item in data['results']: name = str(item['instrument_info']['name']) symbol = str(item['instrument_info']['symbol']) isin = str(item['instrument_info']['isin']) is_tradable = str(item['instrument_info']['is_tradable']) currency = str(item['instrument_info']['currency']) try: last = str((item['price_info']['last']['price'])) except KeyError: last = "None" try: openprice = str((item['price_info']['open']['price'])) except KeyError: openprice = "None" try: close = str((item['price_info']['close']['price'])) except KeyError: close = "None" try: turnover = str((item['price_info']['turnover'])) except: turnover = "None" try: high = str((item['price_info']['high']['price'])) except KeyError: high = "None" try: low = str((item['price_info']['low']['price'])) except KeyError: low = "None" try: pe = str((item['key_ratios_info']['pe'])) except KeyError: pe = "None" try: ps = str((item['key_ratios_info']['ps'])) except KeyError: ps = "None" try: eps = str((item['key_ratios_info']['eps'])) except KeyError: eps = "None" try: pb = str((item['key_ratios_info']['pb'])) except KeyError: pb = "None" try: dividend_per_share = str((item['key_ratios_info']['dividend_per_share'])) except KeyError: dividend_per_share = "None" try: dividend_yield = str((item['key_ratios_info']['dividend_yield'])) except KeyError: dividend_yield = "None" try: yield_1d = str((item['historical_returns_info']['yield_1d'])) except KeyError: yield_1d = "None" try: yield_1w = str((item['historical_returns_info']['yield_1w'])) except KeyError: yield_1w = "None" try: yield_1m = str((item['historical_returns_info']['yield_1m'])) except KeyError: yield_1m = "None" try: yield_3m = str((item['historical_returns_info']['yield_3m'])) except KeyError: yield_3m = "None" try: yield_ytd = str((item['historical_returns_info']['yield_ytd'])) except KeyError: yield_ytd = "None" try: yield_1y = str((item['historical_returns_info']['yield_1y'])) except KeyError: yield_1y = "None" try: yield_3y = str((item['historical_returns_info']['yield_3y'])) except KeyError: yield_3y = "None" try: yield_5y = str((item['historical_returns_info']['yield_5y'])) except KeyError: yield_5y = "None" try: owners = str((item['statistical_info']['number_of_owners'])) except KeyError: owners = "None" try: report_type = str((item['company_info']['report_type'])) except KeyError: report_type = "None" try: report_date = (item['company_info']['report_date']) report_date = str(time.strftime('%d.%m.%Y', time.localtime(report_date/1000))) except KeyError: report_date = "None" fulltable.append([name,symbol,isin,is_tradable,currency,last,openprice,close,turnover,high,low,pe,ps,eps,pb,dividend_per_share,dividend_yield,yield_1d,yield_1w,yield_1m,yield_3m,yield_ytd,yield_1y,yield_3y,yield_5y,owners,report_type,report_date]) iter = (iter + 1) #Make html table now = datetime.now() dato = str(now.strftime("%d-%m-%Y %H:%M")) htmltable = tabulate(fulltable, tablefmt='html') new_htmltable = htmltable.replace('', '
') with open(filepath, "w", encoding="utf-8") as f: f.write('' + "\n" + '' + "\n" + 'Sist oppdatert: ' + "" + dato + "" + "\n" + '

Antall Aksjer for ' + country + ': ' + str(len(fulltable)) + "

" + "\n" + new_htmltable + "\n" + '' + "\n" + '' + "\n") f.close() # Done