之前捣鼓过python获取股票002023海特高新2013年年度报告中的所需部分,但是写出来后发现其实用得很少,还不如直接看年报。
几个月前读过雪球@小小辛巴的《重剑无锋》,这两天莫名地想起@小小辛巴看公司时有个指标几乎都会提及,那就是资产负债率,而自己之前并不太重视这个指标,于是乎就萌生了一个网易财经上用python获取所有A股上市公司股票的资产负债率,并把股票数据导出excel表格的想法,以供股票数据查询
用了大概两个2小时写了以下代码。90%都是之前写过的,时间主要浪费在BeautifulSoup那一段的中文识别上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | # -*- coding: utf-8-*- # @Date : 2014-05-20 # @Author : Lifemaxer # @Website : http://lifemaxer.com # @Description1: python-大批量自动采集获取网易财经所有A股上市公司股票资产负债率 # @Description2: 并导入excel表格中 # @Description3: 替换下方中文可修改成获取任意财务数据 # @Tools-Required: BeautifulSoup, xlwt import re,urllib2 import xlwt from bs4 import BeautifulSoup count = 1 class getstock: def __init__(self): pass def go(self): #定义网址,获取上交所创业板只需对应修改stock_num为6开头或3开头即可 stock_num = str(count).zfill(6) url = 'http://quotes.money.163.com/f10/zycwzb_'+stock_num+',year.html' print(u"股票代码:" + stock_num) headers = {"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6"} req = urllib2.Request( url, headers = headers) try: content = urllib2.urlopen(req).read() except: return soup = BeautifulSoup(content) #获取名称 name = soup.find('h1',class_='name').contents[1].contents[0].encode('gb18030').decode('gb18030') print name ws.write(count, 0, stock_num) ws.write(count, 1, name) #获取负债率 a = soup.find_all(class_='table_bg001 border_box fund_analys') for i in a: #此处替换中文可修改成获取任意财务数据 if i.find('td',text=re.compile(u'资产负债率')): b = i.find('td',text=re.compile(u'资产负债率')).parent.contents #网易财经默认一页最多显示2008-2013年年报共6年 number = [3,4,5,6,7,8] for num in number: if num < len(b): data = b[num].contents[0].decode('unicode_escape') ws.write(count, num-1, data) if __name__ == '__main__': #定义excel表格内容 wb = xlwt.Workbook() ws = wb.add_sheet(u'资产负债表') ws.write(0, 0, u'股票代码') ws.write(0, 1, u'股票名称') ws.write(0, 2, u'2013-12-31') ws.write(0, 3, u'2012-12-31') ws.write(0, 4, u'2011-12-31') ws.write(0, 5, u'2010-12-31') ws.write(0, 6, u'2009-12-31') ws.write(0, 7, u'2008-12-31') gs = getstock() #目前深证最大号为002725,获取上交所创业板请修改相应最大号码 while count <=2725: gs.go() wb.save('stockdebt.xls') count += 1 |
1、 以下替换“资产负债率”可修改成获取股票任意财务数据,如基本每股收益(元)、主营业务收入增长率等。
1 2 | if i.find('td',text=re.compile(u'资产负债率')): b = i.find('td',text=re.compile(u'资产负债率')).parent.contents |
2、此篇代码获取的是所有深交所上市公司的资产负债率,不含创业板。
需获取创业板、上交所股票资产负债率也很简单,只需修改代码里注释的两个地方即可。
3、采集完后会发现表格里有些行是空白的,原因是有些股票代码没有对应的股票。
这个我也是抓取之后才发现。更甚者,有几百个连号都是没有对应股票的。
参考这篇excel教程,完美解决:Excel批量自动删除空白行超简单方法
所有股票资产负债率数据打包下载:数据压缩包附件
解压密码: lifemaxer.com
简单整理后的效果图: