目录
一、前言
二、简介
三、主要内容
1、“踩点”,爬取网页
2、数据提取、重新组织
3、数据分析
视频标题词云图:
播放量和评论量折线图:
本篇博客记录自己学习python爬虫与数据分析做的一个实例,仅供学习参考。爬虫使用需规范,请大家在用爬虫前注意网站相关协议(robots协议,在网址后面加"/robots.txt",不过如果出于学习目的、爬取的数据量小,不会对网站服务器造成太大压力的,稍微逾越一下也不会有大问题…)。
在学了爬虫后,总是摩拳擦掌、跃跃欲试,总想实战一下试试手,于是一直在各大网站“踩点“,逛B站时翻到了排行榜,我发觉那个页面十分合适,又看了一下B站的robots协议及反爬措施,还好,比较宽松。(tip:给的代码仅供参考,直接运行是跑不起来的,别问,问就是一般爬虫代码都这样,网页变化快,很难拿以前的代码直接跑,如果有兴趣可以尝试复现一下)。
流程:
用爬虫之前,到目标网站“踩点”,找到感兴趣的数据,查看所需数据是否可在对应的源码中找到(能找到的爬取起来会简单许多,否则需要进行动态分析,这里就不谈了),并查看网站的robots协议,尽量不要违反这个协议,规范使用爬虫。
“踩点”完毕后,就可以开始爬取数据了,python提供了丰富的第三方库,用于实现网络爬虫,常用的有urllib,requests等,一般使用上也是大同小异,大家可以自行选取,具体的介绍就不在这说了,这里只记录这个实例。
这里用爬虫爬取哔哩哔哩总榜七天的数据进行分析,每天爬取排行榜数据一次,这里取时间段为2021.12.9-2021.12.15的数据。
#爬取网页内容
def getHtmlText(url,kv,code='utf-8'):
try:
r = requests.get(url,headers=kv)
r.raise_for_status
print(r.status_code)
r.encoding=code
return r.text
except:
print('getHtmlText error')
上面爬取的还只是网页文档,要获得我们需要的数据,还要进行进一步处理。常用的第三方库有re、beautifulsoup等,这里采用正则表达式re库提取所需数据,需要注意的是,由于网页的代码时常发生变化,所以正则表达式以后并不一定能适用,使用时需要具体分析网页。(这一步操作通常会出问题,这就需要见机行事,不断调整正则表达式,有些时候还需要进行异常数据处理等)所提取的数据有:视频源链接、视频标题、视频作者、播放量、评论量、视频排名。再采用pandas库的Dataframe结构组织数据,并保存为.xlsx表格,以供查验。
#从网页文本中获取所需数据,并组织为一个dataframe
def getDataFrame(text):
#以下为正则表达式匹配模板
pat1 = r'(.+?)'
pat3 = r'alt="play">\s+(.+?)\s+'
pat4 = r'alt="like">\s+(.+?)\s+'
pat5 = r'alt="up">\s+(.+?)\s+'
pat6 = r'data-rank="(.+?)"'
lsLink = re.findall(pat1,text,re.S) #视频链接
for i in range(len(lsLink)):
lsLink[i] = 'https:'+lsLink[i]
lsTitle = re.findall(pat2,text,re.S) #视频标题
lsViewCounts = re.findall(pat3,text,re.S) #视频播放量
lsCommentCounts = re.findall(pat4,text) #视频评论量
lsAuthors = re.findall(pat5,text) #作者
lsRank = re.findall(pat6,text) #排名
result = pd.DataFrame({'link':lsLink,'Title':lsTitle,'ViewCounts':lsViewCounts,'CommentCounts':lsCommentCounts,
'Author':lsAuthors,'rank':lsRank})
#将'rank'列设置为索引列
result.set_index('rank',inplace=True)
return result
3、数据分析
取得数据后接着要做的便是进行数据分析,主要是从想办法从提取的数据中分析出一些“内涵”,常用可视化第三方库(如wordcloud、matplotlib、pyecharts等)进行展示。
我首先想到的是分析视频的标题,因为标题概括了一个视频的主要内容,我们可以从标题中了解一个视频的核心关注点,当然,或许也可以从中学习一下那些受欢迎的up主取标题的技巧。至于分析工具,对文字进行分析自然要采用jieba分词库及wordcloud词云,这里先将所有标题数据提取,转化为字符串,接着用jieba分词,去除标点符号及一些停用词后,用词云进行结果展示。jieba分词我在这篇文章介绍过: python jieba分词及中文词频统计.
def titleHandle(titleText): #标题信息分析
ls = jieba.lcut(titleText)
counts = {}
for i in ls:
if len(i)>1:
counts[i] = counts.get(i,0)+1
else:
continue
titleInfo = pd.Series(counts).sort_values(ascending=False) #词频排序
#print(titleInfo.head())
titleInfo.to_excel('E:\Python_code\\titleInfo.xlsx')#保存为.xlsx文件
#制作词云
wd = WordCloud(font_path='C:\Windows\Fonts\simkai.ttf',#中文字体
width=600,height=450,
min_font_size=20,
max_font_size=100,
max_words=50,
background_color='black',
colormap="hot",
)
wd.generate_from_frequencies(counts)
plt.imshow(wd)
plt.axis("off")
plt.savefig('E:\Python_code\wcloud_1.png')
plt.show()
另外,播放量和评论量间会不会有什么关系呢?正相关?那么相关度怎样?能从二者的折线图走势上看出吗?可以采用pandas库的corr()方法来分析播放量及评论量之间的相关性。用pyecharts画二者的折线图
还可以对视频的创作者进行分析,弄明白在上榜的视频中会不会有一个甚至多个出自于同一个作者之手?那个作者比较受大家的欢迎?
为此,可以对视频作者进行统计分析。
除此之外,排行榜的变化也是值得关注的,热榜视频的热度能保持多久?每日榜单排行靠前的视频有何变化?这些可以通过调用pyecharts库画图进行研究。
视频标题词云图:
播放量和评论量折线图: