您现在的位置是:首页 >其他 >爬虫实战——爬取股价数据(以比亚迪为例)网站首页其他

爬虫实战——爬取股价数据(以比亚迪为例)

Westbroobo 2023-06-21 04:00:02
简介爬虫实战——爬取股价数据(以比亚迪为例)

相关文章

车主之家销量爬虫
易车网销量爬虫
使用jsonpath时的bug记录



前言

2022年10月24日特斯拉率先在6连涨后宣布降价,又在11月8日宣布推出保险方面的让利政策,因此本文将从股价上入手,从某证券网站上爬取比亚迪2022年10月-2023年2月的股价数据,观察在此时间节点比亚迪股价是如何变的。


以下基于requests和jsonpath采集比亚迪每日股价等数据

一、数据来源

数据均来源于某证券网站,股价数据实时变动。

二、分析网页

在这里插入图片描述
查看网页源代码可以发现源码中是没有数据的,网页数据是通过某方**Choice数据实时加载的。
在这里插入图片描述
之后再找到源数据发现都是字典类型的,因此下面通过jsonpath进行解析,对应格式化地址为:https://datacenter-web.eastmoney.com/api/data/v1/get?callback=jQuery112305522640988534238_1680571452074&reportName=RPT_VALUEANALYSIS_DET&columns=ALL&quoteColumns=&pageNumber=1&pageSize=5000&sortColumns=TRADE_DATE&sortTypes=1&source=WEB&client=WEB&filter=(SECURITY_CODE=%22002594%22)&_=1680571452075
可以发现json格式化的开头有以jQuery开头的一串字符串和括号不是json格式,解析时肯定会有错误,关于这个问题之前的bug记录有提到过,解决方案时使用正则表达式处理,文章链接为:http://t.csdn.cn/2Ft8M
代码如下:

import requests
import json
import re

url = 'https://datacenter-web.eastmoney.com/api/data/v1/get?callback=jQuery112305522640988534238_1680571452074&reportName=RPT_VALUEANALYSIS_DET&columns=ALL&quoteColumns=&pageNumber=1&pageSize=5000&sortColumns=TRADE_DATE&sortTypes=1&source=WEB&client=WEB&filter=(SECURITY_CODE=%22002594%22)&_=1680571452075'
headers={'referer':r'https://data.eastmoney.com/',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62'}

rsp = requests.get(url=url,headers=headers)
rsp_sub = re.sub('^jQuery112305522640988534238_1680571452074(', '', rsp.text)
rsp_sub_2 = re.sub(');', '', rsp_sub)
rsp_json = json.loads(rsp_sub_2)
print(rsp_json)

三、步骤

1.引入库

import requests
import jsonpath
import json
import re
import pandas as pd

2.爬取数据

这里选取2022年10月10日-2023年2月29日的数据,对数据日期、股价、当日涨跌幅(%)、总市值四项数据进行抓取,并整理为DataFrame格式,代码如下(示例):

list = []
df = pd.DataFrame(list).T
for i in jsonpath.jsonpath(rsp_json,'$..data')[0]:
    TRADE_DATE = jsonpath.jsonpath(i,'$.TRADE_DATE')
    if TRADE_DATE[0] < '2022-10-10' or TRADE_DATE[0] > '2023-02-29':
        pass
    else:
        list.append(TRADE_DATE[0][:-9])
        CLOSE_PRICE = jsonpath.jsonpath(i,"$.CLOSE_PRICE")
        list.append(CLOSE_PRICE[0])
        CHANGE_RATE = jsonpath.jsonpath(i,'$.CHANGE_RATE')
        list.append(CHANGE_RATE[0])
        TOTAL_MARKET_CAP = jsonpath.jsonpath(i,'$.TOTAL_MARKET_CAP')
        list.append(TOTAL_MARKET_CAP[0])
        df1 = pd.DataFrame(list).T
        df = pd.concat([df1,df])
        list = []

3.数据存储

将数据集反转,并添加列索引,重置行索引,之后进行保存。

df = df.iloc[::-1]
df.columns = ['数据日期','股价','当日涨跌幅(%)','总市值']
df = df.reset_index(drop = True)
print(df)
df.to_excel('.股价数据.xlsx',index = False)

4.结果

          数据日期      股价   当日涨跌幅(%)           总市值
0   2022-10-10   251.2  -0.321416  731279085176
1   2022-10-11  255.01    1.51672   7.42371e+11
2   2022-10-12  262.34     2.8744   7.63709e+11
3   2022-10-13  258.18   -1.58573   7.51599e+11
4   2022-10-14  264.54     2.4634   7.70114e+11
..         ...     ...        ...           ...
91  2023-02-22  270.42   -1.57598   7.87231e+11
92  2023-02-23  270.44  0.0073959   7.87289e+11
93  2023-02-24  267.58   -1.05754   7.78964e+11
94  2023-02-27  259.81    -2.9038   7.56344e+11
95  2023-02-28   260.8   0.381048  759226056584

4.代码汇总

import requests
import jsonpath
import json
import re
import pandas as pd

url = 'https://datacenter-web.eastmoney.com/api/data/v1/get?callback=jQuery112305522640988534238_1680571452074&reportName=RPT_VALUEANALYSIS_DET&columns=ALL&quoteColumns=&pageNumber=1&pageSize=5000&sortColumns=TRADE_DATE&sortTypes=1&source=WEB&client=WEB&filter=(SECURITY_CODE=%22002594%22)&_=1680571452075'
headers={'referer':r'https://data.eastmoney.com/',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62'}

rsp = requests.get(url=url,headers=headers)
rsp_sub = re.sub('^jQuery112305522640988534238_1680571452074(', '', rsp.text)
rsp_sub_2 = re.sub(');', '', rsp_sub)
rsp_json = json.loads(rsp_sub_2)

list = []
df = pd.DataFrame(list).T
for i in jsonpath.jsonpath(rsp_json,'$..data')[0]:
    TRADE_DATE = jsonpath.jsonpath(i,'$.TRADE_DATE')
    if TRADE_DATE[0] < '2022-10-10' or TRADE_DATE[0] > '2023-02-29':
        pass
    else:
        list.append(TRADE_DATE[0][:-9])
        CLOSE_PRICE = jsonpath.jsonpath(i,"$.CLOSE_PRICE")
        list.append(CLOSE_PRICE[0])
        CHANGE_RATE = jsonpath.jsonpath(i,'$.CHANGE_RATE')
        list.append(CHANGE_RATE[0])
        TOTAL_MARKET_CAP = jsonpath.jsonpath(i,'$.TOTAL_MARKET_CAP')
        list.append(TOTAL_MARKET_CAP[0])
        df1 = pd.DataFrame(list).T
        df = pd.concat([df1,df])
        list = []

df = df.iloc[::-1]
df.columns = ['数据日期','股价','当日涨跌幅(%)','总市值']
df = df.reset_index(drop = True)
print(df)
# df.to_excel('.股价数据.xlsx',index = False)



简单分析

在这里插入图片描述
股价方面,特斯拉宣布降价后的几天,对比亚迪的股价短时间造成了一定的冲击,10月28日一度达到2022年末两个月的最低点,但之后又开始回暖,次月4号达到了最高值,280.2元,11月份持续下跌,12月回升后趋于平稳,短期内有一定的明显变化。
在这里插入图片描述
从整体上看,10月份到11月初经历了触底反弹,11月整体下跌,12月回升后稳定维持之前的水平,可以说是迅速做出了调整,知道2023年1月底到2月初可能由于某些原因又创了一次股价新高,之后回调,可以看到始终在一定的水平上涨跌,时间越长越越趋于稳定,若从股价上可以说,此次降价对比亚迪的股价没有造成太大影响。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。