python 爬取财经新闻股票_70行python代码爬取新浪财经中股票历史成交明细

70行python代码爬取新浪财经中股票历史成交明细

发布时间:2018-07-28 01:55,

浏览次数:635

, 标签:

python

最近在研究股票量化,想从每笔成交的明细着手,但历史数据的获取便是一个大问题,一些股票证券软件又不能批量导出成交数据。所以,我花了两天时间,成功的从新浪财经爬取了我要的数据

下面开始

新浪股票明细数据接口为

http://market.finance.sina.com.cn/transHis.php?symbol=sz000001&date=2018-07-17&page=3

格式不用多说symbol=股票代码 date=日期 page=页码

进去就可以看到一个表格,这其实就是新浪官方网页中展现出来的,但我们在这里比较好爬取,因为没有其他多余的内容,以前好像是可以直接下载下来的,很不幸现在不行了,但没关系,我们开始爬取

1.先获取整个html,这里我加了个超时重试机制,

def getHtml(url): while True: try: html = urllib.request.urlopen(url,

timeout=5).read() break except: print("超时重试") html = html.decode('gbk') return

html

2.获取列名

def getTitle(tableString): s = r'(?<=.*?([\s\S]*?)(?=)' pat =

re.compile(s) code = pat.findall(tableString) s2 =

r'(?<=

([\s\S]*?)(?=)' pat2 = re.compile(s2) code2 =

pat2.findall(code[0]) s3 = r'(?<=([\s\S]*?)(?=)' pat3 =

re.compile(s3) code3 = pat3.findall(code2[0]) return code3

3.获取所有记录

def getBody(tableString): s = r'(?<=

.*?([\s\S]*?)(?=)' pat =

re.compile(s) code = pat.findall(tableString) s2 =

r'(?<=

([\s\S]*?)(?=)' pat2 = re.compile(s2) code2 =

pat2.findall(code[0]) s3 = r'(?<=(?!]*>' pat3

= re.compile(s3) code3 = [] for tr in code2: code3.append(pat3.findall(tr))

return code3

4.然后用个while把每一页都获取出来,当然还要判断一下是不是到最后一页了,或者其他一些细节

while True: Url = 'http://market.finance.sina.com.cn/transHis.php?symbol=' +

symbol + '&date=' + date + '&page=' + str(page) html = getHtml(Url) table =

getTable(html) if len(table) != 0: tbody = getBody(table[0]) if len(tbody) ==

0: print("结束") break if page == 1: thead = getTitle(table[0]) print(thead) for

tr in tbody: print(tr) else: print("当日无数据") break page += 1

5.输出结果

怎么样,还不错吧,然后导入数据库就可以了

本人学生一枚,自学python没多久,正则表达式也才花了半天时间学的,代码会比较简陋,不足的地方还请多指教

源码:

import urllib.request import re import datetime def getHtml(url): while True:

try: html = urllib.request.urlopen(url, timeout=5).read() break except:

print("超时重试") html = html.decode('gbk') return html def getTable(html): s =

r'(?<=

)' pat =

re.compile(s) code = pat.findall(html) return code def getTitle(tableString): s

= r'(?<=.*?([\s\S]*?)(?=)' pat = re.compile(s) code =

pat.findall(tableString) s2 = r'(?<=

([\s\S]*?)(?=)' pat2 =

re.compile(s2) code2 = pat2.findall(code[0]) s3 =

r'(?<=([\s\S]*?)(?=)' pat3 = re.compile(s3) code3 =

pat3.findall(code2[0]) return code3 def getBody(tableString): s =

r'(?<=

.*?([\s\S]*?)(?=)' pat = re.compile(s) code =

pat.findall(tableString) s2 = r'(?<=

([\s\S]*?)(?=)' pat2 =

re.compile(s2) code2 = pat2.findall(code[0]) s3 =

r'(?<=(?!]*>' pat3 = re.compile(s3) code3 = []

for tr in code2: code3.append(pat3.findall(tr)) return code3 # 股票代码 symbol =

'sz000001' # 日期 dateObj = datetime.datetime(2018, 6, 1) date =

dateObj.strftime("%Y-%m-%d") # 页码,因为不止1页,从第一页开始爬取 page = 1 while True: Url =

'http://market.finance.sina.com.cn/transHis.php?symbol=' + symbol + '&date=' +

date + '&page=' + str(page) html = getHtml(Url) table = getTable(html) if

len(table) != 0: tbody = getBody(table[0]) if len(tbody) == 0: print("结束")

break if page == 1: thead = getTitle(table[0]) print(thead) for tr in tbody:

print(tr) else: print("当日无数据") break page += 1

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值