网页抓取港股实时行情(爬了几个静态网站,尝试爬动态网站的形式记录下来)

优采云 发布时间: 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]

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线