网页抓取港股实时行情(爬了几个静态网站,尝试爬动态网站的形式记录下来)
优采云 发布时间: 2022-03-29 06:07网页抓取港股实时行情(爬了几个静态网站,尝试爬动态网站的形式记录下来)
(因为疫情,至少要等到4月份才能开学,所以上周开始学习python。在学习了大一C语言微薄基础的语法后,开始学习写爬虫。跟着教学video 爬了几个静态的网站后,开始尝试爬动态的网站,也想以博客的形式记录下我的学习过程!)
目的:
1. 爬取所有股票的名称、成交量、变动情况
2.根据股票类型和总成交量输出水平条形图
3.根据涨跌的正负值,下跌的股票设置为灰色,上涨的股票设置为蓝色
文章目录
一、分析获取信息
这次我选择了新浪财经的股票页面作为我的爬取目标【新浪财经股票行情中心#cyb_root】根据分析发现这个网站的url在翻页的时候是不会变的
通过开发者工具的Preview选项过滤掉股票信息对应的json文件
一般找到它的request_url
以及请求时需要的接口参数
对比多页的参数后,可以看到这个字典中唯一影响翻页的就是page。改变这个接口参数实*敏*感*词*额和零钱。
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 = [] #定义颜色空列表
for i in range(len(amount)): #遍历列表
amount[i] = int(amount[i])/10000 #将总交易额换算成万的单位
if '-' in pricechange[i]: #对涨跌额的正负进行判断
color.append('lightslategray') #如果当前股票为负数,将灰色加入颜色列表
else:
color.append('deepskyblue') #如果当前股票为非负数,将蓝色加入颜色列表
最后,在绘制条形图时将颜色参数添加到后面。
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('所有页面下载完成')
四、输出结果
这里我只加载了两页数据
可以看到图片已经下载到path文件夹
可能图片的像素设置的比较大,上传后就变得模糊了。可以看到放大后的效果还是很不错的。
对比网站的信息没有问题
五、学习资源
不知不觉,我写完了第一篇博客。我感觉很开心。同时,我也分享一下我这周的主要学习资源。
视频:北京理工大学松田Python网络爬虫与信息提取
北京理工大学松田Python数据分析与展示
电子书:Python Web Crawling 权威指南(第二版) 提取码:je3y
Python数据分析(第二版)提取码:6747
六、参考资料
在学习爬虫的过程中遇到了很多问题。百度之后,几乎都在csdn的问答或者博客中解决了。这也是我注册csdn账号并写博客的原因。对于这个博客,我主要参考了一个Q&A,一个博客,特别是那个,值得学习matplotlib看看
[1]
[2]