东方财富网新版A股数据爬取

最近东方财富网更新了网页布局,之前学习量化的时候东方财富网的爬虫失效,于是就重新研究了下。

1.网页分析

在东方财富网改版之前,股票代码数据直接存在网页源码里,获取非常方便。最近改版之后,数据以表格的形式存储在JS文件里。
此前的爬虫版本:

'''输入为html源码,输出为股票代码和名字。'''
'''此前股票代码和名字可从http://quote.eastmoney.com/stocklist.html获取'''
def getStockCode(html):
    s = r'<li><a target="_blank" href="http://quote.eastmoney.com/(.*?).html">'
    pat = re.compile(s)
    code = pat.findall(html)
    stockname = re.findall(re.compile(r'html">(.*)<\/a>'),html)
    return code,stockname

现在输入http://quote.eastmoney.com/stocklist.html会直接跳转到http://quote.eastmoney.com/center/gridlist.html#hs_a_board,如图:
在这里插入图片描述
而表格数据经查看发现是存储在JS文件里,用右键检查查看详情:
在这里插入图片描述
点headers看JS的URL,如下:

http://nufm.dfcfw.com/EM_Finance2014NumericApplication/JS.aspx?cb=jQuery112405185680506907513_1554430646828&type=CT&token=4f1862fc3b5e77c150a2b985b12db0fd&sty=FCOIATC&js=({data%3A[(x)]%2CrecordsFiltered%3A(tot)})&cmd=C.A&st=(ChangePercent)&sr=-1&p=1&ps=20&=1554430647075

稍作测试便知,&p=1&ps=20为标明股票数,这里可以直接把后面的20改为3169(A股股票总数);&=1554430647075是UNIX时间戳,可以去掉;
最后访问如下URL即可:http://nufm.dfcfw.com/EM_Finance2014NumericApplication/JS.aspx?&type=CT&token=4f1862fc3b5e77c150a2b985b12db0fd&sty=FCOIATC&cmd=C._A&st=(ChangePercent)&sr=-1&p=1&ps=3169

2.代码

import requests
import json
import pandas as pd
import numpy as np
url = r'http://nufm.dfcfw.com/EM_Finance2014NumericApplication/JS.aspx?&type=CT&token=4f1862fc3b5e77c150a2b985b12db0fd&sty=FCOIATC&cmd=C._A&st=(ChangePercent)&sr=-1&p=1&ps=3169'

html = requests.get(url)
html = html.text

stock = re.findall(re.compile('\((.*)\)'),html)
stock = stock[0]
stock = stock.split('","')

stock[0] = stock[0][2:]
stock[-1] = stock[-1][:-2]
stock_data = []
for i,item in enumerate(stock):
    t = item.split(',')
    stock_data.append(t)
    
print(stock_data)

以上为获取表格数据的代码,由于获取的数据的格式混乱,需要进行一定处理,最终存储到csv文件中,代码如下:

columns = ['交易所','股票代码','股票名字','当前股价','涨跌额','涨跌幅','成交量(手)','成交额','振幅','最高','最低','今开','昨收','5分钟涨跌','量比','换手率','市盈率','市净率','总市值','流通市值','60日涨跌幅','年初至今涨跌幅','涨速','上市时间','数据时间','成交量']
data = pd.DataFrame(stock_data,columns = columns)
#data.head().T

columns = ['交易所','当前股价', '涨跌额', '涨跌幅', '成交量(手)', '成交额', '振幅',
       '最高', '最低', '今开', '昨收', '5分钟涨跌', '量比', '换手率',  '市净率', '总市值', '流通市值',
       '成交量']
data[columns] = data[columns].astype(np.float64)

data['市盈率'] = data['市盈率'].apply(lambda x:None if x == '-' else x)
data['市盈率'] = data['市盈率'].astype(np.float64) 

data['上市时间'] = pd.to_datetime(data['上市时间'],format= '%Y-%m-%d')
data['数据时间'] = pd.to_datetime(data['数据时间'],format= '%Y-%m-%d %H:%M:%S')

data['60日涨跌幅'] = data['60日涨跌幅'].str.strip("%").astype(float)/100
data['年初至今涨跌幅'] = data['年初至今涨跌幅'].str.strip("%").astype(float)/100

data['涨速'] = data['涨速'].apply(lambda x:None if x == '-' else x)
data['涨速'] = data['涨速'].astype(np.float64)

data['交易所_'] = data['交易所'].apply(lambda x:'沪市' if x == 1 else '深市' )
data.to_csv('stock-A.csv')

最后,看下效果:
在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值