├── README.md └── investing.py /README.md: -------------------------------------------------------------------------------- 1 | # investing.com.economic-calendar 2 | The small class for parse economic calendar from site investing.com 3 | 4 | * For Python3 5 | -------------------------------------------------------------------------------- /investing.py: -------------------------------------------------------------------------------- 1 | import urllib 2 | import urllib.request 3 | from urllib.error import HTTPError 4 | 5 | from bs4 import BeautifulSoup 6 | import datetime 7 | import arrow 8 | 9 | 10 | class Good(): 11 | def __init__(self): 12 | self.value = "+" 13 | self.name = "good" 14 | 15 | def __repr__(self): 16 | return "" % (self.value) 17 | 18 | 19 | class Bad(): 20 | def __init__(self): 21 | self.value = "-" 22 | self.name = "bad" 23 | 24 | def __repr__(self): 25 | return "" % (self.value) 26 | 27 | 28 | class Unknow(): 29 | def __init__(self): 30 | self.value = "?" 31 | self.name = "unknow" 32 | 33 | def __repr__(self): 34 | return "" % (self.value) 35 | 36 | 37 | class Investing(): 38 | def __init__(self, uri='http://ru.investing.com/economic-calendar/'): 39 | self.uri = uri 40 | self.req = urllib.request.Request(uri) 41 | self.req.add_header('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36') 42 | self.result = [] 43 | 44 | def news(self): 45 | try: 46 | response = urllib.request.urlopen(self.req) 47 | 48 | html = response.read() 49 | 50 | soup = BeautifulSoup(html, "html.parser") 51 | 52 | # Find event item fields 53 | table = soup.find('table', {"id": "economicCalendarData"}) 54 | tbody = table.find('tbody') 55 | rows = tbody.findAll('tr', {"class": "js-event-item"}) 56 | 57 | news = {'timestamp': None, 58 | 'country': None, 59 | 'impact': None, 60 | 'url': None, 61 | 'name': None, 62 | 'bold': None, 63 | 'fore': None, 64 | 'prev': None, 65 | 'signal': None, 66 | 'type': None} 67 | 68 | for row in rows: 69 | #print (row.attrs['data-event-datetime']) 70 | _datetime = row.attrs['data-event-datetime'] 71 | news['timestamp'] = arrow.get(_datetime, "YYYY/MM/DD HH:mm:ss").timestamp 72 | 73 | for tr in rows: 74 | cols = tr.find('td', {"class": "flagCur"}) 75 | flag = cols.find('span') 76 | 77 | news['country'] = flag.get('title') 78 | 79 | impact = tr.find('td', {"class": "sentiment"}) 80 | bull = impact.findAll('i', {"class": "grayFullBullishIcon"}) 81 | 82 | news['impact'] = len(bull) 83 | 84 | event = tr.find('td', {"class": "event"}) 85 | a = event.find('a') 86 | 87 | news['url'] = "{}{}".format(self.uri, a['href']) 88 | news['name'] = a.text.strip() 89 | 90 | # Determite type of event 91 | legend = event.find('span', {"class": "smallGrayReport"}) 92 | if legend: 93 | news['type'] = "report" 94 | 95 | legend = event.find('span', {"class": "audioIconNew"}) 96 | if legend: 97 | news['type'] = "speech" 98 | 99 | legend = event.find('span', {"class": "smallGrayP"}) 100 | if legend: 101 | news['type'] = "release" 102 | 103 | legend = event.find('span', {"class": "sandClock"}) 104 | if legend: 105 | news['type'] = "retrieving data" 106 | 107 | 108 | bold = tr.find('td', {"class": "bold"}) 109 | 110 | if bold.text != '': 111 | news['bold'] = bold.text.strip() 112 | else: 113 | news['bold'] = '' 114 | 115 | fore = tr.find('td', {"class": "fore"}) 116 | news['fore'] = fore.text.strip() 117 | 118 | prev = tr.find('td', {"class": "prev"}) 119 | news['prev'] = prev.text.strip() 120 | 121 | if "blackFont" in bold['class']: 122 | #print ('?') 123 | # news['signal'] = '?' 124 | news['signal'] = Unknow() 125 | 126 | elif "redFont" in bold['class']: 127 | #print ('-') 128 | # news['signal'] = '-' 129 | news['signal'] = Bad() 130 | 131 | elif "greenFont" in bold['class']: 132 | #print ('+') 133 | # news['signal'] = '+' 134 | news['signal'] = Good() 135 | 136 | else: 137 | news['signal'] = Unknow() 138 | 139 | self.result.append(news) 140 | 141 | except HTTPError as error: 142 | print ("Oops... Get error HTTP {}".format(error.code)) 143 | 144 | return self.result 145 | 146 | 147 | if __name__ == "__main__": 148 | i = Investing('http://investing.com/economic-calendar/') 149 | print (i.news()) 150 | --------------------------------------------------------------------------------