最近东方财富网更新了网页布局,之前学习量化的时候东方财富网的爬虫失效,于是就重新研究了下。
在东方财富网改版之前,股票代码数据直接存在网页源码里,获取非常方便。最近改版之后,数据以表格的形式存储在JS文件里。
此前的爬虫版本:
'''输入为html源码,输出为股票代码和名字。'''
'''此前股票代码和名字可从http://quote.eastmoney.com/stocklist.html获取'''
def getStockCode(html):
s = r''
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
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')