爬取百度熱搜風雲榜數據


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

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的興趣,希望自己以后可以努力學習,更上一層樓。


免責聲明!

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



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