爬取百度热搜榜Top50

一.主题式网络主题式网络爬虫设计方案

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学习我会更加认真,弥补我自己的不足。

猜你喜欢

转载自www.cnblogs.com/qqnkwdb/p/12749156.html