python如何爬虫股票数据_简单爬虫:东方财富网股票数据爬取(python_017)
需求:将东方财富网行情中心的股票数据爬取下来,包括上证指数、深圳指数、上证A股、深圳A股、新股、中小板、创业板 等
一、目标站点分析
东方财富网的行情中心页面包含了所有股票信息。在左侧的菜单栏中包含了沪深个股、沪深指数等所有股票数据。每个板块的股票数据被隐藏在不同的菜单里。
点击“沪深个股”按钮,对应的股票数据就被查询出来了。上方的选项卡中包含了不同板块的板块:沪深A股、上证A股、深证A股、新股、中小板...
我们的需求就是将各个选项卡下面的股票数据全部爬取下来,并分别用Excel保存到本地。
首先,通过查看源代码,发现页面上的数据并不是table格式,在源代码中搜索想要的数据并不能直接找到。
所以,老规矩:谷歌或者火狐浏览器 - F12 键,进行抓包分析。看看这些数据是怎么加载出来的。
1、提取url,获取单页数据
点击“js“,直接过滤出js文件,很容易就找到了股票数据。
#沪深A股
url = "http://nufm.dfcfw.com/EM_Finance2014NumericApplication/JS.aspx?cb=jQuery112404462275420342996_1542343049719&type=CT&token=4f1862fc3b5e77c150a2b985b12db0fd&sty=FCOIATC&js=({data%3A[(x)]%2CrecordsFiltered%3A(tot)})&cmd=C.A&st=(ChangePercent)&sr=-1&p=1&ps=20&=1542343050897"
服务器的访问形式:get。
那么就相对简单了,直接通过requests库的get就可以直接加载数据。
对应的文件数据如下:
提取数据
单只股票的数据都以字符串的形式被存放在“data”下面。可以直接通过正则表达式将data里面的数据提取出来即可。
2、实现翻页
对URL进行分析,控制翻页的参数主要是p参数,所以只要用一个page变量来替代页码,构造新的URL,再通过for循环就能实现提取多页数据。
3、获取不同板块的股票数据
对沪深A股、上证A股、深证A股、新股、中小板...不同板块对URL进行分析,发现对应链接非常相似,唯一对差别是cmd参数。
可以通过构造一个列表或字典,将不同板块对数据一次性提取。
4、将数据保存到本地。
通过导入pandas库,将数据存放在数据框,通过to_excel( )方法保存到本地。
代码执行结果如下:
完整源代码:
'''数据来源:东方财富网-行情中心http://quote.eastmoney.com/center'''
import requests
import re
import pandas as pd
#用get方法访问服务器并提取页面数据
def getHtml(cmd,page):
url = "http://nufm.dfcfw.com/EM_Finance2014NumericApplication/JS.aspx?cb=jQuery112406115645482397511_1542356447436&type=CT&token=4f1862fc3b5e77c150a2b985b12db0fd&sty=FCOIATC&js=({data%3A[(x)]%2CrecordsFiltered%3A(tot)})&cmd="+cmd+"&st=(ChangePercent)&sr=-1&p="+str(page)+"&ps=20"
r = requests.get(url)
pat = "data:"
data = re.compile(pat,re.S).findall(r.text)
return data
#获取单个页面股票数据
def getOnePageStock(cmd,page):
data = getHtml(cmd,page)
datas = data[0].split('","')
stocks = []
for i in range(len(datas)):
stock = datas[i].replace('"',"").split(",")
stocks.append(stock)
return stocks
def main():
cmd = {
"上证指数":"C.1",
"深圳指数":"C.5",
"沪深A股":"C._A",
"上证A股":"C.2",
"深圳A股":"C._SZAME",
"新股":"C.BK05011",
"中小板":"C.13",
"创业板":"C.80"
}
for i in cmd.keys():
page = 1
stocks = getOnePageStock(cmd[i],page)
#自动爬取多页,并在结束时停止
while True:
page +=1
if getHtml(cmd[i],page)!= getHtml(cmd[i],page-1):
stocks.extend(getOnePageStock(cmd[i],page))
#print(i+"已加载第"+str(page)+"页")
else:
break
df = pd.DataFrame(stocks)
#提取主要数据/提取全部数据
#df.drop([0,14,15,16,17,18,19,20,21,22,23,25],axis=1,inplace=True)
columns = {1:"代码",2:"名称",3:"最新价格",4:"涨跌额",5:"涨跌幅",6:"成交量",7:"成交额",8:"振幅",9:"最高",10:"最低",11:"今开",12:"昨收",13:"量比",24:"时间"}
df.rename(columns = columns,inplace=True)
df.to_excel("股票/"+i+".xls")
print("已保存"+i+".xls")
main()
