我的第一篇博客:Python爬取新浪财经股票页面 并用matplotlib可视化输出结果

(由于疫情在家闲着,开学至少得等到四月份,便在上个星期动起了学习python的念头,凭借着大一C语言微薄的基础草草学习语法后便开始了学写爬虫。跟着教学视频爬了几个静态网站后便开始尝试爬动态网站,同时也想把自己的学习过程用博客的形式记录下来!)

目的:

1.爬取所有股票的名称、成交额、涨跌额
2.根据股票的种类和总成交额输出水平条形图
3.根据涨跌额的正负将跌的股票设为灰色,涨的股票设为蓝色
在这里插入图片描述

一、分析及获取信息

这次我选择了新浪财经的股票页面作为我的爬取目标[新浪财经股票行情中心http://vip.stock.finance.sina.com.cn/mkt/#cyb_root]根据分析发现这个网站在翻页时url不会改变
在这里插入图片描述
在这里插入图片描述
通过开发者工具的Preview选项筛选出对应股票信息的json文件在这里插入图片描述
在General中找到了它的request_url在这里插入图片描述

以及请求时所需要的接口参数
在这里插入图片描述
再对比多个页面的参数后,可以看到这个字典中影响翻页的只有page这一项,改变这个接口参数就可以实现翻页了,随后用requests.get函数请求相应的页面,并用正则表达式匹配出想要的信息就可以了。这里我只匹配出了名称,总交易额,和涨跌额。

base_url = "http://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHQNodeData?
#根据Header中的参数配置接口
params = {"page": "1",
          "num": "40",        
          "sort": "symbol",
          "asc": "1",
          "node": "cyb",
          "symbol": "",
          "_s_r_a": "page"}
header = {"User-Agent": "Mozilla/5.0"}                      #设置请求头
r = requests.get(base_url, params=params, headers=header)   #请求数据
names = re.findall(r',name:"(.*?)",', r.text)               #匹配股票名称于列表names中
amount = re.findall(r'amount:(.*?),', r.text)               #匹配股票总成交额于列表amount中
pricechange =  re.findall(r',pricechange:"(.*?)",', r.text) #匹配股票涨跌额于列表pricechange中

二、Matplotlib绘图

在此之前我也写了几个下载图片和小说的小爬虫,但是写完后看着黑黑的命令行感觉并不能很好的表达出我的成就感,同时这种文字信息爬虫爬出的数据也不是很直观,经过了解后我发现了matplotlib这个模块,接触它的时候感觉和学校里学的matlab很像。
这里我设置了一个color列表,并且遍历所有的股票,将涨跌额为正的股票设置为蓝色,将涨跌额为负的设为灰色,每遍历一个股票,color列表中就会多一个颜色信息

color = []                              #定义颜色空列表
for i in range(len(amount)):            #遍历列表
	amount[i] = int(amount[i])/10000    #将总交易额换算成万的单位
    if '-' in pricechange[i]:           #对涨跌额的正负进行判断
    	color.append('lightslategray')  #如果当前股票为负数,将灰色加入颜色列表
    else:
        color.append('deepskyblue')     #如果当前股票为非负数,将蓝色加入颜色列表

最后在画条形图的时候将color参数加在后面就行了

plt.barh(range(len(amount)), amount, alpha=0.6, color=color)
plt.yticks(range(len(amount)), names)   #将y轴标度设置为股票名称

由于我选择的是水平画图,所以plt.barh的第一个参数是y轴的数据,这里我将它设置为40个整数,对应一整页的股票数,随后用plt.ytick命令将这四十个整数的标度改为股票的名字,第二个参数则是想展示出他们的总成交额。

三、全代码展示

#CSDN用户:神经元2020
#欢迎一起交流!
import re
import requests
import matplotlib.pyplot as plt
import matplotlib

pages = 2
#定义抓取的页数
base_url = "http://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHQNodeData?"
#在XHR过滤器中找到对应股票列表的URL
path = "D:/PycharmProjects/Learn/"          
#定义存储路径


def Get_one_page(page, base_url, path):
	#抓取数据
    params = {"page": str(page),
              "num": "40",                  #根据Header中的参数配置接口
              "sort": "symbol",
              "asc": "1",
              "node": "cyb",
              "symbol": "",
              "_s_r_a": "page"}
    header = {"User-Agent": "Mozilla/5.0"}                      #设置请求头
    r = requests.get(base_url, params=params, headers=header)   #请求数据
    names = re.findall(r',name:"(.*?)",', r.text)               #匹配股票名称于列表names中
    amount = re.findall(r'amount:(.*?),', r.text)               #匹配股票总成交额于列表amount中
    pricechange =  re.findall(r',pricechange:"(.*?)",', r.text) #匹配股票涨跌额于列表pricechange中
    color = []                              #定义颜色空列表
    for i in range(len(amount)):            #遍历列表
        amount[i] = int(amount[i])/10000    #将总交易额换算成万的单位
        if '-' in pricechange[i]:           #对涨跌额的正负进行判断
            color.append('lightslategray')  #如果当前股票为负数,将灰色加入颜色列表
        else:
            color.append('deepskyblue')     #如果当前股票为非负数,将蓝色加入颜色列表


    #开始绘图
    matplotlib.rcParams['font.sans-serif'] = ['SimHei']         #设置字体
    matplotlib.rcParams['axes.unicode_minus'] = False           #选择水平画图模式
    plt.figure(figsize=(18, 11), dpi=200)                       #设置图片大小一定要在画图之前
    plt.barh(range(len(amount)), amount, alpha=0.6, color=color)         #绘制条形图
    plt.yticks(range(len(amount)), names)                       #将y轴标度设置为股票名称
    plt.xlabel('总成交额(万元)')           #将x轴命名为成交额
    for x, y in enumerate(amount):          #给每一个条形图后加上成交额数字
        plt.text(y, x-0.15, '%s' % y)
    title = '新浪财经第{}页成交额数据展示'.format(page)
    plt.title(title)
    plt.savefig(path + title + '.png')      #保存图片
    print('第{}页数据下载完成'.format(page))


for page in range(pages):					#主程序开始
    Get_one_page(page+1, base_url, path)    #注意这里的+1
print('所有页面下载完成')

四、输出结果

在这里插入图片描述
这里我只加载了两页数据
可以看到图片已经下载到路径文件夹当中在这里插入图片描述
可能图片的像素设置得比较大,上传后变得模糊了,可以看看放大后的效果还是非常不错的
在这里插入图片描述
对比一下网站信息也没有问题在这里插入图片描述

五、学习资源

不知不觉把第一篇博客写完了,感觉好开心啊,同时也分享一下我这一星期的主要的学习资源
视频:北京理工大学 嵩天 Python网络爬虫与信息提取
北京理工大学 嵩天 Python数据分析与展示
电子书:Python网络爬虫权威指南(第二版) 提取码:je3y
利用Python进行数据分析(第二版) 提取码:6747

六、参考文献

我在学习爬虫的过程中碰到了很多问题,百度后几乎都在csdn的问答或博客中得到了解决,这也是我为什么注册csdn账号并写博客的原因,对于这篇博客主要参考了一篇问答,一篇博客,尤其是那篇博客,对于学习matplotlib值得一看

[1]https://blog.csdn.net/hohaizx/article/details/79101322
[2]https://bbs.csdn.net/topics/391492242

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值