刚学python爬虫的时候写了一段下载妹子图片的代码,前两天把他翻出来爬了一堆图片,现在给大家分享一下我的“使用姿势”。
爬的网站是这里
这个网站很有规律,非常适合新手学习、练手。
我在爬图片的时候不仅下载了图片,顺便收割了套图的名字,人气(我理解的是访问量),喜欢(实验证明,点一下就会+1,所以我称它为点赞量),发表时间,编号;将这些内容存在数据库中,由于数据量很小,只有1000行左右,所以用个sqlite就行了,没必要用MySQL,当然写成csv,txt也是可以的。
至于怎么爬取,这不是本文的重点,本文的重点是利用python的pandas进行数据分析。
获得以上信息之后,我用jieba做了个分词,储存在数据库中,可以使用SQL语句中的alter命令在原来的表结构中新增一列。分完词之后就可以进行一波操作了。我分别用Excel和python操作了一番。
Excel部分
虽然Excel处于鄙视链的倒数,但是我不怕被鄙视。
这是初始数据,查看没有缺失值。解释一下标题吧:
id:索引
name:套图的名字
NOs:套图的编号
numbers:一套图中图片的数量
url:套图地址
year:发表与那一年
date:发表时间
poputarity:人气(访问量)
like:喜欢(点赞量)
words:分好的词
我们先把没用的数据隐藏(最好不要删,万一有用呢?),保留year,numbers,date,popularity,like和words就可以了,但是words成这样我们没法操作,需要对它进行分列。这是分好的数据:
先做个数据透视表,计个数,然后就可以根据需要实现数据可视化,关于数据透视表的操作百度经验一搜一大堆,我就不说了,直接上成果吧!
由上图可知,15,16,17年发图的套数和数量,虽然15年的套数比16年多了100多,但总数量并没有多多少,平均每套图的数量也在逐年上升。下面来看详细情况:
我们发现2015年套图数量多,是因为第一,第二季度发的比较多。具体是哪个月我就懒得用excel弄了,还是用python方便一些。下面是每套图中图片数量的箱线图(Excel2016可以直接画箱线图,老一点版本的也可以画出来就是比较麻烦):
均值和中位数大致重合,说明数据没有明显的偏态,16年明显比15年上升了一个台阶,16年只有一个离群值点,17年3个,15年5个。
上面这些都是用户关心的,网站运营者主要关心的是流量(虽然我不知道该网站是如何盈利的)。
可以看出,不管是点赞数还是访问量,15年的都非常小,16年和17年的都明显右偏(15年的太小,看不出来),尤其是17年的点赞量(均值比上四分位数都大,简直不可描述),这是由于17年有几个异常大的离群值,只是被我隐藏了。
此外我还用Excel做了个词频统计:
‘写真’与’性感’突破200,荣获状元和榜眼,探花被’妹子’摘下,’美女’仅比’妹子’少了12票,屈居第四。词频在100次以上的有七个。
python部分
还是python用起来得心应手,直接用pandas搞一搞就出来了。
直接上代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import sqlite3
from datetime import datetime
SQL="select * from pictures as p join names on p.id=names.id"
#我当时存到了两个table里面,所以读的时候还要关联,也可以先读取,再用pandas的函数关联
conn=sqlite3.connect(r'G:\mqiqi\meizitu.db')
df=pd.read_sql(SQL,conn) #直接用pandas的函数将数据库中的数据写入数据框
df.info() #查看数据框的信息
可以将没用的数据用del删掉(我没删),有些数据需要转化类型,像NOs要变成字符串,不然我们调用describe方法的时候也会对它操作,year和date要由字符串变成时间格式,方便我们后续操作,另外新增一个month列,对月份进行描述统计还是比较合理的。相关代码如下:
del df['id']
df['date']=pd.to_datetime(df.date,format="%Y-%m-%d")
#Y匹配的是四位年:2017,y匹配二位年:17
df['month']=df.date.values.astype('datetime64[M]')
df.NOs=df.NOs.values.astype('str')
df.year=pd.to_datetime(df.year,format="%Y")
df.info()
再次查看信息,发现已经变了:
输入’df.describe()’,查看一下描述统计:
这些东西在Excel中也能计算,但一想到python中只要一行代码,我就懒了。我们看一下点赞量的最大值是上四分位数的45倍左右,导致均值被拉的虚高,简直丧心病狂,实际操作中可以去掉异常值,但我不想这么做。
直接看看走势吧。
import matplotlib.lines as mlines
plt.rcParams['font.sans-serif'] = ['SimHei'] #中文字体,不然中文会显示成口
plt.figure()
x1=df.groupby('month').popularity.sum()
x2=df.groupby('month').like.sum()
p1=x1.plot(color='b',label=u'每月总访问量')
p2=x2.plot(secondary_y=True,style='--',color='r',label=u'每月总点赞量') #设置次坐标轴
blue_line = mlines.Line2D([],[],linestyle='-',color='blue',markersize=2, label=u'每月总访问量')
red_line= mlines.Line2D([],[],linestyle='--',color='red',markersize=2, label=u'每月总点赞量')
plt.legend(handles=[blue_line,red_line],loc='upper left')
plt.grid(True)
plt.show()
得到下图:
大写的PS:这些指标都是虚荣指标,除了放出来给浏览的客户看看,没什么卵用,真正有用的指标不会给我们看到的
大体上是波动上升,其中在15年2、3、4月网站的总访问量明显较高,16年8、9月也显著增加,17年1月的点赞量异常高,应该就是那几个丧心病狂的造成的。
接下来将访问量和点赞量平均到每套图上看看:
df['rate']=df.like/df.popularity*10000*100
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure()
x1=df.groupby('month').popularity.sum()/(df.groupby('month').count().popularity)
x2=df.groupby('month').like.sum()/(df.groupby('month').count().like)
x3=df.groupby('month').rate.sum()/(df.groupby('month').count().rate)
p1=x1.plot(color='b',label=u'每月平均访问量')
p2=x2.plot(secondary_y=True,style='--',color='r',label=u'每月平均点赞量')
p3=x3.plot(secondary_y=True,style='--',color='g',label=u'每月平均点赞率')
blue_line = mlines.Line2D([],[],linestyle='-',color='blue',markersize=2, label=u'每月平均访问量')
red_line= mlines.Line2D([],[],linestyle='--',color='red',markersize=2, label=u'每月平均点赞量')
green_line=mlines.Line2D([],[],linestyle='--',color='green',markersize=2, label=u'每月平均点赞量')
plt.legend(handles=[blue_line,red_line,green_line],loc='upper left')
plt.grid(True)
plt.show()
这里添加一个新的变量rate,代表点赞率,它的数量级是万分之一,为了能和坐标轴匹配,我将它扩大了1百万倍(为什么大家看完不点赞呢?)
可以看出,15年2,3,4月平均每套图访问量并没有升高,主要原因是多发了几套图。如果我们假定一个用户对一套图只进行一次浏览,我们可以认为网站的活跃用户在此期间并没有明显的增加。至于转现率,用户留存率之类的,我搞不到数据。
点赞率也在缓缓上升,这能不能算作网民素质提高的一种表现呢?
最后放一张箱线图:
可以看出来,比Excel的好看多了,为了图形的美观,我把离群值都忽略了,右上角的是点赞率的图,只有万分之几,这究竟是道德的沦丧还是人性的悲哀。单纯从网站访问量和点赞量来看,该网站的运营情况挺好的。
我也用python做了词频图和一些条形图,和Excel的没啥差别,就不贴出来了。
说了这么多,总得给大家几张福利图片冲击一下视觉吧。
怎么样,够刺激吧!!!
第一次发文,各位大佬多多指教。