一、主题式网络爬虫设计方案
1.主题式网络爬虫名称:爬取B站热门视频排行榜
2.主题式网络爬虫爬取的内容:统计所有投稿视频的数据综合得分,每日更新数据(作品,播放量,弹幕,作者)
3.主题式网络爬虫设计方案概述:找到网站地址,分析网站源代码,找到自己所需要的数据所在的位置,提取数据,进行数据整理,数据可视化等操作
二、主题页面的结构特征分析
主题页面的结构与特征分析:
找到我们需要的数据,进行找查定位
我们需要的内容分别藏在‘a‘,class_="title",‘span‘,class_="data-box",‘div‘,class_="pts"里面
三、网络爬虫程序设计
1.数据爬取与采集
首先爬取网页通用框架
测试爬取的内容
然后再将内容进行解析
测试解析的内容
分析之前的网页源码
尝试把我们需要的内容打印出来
没问题后将刚刚的步骤打包
其他需要爬取的数据同理
大部分整理完后进行细分
整理完全部数据之后导出excel文件方便查看
数据整理完毕、开始进行数据可视化
画出柱状图和散点图
输出结果
建立变量之间的回归方程
输出结果
四.
附上完整程序代码
#导入需要用到的模块
import requests
import bs4
import re
import matplotlib.pyplotasplt
import seabornassns
import pandasaspd
plt.rcParams[‘font.sans-serif‘]=[‘SimHei‘]#用来正常显示中文
plt.rcParams[‘axes.unicode_minus‘]=False#用来正常显示负号
def get_url(url):#获取网页内容
#伪装用户
headers= {‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3706.400 SLBrowser/10.0.4040.400‘}try:
#尝试获取网页
f= requests.get(url,headers =headers)
#如果状态码不是200则引发异常
f.raise_for_status()
#编码
f.encoding=f.apparent_encoding
#返回获取的网页returnf.text
except:
#状态码不是200打印产生异常
print(‘产生异常‘)
def bs(text):
#将读取到的网页解析
soup= bs4.BeautifulSoup(text,‘html.parser‘)returnsoup
def cont_ent(soup):
#提取排行前100的标题
m= soup.find_all(‘a‘,class_="title")
n=[]for i inm:
n.append(i.text)return(n)#整理成列表
def cont_ent2(soup):
#提取播放量,弹幕,作者
x= soup.find_all(‘span‘,class_="data-box")
n=[]for i inx:
n.append(i.text)return(n)#整理成列表
def cont_ent3(soup):
#提取综合得分
k= soup.find_all(‘div‘,class_="pts")
n=[]for i ink:
#因为分数没有过千万的所以可以搜集千万以内的数字
c=re.search(‘d?d?d?d?d?d?d?d?‘,i.text)
n.append(eval(c.group()))return(n)#整理成列表
#把之前提取播放量,弹幕,作者再进行整理
def bofang(cone):#播放量
m=3n=[]for i incone:if m%3==0:
n.append(i)
m+=1
returnn
def danmu(cone):#弹幕
m=2n=[]for i incone:if m%3==0:
n.append(i)
m+=1
returnn
def zuozhe(cone):#作者
m=1n=[]for i incone:if m%3==0:
n.append(i)
m+=1
returnn
def main():
#哔哩哔哩热搜视频排行链接
url= ‘https://www.bilibili.com/ranking?‘#获取网页
some=get_url(url)
#解析网页
soup=bs(some)‘‘‘with open(‘try2.txt‘,‘w‘,encoding=‘utf-8‘) as f:
f.write(soup.text)#测试写代码过程中是否出错‘‘‘#数据处理
#提取标题
title=cont_ent(soup)
#提取播放量,弹幕,作者
cone=cont_ent2(soup)
#提取综合得分
score=cont_ent3(soup)‘‘‘ with open(‘title.txt‘,‘w‘,encoding=‘utf-8‘) asf:for i intitle:
f.write(str(title.index(i)+1)+‘.‘)
f.write(i)
f.write(‘‘)
with open(‘cone.txt‘,‘w‘,encoding=‘utf-8‘) asf:for i incone:
f.write(i)
f.write(‘‘)
with open(‘score.txt‘,‘w‘,encoding=‘utf-8‘) asf:for i inscore:
f.write(i)
f.write(‘‘)‘‘‘#导出数据查看是否有误
bfl =bofang(cone)
dm=danmu(cone)
zz=zuozhe(cone)
df= pd.DataFrame({‘排名‘:range(1,101),‘标题‘:title,‘播放量‘:bfl,‘弹幕量‘:dm,‘作者‘:zz,‘综合得分‘:score})
df.to_excel(‘b站热门视频排行前100.xlsx‘)
#因数据太多所以挑排名前几的作图
#柱状图
plt.bar(range(1,21),score[:20])
plt.xlabel(‘排名‘)
plt.ylabel(‘综合得分‘)
plt.title(‘前几名的综合得分柱状图‘)
plt.show()
#散点图
plt.scatter(range(1,21),score[:20])
plt.xlabel(‘排名‘)
plt.ylabel(‘综合得分‘)
plt.title(‘前几名的综合得分柱状图‘)
plt.show()
#回归分析
file_path= "b站热门视频排行前100.xlsx"dataf=pd.read_excel(file_path)
sns.lmplot(x=‘排名‘,y=‘综合得分‘,data=dataf)
main()
五、结论
1.排行是通过综合得分来进行排行,弹幕和播放量有一定的影响,吸引人的标题和视频的质量才是决定的关键
2.能够巩固之前学到的新知识,最好每隔一段时间前来复习一遍,网络爬虫很有趣。