爬虫+数据分析+数据可视化
- 4.关于彩票的数据分析
- 1.
- 2.
- 3.
- 8.关于电影票房的数据分析
- 1.
- 2.
- 3.爬取总的代码(做成函数)
- 4.数据分析(动态饼图)主要是干flask
- 4.11 (主要没想到第四个模块那么长)
- 4.12新建的HTML文件,随便输入点东西
- 9.数据可视化展示
如果有运行了报错了,要么是你自己写的时候没相关的变量,要么是我手打的函数打错了,你复制过去也错了
4.关于彩票的数据分析
1.
先导入两个库,再引入数据:matplotlib做出来的图都是PNG,做不到动态响应的图。所以还得学Python可视化神器——pyecharts的超详细使用指南!
import pandas as pd #做数据处理和分析、清洗
import matplotlib.pyplot as plt #用来做可视化的工具 ——>能把数据变成图表
import numpy as np #做数据处理的,pandas里边就有numpy
#引入数据 df=pd.read_csv('文件名带拓展名')
#如果想暂时看一下,可以:print(df)
#引入数据 headers=None表示第一行数据不是表头,而是变成列号了 index_col就是拿哪一列作为行的索引
#df存着读取的东西
df=pd.read_csv('data.csv',headers=None,index_col=0)
# .loc是拿数据 :的意思是所有行or列,这里是从第一列到第六列的所有数据
red_ball=df.loc[:,1:6]
print(red_ball)
#做数据统计,统计每个号码出现的次数
```python
red_ball_count= pd.value_counts(red_ball.values.flatten()) #针对有多行多列的数据!!!flatten()是把二维变成一维的数据
print(red_ball_count) #这时候就会打印出一行行的数据,每行就一个数据的信息:这个数据是什么,出现了几次。前边的叫index,后边的叫values !!!
# 那只有一列的平面数据的结构咋办?
blue_ball_count=pd.value_counts(blue_ball) #直接传进去就行了
#数据可视化
fig,ax=plt.subplots(2,1) #一次创建很多个图表,这里表示将两个图表摆成两行一列的形式
#我们要的图表在ax里面
#画饼图 以red_ball_count的索引给饼图每一块标上表示的是哪个数的占比 radius是半径 wedgeprops是小扇形的长度,所以设置后有可能会变成一个圆环哦
ax[0].pie(red_ball_count,labels=red_ball_count.index,radius=1,wedgeprops={'width':0.3})
ax[1].pie(blue_ball_count,labels=blue_ball_count.index,radius=0.5,wedgeprops={'width':0.2})
#但是上边的样子是两个图表分开的,如果想让两个圆环套在一起,只需要让ax[]的下标一样就可以画在同一个图表里了
ax[0].pie(red_ball_count,labels=red_ball_count.index,radius=1,wedgeprops={'width':0.3})
ax[0].pie(blue_ball_count,labels=blue_ball_count.index,radius=0.5,wedgeprops={'width':0.2})
plt.show() #图表展示
2.
上边的代码到最后每次打印的后会有一个空白的二维坐标系,所以咱们要去掉,怎么去掉呢??从上文数据可视化开始,不要fig、ax了,直接:
plt.pie(red_ball_count,labels=red_ball_count.index,radius=1,wedgeprops={'width':0.3})
plt.pie(blue_ball_count,labels=blue_ball_count.index,radius=0.5,wedgeprops={'width':0.2})
plt.show() #图表展示
3.
如果想弄更花的颜色,那么可以找来那些颜色的字符表达式,然后一个color列表(此列表元素都是字符,不同元素之间用逗号间隔) like this:
然后在上文紧接着的代码框里接着改:
plt.pie(red_ball_count,colors=np.random.choice(colors,len(red_ball_count)),labels=red_ball_count.index,radius=1,wedgeprops={'width':0.3})
#有多少个颜色我就从colors的列表里随机选多少个颜色
plt.pie(blue_ball_count,colors=np.random.choice(colors,len(red_ball_count)),labels=blue_ball_count.index,radius=0.5,wedgeprops={'width':0.2})
plt.show() #图表展示
8.关于电影票房的数据分析
1.
用 requests 、BeautifulSoup库
like this:
import requests
from bs4 import BeautifulSoup
# 通过requests请求到电影票房的首页 text存的是网址
text=requests.get('https://ys.endata.cn/DataMarket/Index').text
#使用BeautifulSoup进行解析
main_page=BeautifulSoup(text,'html.parser') #用html的规则去解析text
有些网页的网址改动下这个年份也是能快速浏览当年的信息的
2.
进一步拿到网页数据前,来到目标网页,鼠标右键后,点击 检查
然后找table标签,注意只有这样的IDE才能要
来,上代码:(接着上文,都在一个代码窗口)
# 找到table ,通过这 id 值来防止这个页面其他的table来干扰我们
table=main_page.find('table',attrs={'id':'tbContent'})
# find找的是一个标签,只返回第一个找到的 find_all找一堆标签. trs保存每一行标签
#弄个文件把提取到的数据保存起来
f=open('电影票房.csv',mode='a') #a表示 append追加写。因为要把之前爬的数据保留
# find_all() 返回list
trs= table.find_all('tr') #一堆tr,下面把tr拿出来
for tr in trs: #拿到每一个tr
lst=tr.find_all('td') # 找到每一个td
#但是第一行都是th ,也就是每列的名字(什么电影名、播放量啥的),所以咱不要
if len(lst) != 0:
for td in lst: #拿到每一个td,发现每一个td都是可以看成文本的
# print(td.text) # 拿到td标签中的文本信息,就是我们要的电影信息
f.write(td.text.strip()) #爬完一列的一个元素后
f.write(',') #用逗号隔开
f.write("\n") # 这一行的数据写完后,换行
#但是,有些内容表面上看是文本,但是是长连接,汉字后有看不见的换行符(如下图)
#所以用.strip() 默认去掉左右两端的空白(空格、换行符、制表符)
3.爬取总的代码(做成函数)
上边都是弄的一年的,也就是2008年,接下来一次性要弄很多年的 定义成一个函数就行了
import requests
from bs4 import BeautifulSoup
def fowm(year):
text=requests.get('https://www.cbooo.cn/year?year=%s' % year).text
main_page=BeautifulSoup(text,'html.parser') #用html的规则去解析text
table=main_page.find('table',attrs={'id':'tbContent'})
f=open('电影票房.csv',mode='a') #a表示 append追加写。因为要把之前爬的数据保留
trs= table.find_all('tr') #一堆tr,下面把tr拿出来
for tr in trs: #拿到每一个tr
lst=tr.find_all('td') # 找到每一个td
#但是第一行都是th ,也就是每列的名字(什么电影名、播放量啥的),所以咱不要
if len(lst) != 0:
for td in lst: #拿到每一个td,发现每一个td都是可以看成文本的
# print(td.text) # 拿到td标签中的文本信息,就是我们要的电影信息
f.write(td.text.strip()) #爬完一列的一个元素后
f.write(',') #用逗号隔开
f.write("\n") # 这一行的数据写完后,换行
for year in range(2008,2020):
dowm(year)
4.数据分析(动态饼图)主要是干flask
代码:
import pandas as pd #pandas读取csv文件的时候是以逗号做分隔符
data=pd.read_csv('电影票房.csv',header=None) #第一行不做列名
print(data)
# 从data中拿到1,2列的数据
data=data.loc[:,[1,2]] #第一列和第二列,如果是[1:3],则是从第一列到第三列
print(data)
接下来把数据掰成两份
第一套处理方案:接上的代码:
#拆分类别数据
def func1(item): #第一套处理方案
#把每一个类别item进行处理
return item.split('/')[0] #通过这 / 去切。 比如 魔幻/动作 ,切完变成:魔幻,动作 然后返回第零个,就是魔幻,动作不要了
def func2(item):
if '/' in item:
return item.split('/')[1]
else:
return 'dsb'
data[3]=data[1].map(func1)
print(data)
#如果是因为读取的文件里有不合适的数据,那就去到文件里删掉那一行哈哈哈
#但是上文打印的结果会有dsb ,所以再拆分吼吼吼
data_1=data.loc[:,[3,2]] #变成类似于 战争 27490
data_2=data.loc[:,[4,2]] #变成 dsb 17641 ,但是也有 惊悚 12046
#接下来就是把 dsb干掉,然后把俩合在一起
data_2=data.loc[data_2[4] != 'dsb']
data_2=data_2.rename(colums={4:3}) #注意类型的问题 把四号列名改成三号列名
data= data_1.append(data_2) #把俩合在一起
#计算每一种类型的票房平均值
data3=data.groupby(3).mean().round(2) #通过第三列做分组,把相同类型的影片放在一起。保留小数点后两位
#把处理之后的数据保存在文件中
data3.to_csv('后天要用到的数据.csv')
出现这种错误一般就是某个函数的参数多了
4.11 (主要没想到第四个模块那么长)
我们接下来要做的是一个web应用程序 先上代码:
from flask import Flask,render_template,request #都不多余
#创建应用程序
app=Flask(__name__)
#写一个函数来处理浏览器发送过来的请求
#路由,你通过浏览器访问过来的请求到底交给谁处理
@app.route('/') #当访问到127.0.0.1:5000/ 事3自动运行函数
def index(): #这地方不是函数名,所以起什么名字随便
return '你好啊,我叫赛利亚!' #返回的数据:响应
@app.route('/jay')
def 周杰伦():
return 'wohenxihuanzhoujielun'
#引入模板:就是引入HTML 创建一个名为 hello.html的文件
看下边
if __name__ == '__main__': #固定的写法,程序 的入口
app.run() #启动应用程序:启动一个flask项目
4.12新建的HTML文件,随便输入点东西
重写上边的代码:(上边的那两个什么index、周杰伦函数注释掉)
@app.route('/')
def index():
return render_template('hello.html')
#此时会自动找templates(上边创建的)文件夹里面的 hello.html文件
#这个路由的功能是把hello.html返回给浏览器
改进一下:
#把一个变量发送到页面
@app.route('/')
def index():
S='你好,我不叫赛利亚了'
return render_template('hello.html',jay=S) #这样,就把S传给网页了,jay是随便起的变量名
再来点内容:
![!]()
9.数据可视化展示
接着上个(代码整合看你们自己嗷)
最后再改一下min和max的值(要包含传进去数的范围)
至此就暂告一段落啦!
预测足球比赛的结果得用线性回归