本帖最后由 buluo533 于 2024-8-3 18:59 编辑
这一次做一个全过程的某球网的爬虫+数据可视化,仅供技术交流学习
话不多说,直接开干
准备工作:新建两个py文件,一个用来做爬虫,一个用来做数据分析
爬虫部分,导入requests,pandas,time,fake_useragent模块
[Python] 纯文本查看 复制代码
import requests
import time
import pandas as pd
from fake_useragent import UserAgent
打开某球网,找到数据界面
数据嘎嘎多,还有一百多页,这里打开开发者工具,刷新界面进行抓包
这里面有很多数据,初学者可以用搜索查找数据,有经验的会选择XHR数据包,通过翻页来抓,都演示一遍
三个接口,都去看看,发现只有第一个接口包含一页的数据,选择第一个接口作为爬取对象,兄弟们都可以去看看
接下来就是翻页去抓XHR,可以多翻几页,可以看到里面数据是我们想要的
到了这里我们可以去请求测试一下,简单写一下
[Python] 纯文本查看 复制代码 ua = UserAgent().random
headers = {
'User-Agent': ua
}
cookie={
'Cookie': '需要填写自己的cookie'
}
url = 'https://stock.xueqiu.com/v5/stock/screener/quote/list.json?page=1&size=30&order=desc&order_by=percent&market=CN&type=sh_sz'
response = requests.get(url, headers=headers,cookies=cookie).json()
print(response)
打印一下结果,这样就可以看到我们想要的数据,但是返回的内容没有被清洗,是以json格式返回的数据
接下来研究翻页逻辑,我们要的是他所有的数据,我们需要看的是负载的参数内容
这样对比想必大家应该看懂了他的翻页逻辑,接下来就是循环和提取需要的数据,我就不赘述了
这里为大家提供将万和亿单位数据转换为纯数据算法还有就是清洗空值,很简单,大家也可以自己去写,方便后续数据分析
[Python] 纯文本查看 复制代码
def str_of_num(num):
'''
递归实现,精确为最大单位值 + 小数点后三位
'''
if num is None:
return 0
else:
def strofsize(num, level):
if level >= 2:
return num, level
elif num >= 10000:
num /= 10000
level += 1
return strofsize(num, level)
else:
return num, level
units = ['', '万', '亿']
num, level = strofsize(num, 0)
if level > len(units):
level -= 1
return '{}{}'.format(round(num, 3), units[level])
[Python] 纯文本查看 复制代码 def clear_None(data):
if data is None:
return 0
else:
return str(data) + '%'
大致结果如图所示:
同时我们要写入csv也需要将数据保存进字典
希望大家爬取数据的时候多加点延时,不要获取太多数据,仅作联系用即可
接下来将字典转为DataFrame格式,写入csv
[Python] 纯文本查看 复制代码
# dic 是字典名
df = pd.DataFrame(dic)
df.to_csv('某球网.csv', index=False)
接下来实现数据分析部分
准备工作:导入panda,pycharts
[Python] 纯文本查看 复制代码 import pandas as pd
from pyecharts.charts import Bar, Page, Line
from pyecharts.globals import ThemeType
from pyecharts import options as opts
from pyecharts.globals import CurrentConfig
主要绘图是柱状图和折线图(不是专业的分析,仅是用来展示效果)
准备数据
[Python] 纯文本查看 复制代码 data = pd.read_csv('某球网.csv', encoding='utf-8')
chunks = []
for i in range(0, len(data), 1000):
chunks.append(data[i:i + 1000])
datas = pd.concat(chunks)
用块的方式读入,接下来准备要分析的数据,成交量和股票名称,并对数据进行处理,主要是pandas库的运用
[Python] 纯文本查看 复制代码
# 以成交量为标准,顺序排列
data1 = data.sort_values(by='成交量', ascending=False)
# 新建DataFrame数据,包换股票名称和成交量
df1_1 = data1[['股票名称', '成交量']]
# 选择前十个数进行分析
df1_2 = df1_1.iloc[:10]
# 获取股票名称作为x轴数据,列表格式
x_list = df1_2['股票名称'].to_list()
# 获取成交量作为y轴数据,列表格式
y_list = df1_2['成交量'].to_list()
接下来绘制图表,采用链式调用的方法,具体内容可以参考官方文档:Bmap - Bmap_base - Document (pyecharts.org)
柱状图:
[Python] 纯文本查看 复制代码 bar1 = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.ESSOS))
.add_xaxis(x_list)
.add_yaxis("股票成交量情况", y_list)
.set_series_opts(label_opts=opts.LabelOpts(position="top"))
.set_global_opts(title_opts=opts.TitleOpts(title="成交量图表"))
)
折线图,采用同样的数据:
[Python] 纯文本查看 复制代码 line = (
Line(init_opts=opts.InitOpts(theme=ThemeType.ESSOS))
.add_xaxis(x_list)
.add_yaxis("股票成交量情况", y_list)
.set_series_opts(label_opts=opts.LabelOpts(position="top"))
.set_global_opts(title_opts=opts.TitleOpts(title="成交量图表"))
)
接下来就是将图标保存进同一个html界面,选择page对象
[Python] 纯文本查看 复制代码 page = Page()
page.add(
bar1,
line)
page.render("某球网.html")
这样就完成了
大家有其他想做的网站,可以留言,笔者大学牲实力有限,大佬轻喷
|