爬取百度排行榜

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

1.爬虫名称:爬取百度热搜榜Top50

2.爬取内容:热点排名,热门标题,搜索热度

3.网络爬虫设计方案概述:

思路:通过分析网页源代码,找出数据所在的标签,通过爬虫读取数据保存到excel文件中,读取文件,对数据进行清洗和处理,数据分析与可视化处理。

技术难点:掌握知识不够,操作过于生疏,对网页爬取还有很多疑问

二.主题页面的结构特征分析

1.主题页面的结构与特征分析:爬取数据都分布在标签'<div class="wrapper">…</div>'里面,排名标签为num-top,标题标签为'list-title',热度标签为'icon-rise'

2.Htmls页面解析:

三、网络爬虫程序设计

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)
df=pd.DataFrame(final,index=["排名","标题","热度数据"])                      #使用工具使其可视化
print(df.T)
                        
S="D:/ 百度排行榜.xlsx"
df.T.to_excel(S)

 

2.对数据进行清洗和处理:

#数据清洗
print('\n====各列是否有缺失值情况如下:====')
print(df.isnull())     #统计空值情况
print(df.duplicated()) #查找重复值
print(df.isna().head()) 
print(df.describe())   #描述数据 

3.数据分析与可视化:

1

import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif']=['SimHei']
x =['湖北高考时间公布','李沁挽张若昀','演员张冲霄去世','新型冠状病毒','北京上空出现日晕','猫和老鼠导演去世','美国确诊超69万']
y = [1,2,3,4,5,6,7]
plt.plot(x,y)
plt.xlabel("标题")
plt.ylabel("排名")
plt.title('Top7热点')
plt.show()

2;柱状图

plt.rcParams['font.family']=['sans-serif']
plt.rcParams['font.sans-serif']=['SimHei']
plt.bar(['湖北高考时间公布','李沁挽张若昀','演员张冲霄去世','新型冠状病毒','北京上空出现日晕','猫和老鼠导演去世','美国确诊超69万'], [288274,96157,91377,87846,75818,66756,64747])
plt.legend()
plt.xlabel("热搜事件")
plt.ylabel("热度指数")
plt.title('Top7热点')
plt.show()

3:折线图

#折线图
def line_diagram():
    x = ['湖北高考时间公布','李沁挽张若昀','演员张冲霄去世','新型冠状病毒','北京上空出现日晕','猫和老鼠导演去世','美国确诊超69万']
    y = [288274,96157,91377,87846,75818,66756,64747]
    plt.xlabel('事件')
    plt.ylabel('热度')
    plt.plot(x,y)
    plt.scatter(x,y)
    plt.title("热搜事件与热度折线图")
    plt.show()
line_diagram()

4:散点图

#散点图
def Scatter_point():
    x = ['湖北高考时间公布','李沁挽张若昀','演员张冲霄去世','新型冠状病毒','北京上空出现日晕','猫和老鼠导演去世','美国确诊超69万']
    y = [1,2,3,4,5,6,7]
    plt.scatter(x,y,color='pink', s=25, marker="o")
    plt.xlabel("事件")
    plt.ylabel("热度")
    plt.title("热搜事件与热度散点图")
    plt.show()
Scatter_point()

5:一元二次方程

#一元二次方程
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
from scipy.optimize import leastsq
chinese=matplotlib.font_manager.FontProperties(fname='C:/Windows/Fonts/simsun.ttc')
#调用中文
filename="D:/ 百度排行榜.xlsx"
colnames=["rank","rate_value","hot"]
df=pd.read_excel(filename,skiprows=1,names=colnames)
print(df)
X=df.rank
Y=df.rate_value
def fit_func(p, x):
    a, b, c= p
    return a*x*x+b*x+c
def error_func(p, x, y):
    return func(p, x) - y 
def main():
    p0=[1978,300,1]
    Para=leastsq(error_func,p0,args=(X,Y))
    a,b,c=Para[0]
    print("a=", a,"b=", b,"c=", c)
    plt.figure(figsize=(10,6))
    plt.scatter(X, Y, color="green", label="样本数据",linewidth=2)
    x=np.linspace(1978,2020,300)
    y=a*x*x+b*x+c
    plt.plot(X,Y,color="red",label=u"拟合直线",linewidth=2)
    plt.title(" 百度排行榜 ")
    plt.grid()
    plt.legend()
    plt.show()
main()

6:将以上各部分的代码汇总,附上完整程序代码:

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)
df=pd.DataFrame(final,index=["排名","标题","热度数据"])                      #使用工具使其可视化
print(df.T)
                        
S="D:/ 百度排行榜.xlsx"
df.T.to_excel(S)     



#数据清洗
print('\n====各列是否有缺失值情况如下:====')
print(df.isnull())     #统计空值情况
print(df.duplicated()) #查找重复值
print(df.isna().head()) 
print(df.describe())   #描述数据 

import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif']=['SimHei']
x =['湖北高考时间公布','李沁挽张若昀','演员张冲霄去世','新型冠状病毒','北京上空出现日晕','猫和老鼠导演去世','美国确诊超69万']
y = [1,2,3,4,5,6,7]
plt.plot(x,y)
plt.xlabel("标题")
plt.ylabel("排名")
plt.title('Top7热点')
plt.show()

plt.rcParams['font.family']=['sans-serif']
plt.rcParams['font.sans-serif']=['SimHei']
plt.bar(['湖北高考时间公布','李沁挽张若昀','演员张冲霄去世','新型冠状病毒','北京上空出现日晕','猫和老鼠导演去世','美国确诊超69万'], [288274,96157,91377,87846,75818,66756,64747])
plt.legend()
plt.xlabel("热搜事件")
plt.ylabel("热度指数")
plt.title('Top7热点')
plt.show()
#折线图
def line_diagram():
    x = ['湖北高考时间公布','李沁挽张若昀','演员张冲霄去世','新型冠状病毒','北京上空出现日晕','猫和老鼠导演去世','美国确诊超69万']
    y = [288274,96157,91377,87846,75818,66756,64747]
    plt.xlabel('事件')
    plt.ylabel('热度')
    plt.plot(x,y)
    plt.scatter(x,y)
    plt.title("热搜事件与热度折线图")
    plt.show()
line_diagram()
#散点图
def Scatter_point():
    x = ['湖北高考时间公布','李沁挽张若昀','演员张冲霄去世','新型冠状病毒','北京上空出现日晕','猫和老鼠导演去世','美国确诊超69万']
    y = [1,2,3,4,5,6,7]
    plt.scatter(x,y,color='pink', s=25, marker="o")
    plt.xlabel("事件")
    plt.ylabel("热度")
    plt.title("热搜事件与热度散点图")
    plt.show()
Scatter_point()
#一元二次方程
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
from scipy.optimize import leastsq
chinese=matplotlib.font_manager.FontProperties(fname='C:/Windows/Fonts/simsun.ttc')
#调用中文
filename="D:/ 百度排行榜.xlsx"
colnames=["rank","rate_value","hot"]
df=pd.read_excel(filename,skiprows=1,names=colnames)
print(df)
X=df.rank
Y=df.rate_value
def fit_func(p, x):
    a, b, c= p
    return a*x*x+b*x+c
def error_func(p, x, y):
    return func(p, x) - y 
def main():
    p0=[1978,300,1]
    Para=leastsq(error_func,p0,args=(X,Y))
    a,b,c=Para[0]
    print("a=", a,"b=", b,"c=", c)
    plt.figure(figsize=(10,6))
    plt.scatter(X, Y, color="green", label="样本数据",linewidth=2)
    x=np.linspace(1978,2020,300)
    y=a*x*x+b*x+c
    plt.plot(X,Y,color="red",label=u"拟合直线",linewidth=2)
    plt.title(" 百度排行榜 ")
    plt.grid()
    plt.legend()
    plt.show()
main()


plt.savefig(fname="D:/百度热搜榜排名和热度关系图.jpg",figsize=[1,1])
#保存图像

四、结论

1.经过对主题数据的分析与可视化,可以得到哪些结论?

结论:python这门语言博大精深,虽然初学但是还是能感受到其中的奥秘以及难度,比起其他语言容易上手但但精通,我在数据处理这块还是有很多问题需要解决。

2.小结:通过这次作业,了解到了自己的众多不足,类似于回归方程的拟合以及一元多次方程的画法还掌握不当,这次任务加大了自己对python的兴趣,希望自己以后可以努力学习,更上一层楼。

猜你喜欢

转载自www.cnblogs.com/huangguowei/p/12763589.html