一键下载A股所有上市公司的季报年报数据

收到知乎上一名知友友情赠送的Python代码,可以一键获取3000多支股票的全部财务数据。由于他抽取的是2016年的年报数据,考虑到2017年季报数据大部分都已公告,为了更好的进行数据对比分析,我研究了一下代码,决定写一个Ruby的。

本程序可以实现所有股票的资产负债表、利润表、现金流量表和主要指标表的下载,保存为程序容易识别的CSV格式。

程序完善之后我会对数据进行整理分析,相对于年报,季报核心项目发生重大变化的,都会悉数用程序跑出来。

本代码使用了网易财经的报表接口。数据为该公司上市以来所有季报、年报数据,按季度排列:

一键下载A股所有上市公司的季报年报数据_第1张图片

知友对年报数据进行了整理,可以方便的查询分析,本程序完善后,我也会做一个类似的A股全市场分析报表。

一键下载A股所有上市公司的季报年报数据_第2张图片

程序执行界面:

一键下载A股所有上市公司的季报年报数据_第3张图片
# -*- coding: UTF-8 -*-
require 'rubygems'
require 'hpricot'
require 'open-uri'
x = 0

#获取股票列表文件stocklist.txt的总行数
def wc(filename)
  $nline = $nword = $nchar = 0 #$符号表示全局变量,普通变量不在def外起作用
  File.open(filename) do |io|
    io.each_line do |line|
      words = line.split(/\s+/).reject{|w| w.empty? }
      #本例中使用了split方法分割单词,当行首有空白字符时,split方法的执行结果中会产生空白字符串,因此我们
      #会删除该空白字符串。
      $nline += 1
      $nword += words.length
      $nchar += line.length
    end
  end
  #puts "文件的行数为:#{$nline}\n文件的单词数为:#{$nword}\n文件的字符数为:#{$nchar}"
  puts "股票池股票数:#{$nword}\n"

end
wc("d:/rb/stock/downreports/stocklist.txt")
#puts  $nword

#循环开始

while x <=  $nword - 1

#puts "轮询中:"

stock_lines = File.readlines("d:/rb/stock/downreports/stocklist.txt");  


s_code = stock_lines[x]
scode = s_code.chomp  # chomp用来删除文本里带过来的换行符


puts "====================="
puts "正在下载#{scode}的资产负债表"

#确定csv文件命名规则
file1_path = "d:\\stock\\zcfzb\\"
file1_name = scode + "zcfzb.csv"
file1_name_path = file1_path + file1_name

#将网易财经接口的数据保存为csv文件
File.open(file1_name_path, 'wb') {|f| f.write(open('http://quotes.money.163.com/service/zcfzb_' + "#{scode}"+'.html') {|f1| f1.read})}

#防止接口调用过频被踢,暂停3秒
sleep(3)

puts "资产负债表下载完毕"

puts "====================="
puts "正在下载#{scode}的利润表"

#确定csv文件命名规则
file2_path = "d:\\stock\\lrb\\"
file2_name = scode + "lrb.csv"
file2_name_path = file2_path + file2_name

#将网易财经接口的数据保存为csv文件
File.open(file2_name_path, 'wb') {|f| f.write(open('http://quotes.money.163.com/service/lrb_' + "#{scode}"+'.html') {|f1| f1.read})}

#防止接口调用过频被踢,暂停3秒
sleep(3)

puts "利润表下载完毕"

puts "====================="
puts "正在下载#{scode}的现金流量表"

#确定csv文件命名规则
file3_path = "d:\\stock\\xjllb\\"
file3_name = scode + "xjllb.csv"
file3_name_path = file3_path + file3_name

#将网易财经接口的数据保存为csv文件
File.open(file3_name_path, 'wb') {|f| f.write(open('http://quotes.money.163.com/service/xjllb_' + "#{scode}"+'.html') {|f1| f1.read})}

#防止接口调用过频被踢,暂停3秒
sleep(3)


puts "现金流量表下载完毕"

puts "====================="
puts "正在下载#{scode}的主要财务指标表"

#确定csv文件命名规则
file4_path = "d:\\stock\\zycwzb\\"
file4_name = scode + "zycwzb.csv"
file4_name_path = file4_path + file4_name

#将网易财经接口的数据保存为csv文件
File.open(file4_name_path, 'wb') {|f| f.write(open('http://quotes.money.163.com/service/zycwzb_' + "#{scode}"+'.html') {|f1| f1.read})}

#防止接口调用过频被踢,暂停3秒
sleep(3)

puts "主要财务指标表下载完毕"
x = x + 1
end

你可能感兴趣的:(一键下载A股所有上市公司的季报年报数据)