爬取百度排行榜


一.主題式網絡主題式網絡爬蟲設計方案

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=["排名","標題","熱度數據"]
df=pd.read_excel(filename,skiprows=1,names=colnames)
print(df)
X=df.排名
Y=df.熱度數據
def func(p, x):
    a, b, c= p
    return a*x*x+b*x+c
def error(p, x, y):
    return func(p, x) - y 
p0=[1978,20]
def main():
plt.figure(figsize=(10,6)) p0
=[1980,300,1] Para=leastsq(error,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(100000,600000,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=["排名","標題","熱度數據"] df=pd.read_excel(filename,skiprows=1,names=colnames) print(df) X=df.排名 Y=df.熱度數據 def func(p, x): a, b, c= p return a*x*x+b*x+c def error(p, x, y): return func(p, x) - y
p0=[1978,20]
def main():
plt.figure(figsize=(10,6)) p0
=[1980,300,1] Para=leastsq(error,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(100000,600000,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的興趣,希望自己以后可以努力學習,更上一層樓。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM