01 前言 上一篇文章以『B站』为实战案例!手把手教你掌握爬虫必备框架『Scrapy』利用了scrapy爬取B站数据。本文将在此基础上完善代码,爬起更多的内容并保存到csv。 总共爬取1907条『课程学习』数据,分析哪类学习资源最火热最受大学生群体青睐。并通过可视化的方式将结果进行展示! 02 数据获取 程序是接着以『B站』为实战案例!手把手教你掌握爬虫必备框架『Scrapy』进行完善,所以不清楚的可以先看一下这篇文章(详细讲述Scrapy入门,并以『B站』为案例进行实战编程) 1.各个scrapy文件items文件class BiliItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() #pass # 视频标题 title = scrapy.Field() # 链接 url = scrapy.Field() # 观看量 watchnum = scrapy.Field() # 弹幕数 dm = scrapy.Field() # 上传时间 uptime = scrapy.Field() # 作者 upname = scrapy.Field() 增加了四个字段(观看量、弹幕数、上传时间、作者) lyc文件
为新增的四个字段进行网页标签解析 pipelines文件import csv
class BiliPipeline:
def __init__(self): #打开文件,指定方式为写,利用第3个参数把csv写数据时产生的空行消除 self.f = open('lyc大学课程.csv', 'a', newline='') # 设置文件第一行的字段名,注意要跟spider传过来的字典key名称相同 self.fieldnames = ['title', 'url','watchnum','dm','uptime','upname'] # 指定文件的写入方式为csv字典写入,参数1为指定具体文件,参数2为指定字段名 self.writer = csv.DictWriter(self.f, fieldnames=self.fieldnames) # 写入第一行字段名,因为只要写入一次,所以文件放在__init__里面 self.writer.writeheader()
def process_item(self, item, spider): # print('title:', item['title'][0]) # print('url:', item['url'][0]) # print('watchnum:', item['watchnum'][0].replace('\n','').replace(' ','')) # print('dm:', item['dm'][0].replace('\n', '').replace(' ', '')) # print('uptime:', item['uptime'][0].replace('\n', '').replace(' ', '')) # print('upname:', item['upname'][0])
print('title:', item['title']) print('url:', item['url']) print('watchnum:', item['watchnum']) print('dm:', item['dm']) print('uptime:', item['uptime']) print('upname:', item['upname'])
# 写入spider传过来的具体数值 self.writer.writerow(item) # 写入完返回 return item
def close(self, spider): self.f.close() 将爬取的内容保存到csv文件(lyc大学课程.csv) 2.启动scrapyscrapy crawl lyc 通过上述命令可以启动scrapy项目 3.爬取结果一共爬取1914条数据,最后经过简单清洗最终可用数据1907条! 03 数据分析 1.大学生学习视频播放量排名读取数据dataset = pd.read_csv('Bili\\lyc大学课程.csv',encoding='gbk') title = dataset['title'].tolist() url = dataset['url'].tolist() watchnum = dataset['watchnum'].tolist() dm = dataset['dm'].tolist() uptime = dataset['uptime'].tolist() upname = dataset['upname'].tolist() 数据处理
数据可视化def pie(name,value,picname,tips): c = ( Pie() .add( '', [list(z) for z in zip(name, value)], # 饼图的中心(圆心)坐标,数组的第一项是横坐标,第二项是纵坐标 # 默认设置成百分比,设置成百分比时第一项是相对于容器宽度,第二项是相对于容器高度 center=['35%', '50%'], ) .set_colors(['blue', 'green', 'yellow', 'red', 'pink', 'orange', 'purple']) # 设置颜色 .set_global_opts( title_opts=opts.TitleOpts(title=''+str(tips)), legend_opts=opts.LegendOpts(type_='scroll', pos_left='70%', orient='vertical'), # 调整图例位置 ) .set_series_opts(label_opts=opts.LabelOpts(formatter='{b}: {c}')) .render(str(picname)+'.html') ) 分析
2.大学生学习视频弹幕量排名数据处理
数据可视化###饼状图 def pie(name,value,picname,tips): c = ( Pie() .add( '', [list(z) for z in zip(name, value)], # 饼图的中心(圆心)坐标,数组的第一项是横坐标,第二项是纵坐标 # 默认设置成百分比,设置成百分比时第一项是相对于容器宽度,第二项是相对于容器高度 center=['35%', '50%'], ) .set_colors(['blue', 'green', 'yellow', 'red', 'pink', 'orange', 'purple']) # 设置颜色 .set_global_opts( title_opts=opts.TitleOpts(title=''+str(tips)), legend_opts=opts.LegendOpts(type_='scroll', pos_left='70%', orient='vertical'), # 调整图例位置 ) .set_series_opts(label_opts=opts.LabelOpts(formatter='{b}: {c}')) .render(str(picname)+'.html') ) 分析
3.up主大学生学习视频视频数数据处理#分析3: up主大学生学习视频视频数 def getdata3(): upname_dict = {} for key in upname: upname_dict[key] = upname_dict.get(key, 0) + 1 ###从小到大排序 upname_dict = sorted(upname_dict.items(), key=lambda kv: (kv[1], kv[0])) itemNames = [] datas = [] for i in range(len(upname_dict) - 1, len(upname_dict) - 21, -1): itemNames.append(upname_dict[i][0]) datas.append(upname_dict[i][1]) #绘图 bars(itemNames,datas) 数据可视化
分析
4.大学课程名称词云化数据处理text = ''.join(title) with open('stopword.txt','r', encoding='UTF-8') as f: stopword = f.readlines() for i in stopword: print(i) i = str(i).replace('\r\n','').replace('\r','').replace('\n','') text = text.replace(i, '') 数据可视化word_list = jieba.cut(text)result = ' '.join(word_list) # 分词用 隔开# 制作中文云词icon_name = 'fab fa-qq''''# icon_name='',#国旗# icon_name='fas fa-dragon',#翼龙icon_name='fas fa-dog',#狗# icon_name='fas fa-cat',#猫# icon_name='fas fa-dove',#鸽子# icon_name='fab fa-qq',#qq'''gen_stylecloud(text=result, icon_name=icon_name, font_path='simsun.ttc', output_name='大学课程名称词云化.png') # 必须加中文字体,否则格式错误 分析
04 总结 1.通过Scrapy框架爬取1907条『B站』大学课程学习资源数据。 2.对数据进行可视化展示以及凝练精简分析。 3.可能数据还有更多未分析或者挖掘的信息,欢迎在下方留言,提出你宝贵的建议! 4.本文数据和代码在下方,欢迎自取!!! |
|