Advertisement

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()

全部评论 (0)

还没有任何评论哟~