一.主题式网络主题式网络爬虫设计方案
1.爬虫名称:爬取百度热搜榜Top50
2.爬取内容:热点排名,热门标题,搜索热度
3.网络爬虫设计方案概述:
思路:通过分析网页源代码,找出数据所在的标签,通过爬虫读取数据保存到csv文件中,读取文件,对数据进行清洗和处理,数据分析与可视化处理。
技术难点:掌握知识不够,操作过于生疏,对网页爬取还有很多疑问
二.主题页面的结构特征分析
1.主题页面的结构与特征分析:爬取数据都分布在标签'<div class="wrapper">…</div>'里面,排名标签为num-top,标题标签为'list-title',热度标签为'icon-rise'
2.Htmls页面解析:
3.节点(标签)查找方法与遍历方法:根据鼠标指针所指以及网页页面反应进行更深一层的找寻
三、网络爬虫程序设计
1.数据爬取与采集:
import requests from bs4 import BeautifulSoup import bs4 import pandas as pd titles=[] hots=[] top=[] url='http://top.baidu.com/buzz?b=341&c=513&fr=topbuzz_b1_c513' #选择要爬取的网站 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/69.0.3497.100 Safari/537.36'}#伪装爬虫 r=requests.get(url) #获得url信息 r.raise_for_status() #失败请求(非200响应)抛出异常 r.encoding = r.apparent_encoding #根据内容分析出的编码方式,备选编码; html = r.text #获得的HTML文本 table = BeautifulSoup(html,"html.parser").find("table") #对获得的文本进行html解析,查找<table>内的信息 soup=BeautifulSoup(html,'lxml') for m in soup.find_all(class_="keyword"): titles.append(m.get_text().strip()) for n in soup.find_all(class_="icon-rise"): hots.append(n.get_text().strip()) for k in soup.find_all(class_="first"): top.append(k.get_text().strip()) final=[top,titles,hots] print(final) s=pd.DataFrame(final,index=["排名","标题","热度数据"]) #使用工具使其可视化 print(s.T)
2.对数据进行清洗和处理:
s.to_csv('百度热点排行榜.csv') s=pd.DataFrame(pd.read_csv('百度热点排行榜.csv')) #读取csv文件 s.head() s.duplicated() #检查是否出现重复值 s.isnull().sum() #空值处理 s[s.isnull().values==True] #缺失值处理 s.describe()
3.数据分析与可视化:
1:
x = ['湖北高考时间公布','李沁挽张若昀','演员张冲霄去世','猫和老鼠导演去世','北京上空出现日晕'] y = [1,2,3,4,5] pyplot.plot(x,y) plt.xlabel("标题") plt.ylabel("排名") plt.title('Top5热点') pyplot.show()
2:
plt.rcParams['font.family']=['sans-serif'] plt.rcParams['font.sans-serif']=['SimHei'] plt.bar(['湖北高考时间公布','李沁挽张若昀','演员张冲霄去世','猫和老鼠导演去世','北京上空出现日晕'],[164587,91771,86416,69458,62129]) plt.legend() plt.xlabel("热搜事件") plt.ylabel("热度指数") plt.title('Top5热点') pyplot.show()
3:
def line_diagram(): x = ['湖北高考时间公布','李沁挽张若昀','演员张冲霄去世','猫和老鼠导演去世','北京上空出现日晕'] y = [164587,91771,86416,69458,62129] plt.xlabel('事件') plt.ylabel('热度') plt.plot(x,y) plt.scatter(x,y) plt.title("事件与热度折线图") plt.show() line_diagram()
4.根据数据之间的关系,分析两个变量之间的相关系数,画出散点图,并建立变量之间的回归方程
def Scatter_point(): x = ['湖北高考时间公布','李沁挽张若昀','演员张冲霄去世','猫和老鼠导演去世','北京上空出现日晕'] y = [164587,91771,86416,69458,62129] plt.scatter(x,y,color='pink', s=25, marker="o") plt.xlabel("事件") plt.ylabel("热度") plt.title("事件与热度散点图") plt.show() Scatter_point()
#回归方程:
import matplotlib.pyplot as plt import matplotlib from scipy.optimize import leastsq def man(): colnames = ["排名", "标题", "热度"] s = pd.DataFrame(pd.read_csv('百度热点排行榜.csv',skiprows=1,names=colnames)) X = s.排名 Y = s.热度 Distance = float(s((2*(x*x))((s(math.zsin(y)))*(s(math.acos(y)))))/2) def aim(p,x): a,b,c=p return a*x*x+b*x+c def error_aim(p,x,y): return aim(p,x)-y p0=[0,0,0] Para=leastsq(error_aim,p0,args=(X,Y)) a,b,c=Para[0] plt.figure(figsize=(100000,60000)) plt.scatter(X,Y,color="b",label=u"热度分布",linewidth=2) x=np.linspace(0,15,20) y=a*x*x+b*x+c plt.plot(x,y,color="r",label=u"拟合直线",linewidth=2) plt.title("排名和热度一元二次回归方程关系图") plt.legend() plt.show() man()
5.将以上各部分的代码汇总,附上完整程序代码:
import requests from bs4 import BeautifulSoup import bs4 import pandas as pd titles=[] hots=[] top=[] url='http://top.baidu.com/buzz?b=341&c=513&fr=topbuzz_b1_c513' #选择要爬取的网站 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/69.0.3497.100 Safari/537.36'}#伪装爬虫 r=requests.get(url) #获得url信息 r.raise_for_status() #失败请求(非200响应)抛出异常 r.encoding = r.apparent_encoding #根据内容分析出的编码方式,备选编码; html = r.text #获得的HTML文本 table = BeautifulSoup(html,"html.parser").find("table") #对获得的文本进行html解析,查找<table>内的信息 soup=BeautifulSoup(html,'lxml') for m in soup.find_all(class_="keyword"): titles.append(m.get_text().strip()) for n in soup.find_all(class_="icon-rise"): hots.append(n.get_text().strip()) for k in soup.find_all(class_="first"): top.append(k.get_text().strip()) final=[top,titles,hots] print(final) s=pd.DataFrame(final,index=["排名","标题","热度数据"]) #使用工具使其可视化 print(s.T) s.to_csv('百度热点排行榜.csv') s=pd.DataFrame(pd.read_csv('百度热点排行榜.csv')) #读取csv文件 s.head() s.duplicated() #检查是否出现重复值 s.isnull().sum() #空值处理 s[s.isnull().values==True] #缺失值处理 s.describe() import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams['font.sans-serif']=['SimHei'] x = ['湖北高考时间公布','李沁挽张若昀','演员张冲霄去世','猫和老鼠导演去世','北京上空出现日晕'] y = [1,2,3,4,5] pyplot.plot(x,y) plt.xlabel("标题") plt.ylabel("排名") plt.title('Top5热点') pyplot.show() plt.rcParams['font.family']=['sans-serif'] plt.rcParams['font.sans-serif']=['SimHei'] plt.bar(['湖北高考时间公布','李沁挽张若昀','演员张冲霄去世','猫和老鼠导演去世','北京上空出现日晕'],[164587,91771,86416,69458,62129]) plt.legend() plt.xlabel("热搜事件") plt.ylabel("热度指数") plt.title('Top5热点') pyplot.show() def line_diagram(): x = ['湖北高考时间公布','李沁挽张若昀','演员张冲霄去世','猫和老鼠导演去世','北京上空出现日晕'] y = [164587,91771,86416,69458,62129] plt.xlabel('事件') plt.ylabel('热度') plt.plot(x,y) plt.scatter(x,y) plt.title("事件与热度折线图") plt.show() line_diagram() def Scatter_point(): x = ['湖北高考时间公布','李沁挽张若昀','演员张冲霄去世','猫和老鼠导演去世','北京上空出现日晕'] y = [1,2,3,4,5] plt.scatter(x,y,color='pink', s=25, marker="o") plt.xlabel("事件") plt.ylabel("热度") plt.title("事件与热度散点图") plt.show() Scatter_point() import matplotlib.pyplot as plt import matplotlib from scipy.optimize import leastsq def man(): colnames = ["排名", "标题", "热度"] s = pd.DataFrame(pd.read_csv('百度热点排行榜.csv',skiprows=1,names=colnames)) X = s.排名 Y = s.热度 Distance = float(s((2*(x*x))((s(math.zsin(y)))*(s(math.acos(y)))))/2) def aim(p,x): a,b,c=p return a*x*x+b*x+c def error_aim(p,x,y): return aim(p,x)-y p0=[0,0,0] Para=leastsq(error_aim,p0,args=(X,Y)) a,b,c=Para[0] plt.figure(figsize=(100000,60000)) plt.scatter(X,Y,color="b",label=u"热度分布",linewidth=2) x=np.linspace(0,15,20) y=a*x*x+b*x+c plt.plot(x,y,color="r",label=u"拟合直线",linewidth=2) plt.title("排名和热度一元二次回归方程关系图") plt.legend() plt.show() man()
四、结论
1.1.经过对主题数据的分析与可视化,可以得到哪些结论?
结论:python这门语言博大精深,虽然初学但是还是能感受到其中的奥秘以及难度,比起其他语言容易上手但但精通,我在数据处理这块还是有很多问题需要解决。
2.对本次程序设计任务完成的情况做一个简单的小结:通过这次任务,我了解到了自身许多的不住还有许多需要改进的地方,python这门语言值得我们深入学习,今后的python学习我会更加认真,弥补我自己的不足。