一.主题式网络主题式网络爬虫设计方案
1.爬虫名称:爬取百度热搜风云榜数据
2.爬取内容:爬取热搜榜热点,排名,热点热度数据
3.网络爬虫设计方案概述:
思路:通过按f12查找页面的源代码,找到所需代码处在的标签,通过爬虫处理将所需代码保存到excel文件内,再进行清洗,分析以及数据可视化的处理
二.主题页面的结构特征分析
1.主题页面的结构和特征分析:爬取数据都分布在标签<ul class="item-list">,热点名称为class="list-title",热点热度数据为<span class="icon-rise">
2.Htmls页面解析:
三、网络爬虫程序设计
1.数据的爬取与采集:
#导入相关库 import requests from bs4 import BeautifulSoup import pandas as pd import numpy as np import scipy as sp from numpy import genfromtxt import matplotlib from pandas import DataFrame import matplotlib.pyplot as plt from scipy.optimize import leastsq import urllib.request as urlrequest #爬取百度热搜风云榜 url='http://top.baidu.com/category?c=12' #搜索网址 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) #请求网站 r.encoding=r.apparent_encoding #统一编码 data=r.text soup=BeautifulSoup(data,'lxml') #使用BeautifulSoup工具进行解析 title=[] #创建空列表 count=[] for x in soup.find_all(class_="list-title"): #把热点名称添加到空列表中 title.append(x.get_text().strip()) for y in soup.find_all('span', class_="icon-rise"): #把热度指数添加到空列表中 count.append(y.get_text().strip()) data=[title,count] #把两个列表收到data变量中 print(data) #使用print函数打印 df=pd.DataFrame(data,index=["热点名称","热度指数"]) #数据可视化 print(df.T) resoubang="D:/resoubang.xlsx" df.T.to_excel(resoubang) #保存文件,数据持久化
2.对数据进行清洗和处理:
#数据清洗 print('\n====各列是否有缺失值情况如下:====') print(df.isnull()) #统计空值情况 print(df.duplicated()) #查找重复值 print(df.isna().head()) print(df.describe()) #描述数据
绘制图形:
#绘图数据选取的是该热点排行榜中前9名 #绘制柱形图 plt.rcParams['font.family']=['sans-serif'] plt.rcParams['font.sans-serif']=['SimHei'] plt.bar(['1','2','3','4','5','6','7','8','9'], [297362, 295628, 243392, 219490,214798,201257,179678,179060,170596],label="百度热搜帮热点热度指数") plt.legend() plt.xlabel("百度热点") plt.ylabel("热度指数") plt.show()
#绘制折线图 x = ['1','2','3','4','5','6','7','8','9'] y = [297362, 295628, 243392, 219490,214798,201257,179678,179060,170596] #设置好Y轴的参数 plt.plot(x,y) plt.xlabel("百度热点") plt.ylabel("热度指数") plt.title('百度热搜帮热点热度指数') plt.show()
#绘制散点图 x = ['1','2','3','4','5','6','7','8','9'] y = [297362, 295628, 243392, 219490,214798,201257,179678,179060,170596] plt.scatter(x,y,color='blue', s=25, marker="o") plt.xlabel("百度热点") plt.ylabel("热度指数") plt.title("百度热搜帮热点热度指数") plt.show()
绘制一元二次方程及求回归直线
#画一元二次回归方程 chinese=matplotlib.font_manager.FontProperties(fname='C:/Windows/Fonts/simsun.ttc') #调用中文 plt.rcParams['font.sans-serif']=['Arial Unicode MS'] plt.rcParams['axes.unicode_minus']=False filename="D:/resoubang.xlsx" colnames=["排名","热点","热度"] df=pd.read_excel(filename,skiprows=1,names=colnames) print(df) rank=df[:,1] rate_values=df[:,2] X=np.array(rank) Y=np.array(rate_values) def func(params,x): a,b,c = params return a * x * x + b * x + c def error(params,x,y): return func(params,x) - y def main(): plt.figure(figsize=(8,6)) p0 = [1980,300,1] Para = leastsq(error,p0,args=(X,Y)) a,b,c = Para[0] print("a=",a,"b=",b,"c=",c) p;t.scatter(X,Y,color="green",label="样本数据",linewidth=2) x = np.linespace(1,17,50) y = a * x * x + b * x + c plt.plot(x,y,color="red",label="拟合曲线",linewidth=2) plt.title("百度热点热度数据") plt.grid() plt.legend() plt.show() main()
不知道哪里出错了,一直运行不了
5.将以上各部分的代码汇总,附上完整程序代码:
#导入相关库 import requests from bs4 import BeautifulSoup import pandas as pd import numpy as np import scipy as sp from numpy import genfromtxt import matplotlib from pandas import DataFrame import matplotlib.pyplot as plt from scipy.optimize import leastsq import urllib.request as urlrequest #爬取百度热搜风云榜 url='http://top.baidu.com/category?c=12' #搜索网址 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) #请求网站 r.encoding=r.apparent_encoding #统一编码 data=r.text soup=BeautifulSoup(data,'lxml') #使用BeautifulSoup工具进行解析 title=[] #创建空列表 count=[] for x in soup.find_all(class_="list-title"): #把热点名称添加到空列表中 title.append(x.get_text().strip()) for y in soup.find_all('span', class_="icon-rise"): #把热度指数添加到空列表中 count.append(y.get_text().strip()) data=[title,count] #把两个列表收到data变量中 print(data) #使用print函数打印 df=pd.DataFrame(data,index=["热点名称","热度指数"]) #数据可视化 print(df.T) resoubang="D:/resoubang.xlsx" df.T.to_excel(resoubang) #数据清洗 print('\n====各列是否有缺失值情况如下:====') print(df.isnull()) #统计空值情况 print(df.duplicated()) #查找重复值 print(df.isna().head()) print(df.describe()) #描述数据 #绘图数据选取的是该热点排行榜中前9名 #柱形图 plt.rcParams['font.family']=['sans-serif'] plt.rcParams['font.sans-serif']=['SimHei'] plt.bar(['1','2','3','4','5','6','7','8','9'], [297362, 295628, 243392, 219490,214798,201257,179678,179060,170596],label="百度热搜帮热点热度指数") plt.legend() plt.xlabel("百度热点") plt.ylabel("热度指数") plt.show() #折线图 x = ['1','2','3','4','5','6','7','8','9'] y = [297362, 295628, 243392, 219490,214798,201257,179678,179060,170596] #设置好Y轴的参数 plt.plot(x,y) plt.xlabel("百度热点") plt.ylabel("热度指数") plt.title('百度热搜帮热点热度指数') plt.show() #散点图 x = ['1','2','3','4','5','6','7','8','9'] y = [297362, 295628, 243392, 219490,214798,201257,179678,179060,170596] plt.scatter(x,y,color='blue', s=25, marker="o") plt.xlabel("百度热点") plt.ylabel("热度指数") plt.title("百度热搜帮热点热度指数") plt.show() #画一元二次回归方程 chinese=matplotlib.font_manager.FontProperties(fname='C:/Windows/Fonts/simsun.ttc') #调用中文 plt.rcParams['font.sans-serif']=['Arial Unicode MS'] plt.rcParams['axes.unicode_minus']=False filename="D:/resoubang.xlsx" colnames=["排名","热点","热度"] df=pd.read_excel(filename,skiprows=1,names=colnames) print(df) rank=df[:,1] rate_values=df[:,2] X=np.array(rank) Y=np.array(rate_values) def func(params,x): a,b,c = params return a * x * x + b * x + c def error(params,x,y): return func(params,x) - y def main(): plt.figure(figsize=(8,6)) p0 = [1980,300,1] Para = leastsq(error,p0,args=(X,Y)) a,b,c = Para[0] print("a=",a,"b=",b,"c=",c) p;t.scatter(X,Y,color="green",label="样本数据",linewidth=2) x = np.linespace(1,17,50) y = a * x * x + b * x + c plt.plot(x,y,color="red",label="拟合曲线",linewidth=2) plt.title("百度热点热度数据") plt.grid() plt.legend() plt.show() main()
四、结论
1.结论:经过对主题数据的分析与可视化,突出了个数据间的关系,简化了数据分析,了解了当代热搜行业代码的繁简程度
小结:通过这次作业,了解到了自己的众多不足,类似于回归方程的拟合以及一元多次方程的画法还掌握不当,这次任务加大了自己对python的兴趣,希望自己以后可以努力学习,更上一层楼。