| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- from bs4 import BeautifulSoup
- from urllib2 import urlopen
- from time import strftime
- import time
- def send_email(user, pwd, recipient, subject, body):
- import smtplib
- gmail_user = user
- gmail_pwd = pwd
- FROM = user
- TO = recipient if type(recipient) is list else [recipient]
- SUBJECT = subject
- TEXT = body
- # Prepare actual message
- message = """\From: %s\nTo: %s\nSubject: %s\n\n%s
- """ % (FROM, ", ".join(TO), SUBJECT, TEXT)
- try:
- server = smtplib.SMTP("smtp.gmail.com", 587)
- server.ehlo()
- server.starttls()
- server.login(gmail_user, gmail_pwd)
- server.sendmail(FROM, TO, message)
- server.close()
- print 'successfully sent the mail'
- except:
- print "failed to send mail"
- def allianz():
- try:
- url = 'http://www.allianzgi.hk/en/retail/fund-prices?type=&sort=&order=&page_no=&action=&fund_series=3&fund_name=74&fund_class=SHARE_CLASS_RETAIL_CLASS_AM&fund_currency=CCY_DISPLAY_H2_AUD&fund_name_text='
- html = urlopen(url).read()
- soup = BeautifulSoup(html, 'html5lib')
- lookups = {'unit_price': 'Unit Price','mth_nav': '12 month NAV', 'daily_change_pct': 'daily chg%','valuation_date': 'valuation date'}
- tvs= soup.findAll('td', [k for k in lookups.keys()])
- fund = soup.findAll('td', 'fund_name')[0].a.text
- purchase_px = 10.07
- curr_px = float(soup.find('td', 'unit_price').text)
- percent_chg = (curr_px - purchase_px) / purchase_px * 100
-
- s= '*****************************************\n'
- s+= ' %s\n' % fund
- s+= '\n'
- s+= ', '.join('%s: %s' % (lookups[e.get('class') [0]] if e.get('class')[0] in lookups else 'Daily Chg%', e.text) for e in tvs)
- s+= '\n\n'
- s+= ' purchase price = %0.2f (%0.2f%%)\n' % (purchase_px, percent_chg)
- s+= '\n'
- s+= '\n'
- s+= ' %s\n' % url
- s+= '\n'
- s+= '*****************************************\n'
- return s
-
- url = 'http://finance.sina.com.cn/fund/quotes/000011/bc.shtml'
- html = urlopen(url).read()
- soup = BeautifulSoup(html, 'html5lib')
- # lookups = {'unit_price': 'Unit Price','mth_nav': '12 month NAV', 'daily_change_pct': 'daily chg%','valuation_date': 'valuation date'}
- # fundname = soup.findAll('div', {'class': 'top_fixed_fund_name'})
- # funddiv = soup.findAll('div', {'class': 'top_fixed_fund_dwjz'})
-
- blk = soup.findAll('div', {'class': 'fund_info_blk2'})
- fundpx = blk[0].findAll('div', {'class': 'fund_data_item'})[0].find('span', {'class':'fund_data'}).text
- except:
- return 'error extracting allianz fund price'
- return '%s' % (fundpx)
- def cn_huaxia():
- try:
- url = 'http://finance.sina.com.cn/fund/quotes/000011/bc.shtml'
- html = urlopen(url).read()
- soup = BeautifulSoup(html, 'html5lib')
- # lookups = {'unit_price': 'Unit Price','mth_nav': '12 month NAV', 'daily_change_pct': 'daily chg%','valuation_date': 'valuation date'}
- # fundname = soup.findAll('div', {'class': 'top_fixed_fund_name'})
- # funddiv = soup.findAll('div', {'class': 'top_fixed_fund_dwjz'})
-
- blk = soup.findAll('div', {'class': 'fund_info_blk2'})
- fundpx = blk[0].findAll('div', {'class': 'fund_data_item'})[0].find('span', {'class':'fund_data'}).text
-
-
- return 'huaxia %s' % (fundpx)
- except:
- return 'error extracting cn fund price'
- def bct_funds():
-
- try:
- url = 'http://www.bcthk.com/BCT/html/eng/page/WMP0240/FIF0100/fund.jsp'
- html = urlopen(url).read()
- soup = BeautifulSoup(html, 'html5lib')
- lookups = ['BCT (Pro) Absolute Return Fund', 'BCT (Pro) Global Bond Fund', 'BCT (Pro) Hong Kong Dollar Bond Fund', 'BCT (Pro) MPF Conservative Fund']
- # for e in soup.findAll('a', 'green03'):
- # print e.text
-
- anchors= filter(lambda x: x.text[:(x.text.find('Fund')+4)] in lookups, soup.findAll('a', 'green03'))
-
- def fundinfo_extract(felem):
- node = felem.parent.parent.findAll('td')
- e = {}
- e['name'] = felem.text[:(felem.text.find('Fund')+4)]
- e['bid'] = node[2].text
- e['ask'] = node[3].text
- return e
- finfo= map(fundinfo_extract, anchors)
- return ''.join('%s:%s\n' % (e['name'], e['ask']) for e in finfo)
- except:
- return 'error extracting bct fund price'
-
-
- def send_daily_alert():
- user='cigarbar@gmail.com'
- pwd='taipeii0i'
- recipient='larry1chan@gmail.com'
-
- body = '%s\n%s\n%s' % (allianz(), cn_huaxia(), bct_funds() )
- subject='Daily fund price'
- send_email(user, pwd, recipient, subject, body)
- def retrieve_hk_holidays(year):
- month_names = ['January',
- 'February',
- 'March',
- 'April',
- 'May',
- 'June',
- 'July',
- 'August',
- 'September',
- 'October',
- 'November',
- 'December',
- ]
- try:
- url = 'http://www.gov.hk/en/about/abouthk/holiday/{{year}}.htm'
- url = url.replace('{{year}}', str(year))
- html = urlopen(url).read()
- soup = BeautifulSoup(html, 'html5lib')
-
- tds = soup.findAll('h3')[0].parent.findAll('td', 'date')
-
- d1 = map(lambda x: (x.text.split(' ')[0], x.text.split(' ')[1]), tds[1:])
- return map(lambda x: strftime('%Y%m%d', time.strptime('%s %s %s' % (month_names.index(x[1])+1, x[0], '2015'), "%m %d %Y")), d1)
- except:
- print 'error'
- if __name__ == '__main__':
- #send_daily_alert()
- print retrieve_hk_holidays(2015)
-
- # print allianz()
- #
- # print cn_huaxia()
- # print bct_funds()
-
-
|