(由于疫情在家闲着,开学至少得等到四月份,便在上个星期动起了学习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
本文详细介绍了使用Python爬虫从新浪财经抓取股票数据的过程,包括股票名称、成交额、涨跌额等信息。通过分析网站结构,获取所需数据,并运用Matplotlib模块绘制水平条形图,直观展示股票成交额,区分涨跌情况。

1783

被折叠的 条评论
为什么被折叠?



