python获取A股数据列表的例子

2015年的股市是当下的热门话题,同事的朋友弄了一个简单的弹股吐槽单页面单日PV就能达30W+ ,相当于本博客一年的PV量。所以站在技术角度,这里也写几篇关于股票技术面的文章。首先本篇先从获取A股列表说起。

目的:获取当前上交所和深交所有A股列表。

一、官方站获取

官方站有两个:

1、上交所官网

2、深交所官网

所不同的是,深交所直接提供了EXCEL导出的方式

而上交所比较蛋疼,没有直接提供下载页面,所以需要通过页面扒取,在进行页面分析后发现其所有的股市列表藏在JS文件中。如下:

http://www.sse.com.cn/js/common/ssesuggestdata.js  (A股 + B股)

http://www.sse.com.cn/js/common/ssesuggestEbonddata.js  (转债)

由于只关注A股,所以这里只取上面的js文件中以60开头的股票。该js文件可以通过curl 或 wget获取并可以通过简单的shell 处理后获取:

# JS文件中的数据格式
function get_data(){
var _t = new Array();
_t.push({val:"600000",val2:"浦发银行",val3:"pfyx"});
_t.push({val:"600004",val2:"白云机场",val3:"byjc"});
_t.push({val:"600005",val2:"武钢股份",val3:"wggf"});
_t.push({val:"600006",val2:"东风汽车",val3:"dfqc"});
…………………………
#shell 语句处理后的格式
# by 运维之路(www.361way.com)
[root@361way ~]# wget http://www.sse.com.cn/js/common/ssesuggestdata.js
[root@361way ~]# grep push ssesuggestdata.js |sed  s/\[val2,'});',\",val3\]//g|awk -F: '{print $2,$3,$4}'|grep ^60
600000 浦发银行 pfyx
600004 白云机场 byjc
600005 武钢股份 wggf
600006 东风汽车 dfqc
……………………
所以这种方法获取相对比较简单也快捷。当然,也可以使用selenium + python 模拟浏览器访问扒取。后面会单独讲到。

二、第三方站点获取

官方站获取的方法,需要从两个官方站上分别取数据,而第三方站很多会向二个官方站交“ 保护费” ,所以可以通过API 直接取到数据,并且可以将深沪两市的A股数据归拢在一起。国内做的相对较好的主要有以下四家:

1、腾讯证券 -- http://stockapp.finance.qq.com/mstats/#mod=list

2、新浪财经 -- http://finance.sina.com.cn/data/#stock-schq-hsgs

3、凤凰财经 -- http://app.finance.ifeng.com/list/stock.php?t=ha

4、东方财富网 -- http://quote.eastmoney.com/center/list.html#33

这四家中企鹅的做的最人性化,除支持各种排序外,还支持excel 导出。直接是沪深两市A股直接导出。虽然一向不喜欢这只肥企鹅 ,不过事实求是,确实做的不错。另外三家就需要网页爬取了。

三、selenium + python抓数据

相较上面两种方法,这种是最笨的,而且取数据也是最慢的一种方法。不到万不得已,不推荐该方法(能用request、urlib2等模块尽量用),不过由于selenium模块实在牛B,多用于自动化测试和极品抓取环境下,这里权当做学习了。先上代码:

[root@localhost stock]# cat get_sh.py
# -*- encoding: utf-8 -*-
# by 运维之路(361way.com)
import sys
import cPickle
#import pickle
import selenium
from pyvirtualdisplay import Display
display = Display(visible=0, size=(1024, 768))
display.start()
from selenium.webdriver.support.ui import WebDriverWait         # available since 2.4.0
#   from selenium.common.exceptions import TimeoutException
#   from selenium.webdriver.support import expected_conditions as EC    # available since 2.26.0
def wait_condition_01(driver):
    return driver.find_element_by_id('dateList_container_pageid')
def extract_table(driver, stocklist):
    tag_table= driver.find_element_by_class_name("tablestyle")
    tabletext= tag_table.text
    stocklist.extend(tabletext.split('\n')[1:])
driver= selenium.webdriver.Firefox()
driver.get("http://www.sse.com.cn/assortment/stock/list/name/")
stocklist= []
extract_table(driver=driver, stocklist=stocklist)
tag_meta= driver.find_element_by_id("staticPagination")
attr_total= int(tag_meta.get_attribute("total"))
attr_pageCount= int(tag_meta.get_attribute("pageCount"))
# 逐页提取内容
for pagenr in range(2, attr_pageCount+1):
    id_input= 'dateList_container_pageid' if pagenr > 2 else 'xsgf_pageid'
    id_button= 'dateList_container_togo' if pagenr > 2 else 'xsgf_togo'
    tag_input= driver.find_element_by_id(id_input)
    tag_button= driver.find_element_by_id(id_button)
    tag_input.send_keys(str(pagenr))
    tag_button.click()
    WebDriverWait(driver, 10).until(wait_condition_01)
    extract_table(driver=driver, stocklist=stocklist)
# 向主调进程发送结果
data= {
    '个股总数': attr_total,
    '个股列表': stocklist,
}
driver.quit()
#pdata= pickle.dumps(data, protocol=2)
pdata= cPickle.dumps(data, protocol=2)
sys.stdout.write( pdata + b'\n' )
在使用过程中可能会遇到如下问题:

问题1:直接selenium + python报错

使用后报错如下:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/site-packages/selenium/webdriver/firefox/webdriver.py", line 64, in __init__
    self.binary, timeout),
  File "/usr/lib/python2.6/site-packages/selenium/webdriver/firefox/extension_connection.py", line 51, in __init__
    self.binary.launch_browser(self.profile)
  File "/usr/lib/python2.6/site-packages/selenium/webdriver/firefox/firefox_binary.py", line 70, in launch_browser
    self._wait_until_connectable()
  File "/usr/lib/python2.6/site-packages/selenium/webdriver/firefox/firefox_binary.py", line 100, in _wait_until_connectable
    raise WebDriverException("The browser appears to have exited "
selenium.common.exceptions.WebDriverException: Message: The browser appears to have exited before we could connect. If you specified a log_file in the FirefoxBinary constructor, check it for details.
解决方法是加入pyvirtualdisplay模块,并调用如下:

#!/usr/bin/env python
from pyvirtualdisplay import Display
from selenium import webdriver
display = Display(visible=0, size=(1024, 768))
display.start()
browser = webdriver.Firefox()
browser.get('http://www.111cn.net/')
print browser.page_source
browser.close()
display.stop()
问题2:selenium + python + pyvirtualdisplay报错

报错内容如下:

>>> from pyvirtualdisplay import Display
>>> from selenium import webdriver
>>> display = Display(visible=0, size=(1024, 768))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/site-packages/pyvirtualdisplay/display.py", line 33, in __init__
    self._obj = self.display_class(
  File "/usr/lib/python2.6/site-packages/pyvirtualdisplay/display.py", line 51, in display_class
    cls.check_installed()
  File "/usr/lib/python2.6/site-packages/pyvirtualdisplay/xvfb.py", line 38, in check_installed
    ubuntu_package=PACKAGE).check_installed()
  File "/usr/lib/python2.6/site-packages/easyprocess/__init__.py", line 209, in check_installed
    raise EasyProcessCheckInstalledError(self)
easyprocess.EasyProcessCheckInstalledError: cmd=['Xvfb', '-help']
OSError=[Errno 2] No such file or directory
Program install error!
从pypi 站点上了解到,其后端需要使用Xvfb 、Xephyr 、Xvnc三者任意一个。这里选了第一个,如下方法安装:

#centos下
yum -y insatll xorg-x11-server-Xvfb
#ubuntu下
sudo apt-get install xvfb
再通过python get_sh.py就可以正常获取数据。取出的列表数据并不直接,还需要近一步处理。

时间: 2024-09-20 19:40:49

python获取A股数据列表的例子的相关文章

python获取指定目录下所有文件名列表的方法

  本文实例讲述了python获取指定目录下所有文件名列表的方法.分享给大家供大家参考.具体实现方法如下: 这里python代码实现获取文件名列表的功能,可以指定文件中包含的字符,方便提取特定类型的文件名列表: ? 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 #

python获取list下标及其值的简单方法_python

当在python中遍历一个序列时,我们通常采用如下的方法: for item in sequence: process(item) 如果要取到某个item的位置,可以这样写: for index in range(len(sequence)): process(sequence[index]) 另一个比较好的方式是使用python内建的enumerate函数: enumerate(sequence,start=0) 上述函数中,sequence是一个可迭代的对象,可以是列表,字典,文件对象等等.

Python获取系统默认字符编码的方法

  本文实例讲述了Python获取系统默认字符编码的方法.分享给大家供大家参考.具体分析如下: 在Python代码中,普通字符串的编码方式与程序源文件编码方式一致的,而很多IDE在默认情况下,将程序源文件按照系统默认字符编码来保存的. 下面给出用Python获取系统默认编码的例子: ? 1 2 3 4 5 6 7 #!/usr/bin/env python #coding=utf-8 """ 获取系统默认编码 """ import sys pri

python获取一组数据里最大值max函数用法实例

  本文实例讲述了python获取一组数据里最大值max函数用法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 # 最简单的 max(1, 2) max('a', 'b') # 也可以对列表和元组使用 max([1,2]) max((1,2)) # 还可以指定comparator function max('ah', 'bf', key=lambda x: x[1]) def comparator(x): return x[1] max('ah', 'bf

python获取指定路径下所有指定后缀文件的方法

  本文实例讲述了python获取指定路径下所有指定后缀文件的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 获取指定路径下所有指定后缀的文件 # dir 指定路径 # ext 指定后缀,链表&不需要带点 或者不指定.例子:['xml', 'java'] def GetFileFromThisRootDir(dir,ext = None): allfiles = [] needExtFilter = (ext !=

Python连接DB2操作的一个小例子

QQ交流群:127591054 作者:JackChiang 作者QQ:595696297 Python版本3.5 这个小项目,是解决数据库查看的时候一些错误的,查看.每天都会跑数据,但是第一天的数据和第二天的名字可以是一样的,我第二天还可以在跑一遍. 涉及到的知识: 1.日期获取,例如获取2012-02-21~2013-08-21之间所有的日期列表,需要一天一天查询遍历. 2.正则匹配名字,由于一个调度会生成4条数据,需要找到这4条数据的顺序必须固定才为正确否则就是不对的. 3.然后把查询出来有

浅析Python中元祖、列表和字典的区别_python

1.列表(list) list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目. 列表中的项目应该包括在方括号中,这样Python就知道你是指明一个列表.一旦你创建了一个列表,就可以添加.删除,或者是搜索列表中的项目.由于你可以增加或者删除项目,我们说列表是可变的数据类型,即这种类型是可以被改变的,且列表是可以嵌套的. 实例: #coding=UTF-8 #author:RXS002 animalslist = ['fox','tiger','rabbit','snake']

使用python 获取进程pid号的方法_python

保存为.py文件后 运行脚本在后面添加进程名称即可 比如:python proinfo.py qq 即可获取QQ的进程信息,注意不区分大小写 复制代码 代码如下: #-*- encoding:UTF-8 -*-import osimport sysimport string import psutilimport re def get_pid(name): process_list = psutil.get_process_list() regex = "pid=(\d+),\sname=\'&

python使用sorted函数对列表进行排序的方法_python

本文实例讲述了python使用sorted函数对列表进行排序的方法.分享给大家供大家参考.具体如下: python提供了sorted函数用于对列表进行排序,并且可以按照正序或者倒序进行排列 #创建一个数字组成的列表 numbers = [5, 1, 4, 3, 2, 6, 7, 9] #输出排序后的数字数组 print sorted(numbers) #输出原始数组,并未被改变 print numbers my_string = ['aa', 'BB', 'zz', 'CC', 'dd', "E