利用python爬虫大量基金股票的净值写入到csv文件中方便做其他计算
2016-12-05 18:52
1206 查看
最近公司同事有一个需求就是能够一键抓到股票基金的净值,然后自己做运算,然后空闲时间给他写了个脚本,可能有的人会说python有第三方解析html,但是考虑到给别人用的复杂性,所以这里完全用正则表达式解析
源码会放在下面,利用http://xueqiu.com获取股票的净值 利用http://fund.eastmoney.com获取基金的净值
使用方法介绍,
1.是股票,在雪球网查看自己的股票地址 如 http://xueqiu.com/S/SZ000001 则在数组里填写/SZ000001 注意带/
2.是基金,在http://fund.eastmoney.com网站查询自己的基金地址如 http://fund.eastmoney.com/519983.html 则在数组里填写519983,然后执行脚本,会在当前目录创建一个result.csv文件,然后就可以进行其他运算了
codes =['519983','002529','/02318','/SZ000001','/SH510900','/SZ168101']
codes换成你自己的数组,执行脚本
源码会放在下面,利用http://xueqiu.com获取股票的净值 利用http://fund.eastmoney.com获取基金的净值
使用方法介绍,
1.是股票,在雪球网查看自己的股票地址 如 http://xueqiu.com/S/SZ000001 则在数组里填写/SZ000001 注意带/
2.是基金,在http://fund.eastmoney.com网站查询自己的基金地址如 http://fund.eastmoney.com/519983.html 则在数组里填写519983,然后执行脚本,会在当前目录创建一个result.csv文件,然后就可以进行其他运算了
codes =['519983','002529','/02318','/SZ000001','/SH510900','/SZ168101']
codes换成你自己的数组,执行脚本
#!/usr/bin/python # -*- coding: UTF-8 -*- import urllib2 import string,re import os import csv import codecs codes =['519983','002529','/02318','/SZ000001','/SH510900','/SZ168101'] filename = 'result.csv' def getHtml(url): req_header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11', 'Accept':'text/html;q=0.9,*/*;q=0.8', 'Accept-Charset':'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'Accept-Encoding':'utf-8', 'Connection':'close', 'Referer':None #注意如果依然不能抓取的话,这里可以设置抓取网站的host } req_timeout = 5 req = urllib2.Request(url,None,req_header) resp = urllib2.urlopen(req,None,req_timeout) html = resp.read() return html def parse_one(code): #基金 url = 'http://fund.eastmoney.com/' + code + '.html' # print url html = getHtml(url) pattern ='<dl class="dataItem02">.*?</dl>' # 将正则表达式编译成Pattern对象 m = re.search(pattern,html) content = m.group(0) #dateIemm02 pattern2 = '<dd class="dataNums">.*?</dd>' content2 = re.search(pattern2,content).group(0) #包含净值和比例的标签 pattern3 = '<span\sclass="[^">]+">([^<>]+)</span>' content3 = re.search(pattern3,content2) price =content3.group(1) pattern4 = '<dt>.*?</dt>' #带时间的dt->p-> content4 =re.search(pattern4,content).group(0) pattern5 = '\(</span>.*?<' #(</span>2016-10-27)< content5 = re.search(pattern5,content4).group(0) time = content5[8: len(content5)-2] pattern6= '<div class="fundDetail-tit">.*?</div>' content6 =re.search(pattern6,html).group(0) #<div class="fundDetail-tit"><div style="float: left">长信量化先锋混合(<span class="ui-num">519983</span>)</div> content6 = content6.replace('<div class="fundDetail-tit">','') pattern7 = 'left">.*?<span' content7 =re.search(pattern7,content6).group(0) # left">长信量化先锋混合(<span name = content7[6:len(content7)-5] writeResult(name,code,price,time) def parse_two(code): #股票 url = 'http://xueqiu.com/S' + code html = getHtml(url) # print url pattern ='stockName"><strong.*?class="stockName">.*?</strong>' nameAndCode =re.search(pattern,html).group(0) # stockName"><strong title="E Fund Management Co.,ltd." class="stockName">H股ETF(SH:510900)</strong> pattern2 = 'class="stockName">.*?<' content1 =re.search(pattern2,nameAndCode).group(0) #class="stockName">H股ETF(SH:510900)< nameAndCode = content1[18:len(content1)-2] #H股ETF(SH:510900 name = nameAndCode.split('(')[0] code = nameAndCode.split('(')[1] pattern3 = '<div id="currentQuote">.*</div>' #包含时间净值和时间 content3= re.search(pattern3,html).group(0) pattern4 = '<div class="currentInfo">.*?<div class="stockInfo' content4 = re.search(pattern4,content3).group() #<div class="currentInfo"><strong data-current="40.75" class="stockUp">HK$40.75</strong><span class="stockUp"><span>+0.250</span><span class="quote-percentage"> (+0.62%)</span></span></div><span class="update-quote pattern5 = 'data-current=.*class="sto' content5 = re.search(pattern5,content4).group() pattern5 = 'data-current.*?class="' content5 = re.search(pattern5,content5).group(0) #data-current="40.75" class="stockUp pattern5 = 'ent=.*cl' content5 = re.search(pattern5,content5).group() price = content5.split('\"')[1] pattern6 = '<div class="stockInfo">.*?</div>' #<div class="stockInfo"><span id="timeInfo">10-28 15:27:26 (北京时间) </span></div> content6 = re.search(pattern6,content3).group() pattern6 = '<span.*?</span>' content6 = re.search(pattern6,content6).group() #<span id="timeInfo">10-28 15:29:00 (北京时间) </span> pattern6 = 'timeInfo">.*?<' content6 = re.search(pattern6,content6).group() #<span id="timeInfo">10-28 15:29:00 (北京时间) </span> pattern6 = '>.*?\(' content6 = re.search(pattern6,content6).group() #timeInfo">10-28 15:30:10 (北京时间) < time = content6[1:len(content6)-1] writeResult(name,code,price,time) def writeResult(name,code,price,time): result = 'name:' + name + ' ' + 'code:'+code + ' ' + '单位净值:' + price + ' ' + 'time:' + time item=[name,code,price,time] csvfile = open(filename,'ab') csvfile.write(codecs.BOM_UTF8) writer = csv.writer(csvfile,dialect='excel') writer.writerow(item) csvfile.close() print '写入成功 结果为: ' + result item=['股票名称','代码','单位净值',' 时间 '] csvfile = open(filename,'wb') csvfile.write(codecs.BOM_UTF8) writer = csv.writer(csvfile) writer.writerow(item) csvfile.close() for code in codes: if re.match('^\/.*?',code): print '\n-----------------------------------股票-------------------------------------------' parse_two(code) else: print '\n-----------------------------------基金-------------------------------------------' parse_one(code) print '\n'
相关文章推荐
- Python爬虫小实践:寻找失踪人口,爬取失踪儿童信息并写成csv文件,方便存入数据库
- Python爬虫小实践:寻找失踪人口,爬取失踪儿童信息并写成csv文件,方便存入数据库
- Python爬虫小实践:寻找失踪人口,爬取失踪儿童信息并写成csv文件,方便存入数据库
- Python利用pandas计算多个CSV文件数据值的实例
- Python利用pandas计算多个CSV文件数据值
- Python读取某个目录下的zip压缩包解压开后计算每个小文件的md5值,并将压缩包名字、里面小文件名字、以及对应的md5值写入csv文件
- Python写入CSV文件的问题
- python 写入csv文件
- python之模块csv之CSV文件一次写入多行
- Python 写入CSV文件
- ean13码的生成,python读取csv中数据并处理返回并写入到另一个csv文件中
- python中写入csv,excel显示、pandas读取csv文件的编码问题
- Python豆瓣爬虫,指定文件行数写入到文件中
- 利用python的csv库处理csv文件
- java将float数据写入csv 并在python中读取csv文件
- python 实现将字典写入csv文件
- python之模块csv之CSV文件的写入(按行写入)
- 利用python脚本抓取AC的代码[爬虫+HTMLParser+handle_entityref+正则表达式+模拟登陆+文件操作]
- 关于python3中写入csv文件多余空行
- CSV文件的使用-写入/写出(C++/Python)