一、主題式網絡爬蟲設計方案
1.主題式網絡爬蟲名稱
爬取微博熱搜
2.主題式網絡爬蟲爬取的內容與數據特征分析
爬取微博熱搜前十,熱度,排名。
3.主題式網絡爬蟲設計方案概述(包括實現思路與技術難點)
實現思路:確定爬取網頁,初始化信息,依靠request庫對目標頁面進行信息的爬取采集,用findall方法取標簽,將爬取數據保存到csv文件中。對數據進行清理處理,並對數據進行分析與可視化。
二、主題頁面的結構特征分析
1.主題頁面的結構與特征分析

2.Htmls頁面解析

三、網絡爬蟲程序設計
爬蟲程序主體要包括以下各部分,要附源代碼及較詳細注釋,並在每部分程序后面提供輸出結果的截圖。
1.數據爬取與采集
import requests from bs4 import BeautifulSoup import pandas as pd import numpy as np import re #請求網頁 url = 'https://tophub.today/n/KqndgxeLl9' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'} response = requests.get(url,headers=headers)#發送get請求 html = response.content.decode('utf-8')#配置編碼 html = response.text #print(html) #解析網頁與抓取信息 titles = re.findall('<a href=.*? target="_blank" .*?>(.*?)</a>',html)[3:13]#正則表達 hot = re.findall('<td>(.*?)</td>',html)[0:10] a = []#創建空列表 for i in range(10): a.append([i+1,titles[i],hot[i][:-1]]) #完成創建 file = pd.DataFrame(a,columns = ['排名','標題','熱度(單位:萬)']) print(file) file.to_csv('微博熱搜.csv')#保存文件

2.對數據進行清洗和處理
#使用read_excel方法讀取本地csv文件-微博熱搜.csv rs = pd.DataFrame(pd.read_csv('微博熱搜.csv')) rs.head()

#刪除無效列 rs.drop('熱度(單位:萬)',axis = 1,inplace=True) rs.head()

#只顯示存在缺失值的行列,清楚確定缺失值位置 rs[rs.isnull().values==True].head()

#統計各列的空值情況 print('\n==各列的空值情況如下: ===') rs.isnull().sum()

#查找重復值 rs.duplicated()

#統計缺失值NaN rs.isna().head()

#使用describe查看統計信息 rs.describe()

3.數據分析與可視化(例如:數據柱形圖、直方圖、散點圖、盒圖、分布圖)
(1)
import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy.optimize import leastsq plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽 filename = '微博熱搜.csv' colnames=["排名","熱度(單位:萬)","標題"] df = pd.read_csv(filename,skiprows=1,names=colnames) X=df.排名 Y=df.標題 #繪制散點圖 plt.scatter(X,Y,color='green',label="樣本數據",linewidth=2) #繪制折線圖 plt.plot(X,Y,color='red',linewidth=2) plt.xlabel("排名") plt.ylabel("熱度(單位:萬)") plt.grid() plt.show()

(2)
import pandas as pd import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei']#用來正常顯示中文標簽 data=np.array([431.3,135.5,128.0,114.0,112.8,97.0,95.5,93.1,89.9,89.3]) index=['1','2','3','4','5','6','7','8','9','10'] s = pd.Series(data,index) s.name='微博熱搜條形圖' s.plot(kind='bar',title='微博熱搜條形圖') plt.xlabel(排名) plt.ylabel(熱度) plt.show()

(3)
import seaborn as sns rs = pd.read_csv('微博熱搜.csv') sns.distplot(x,color="pink",bins=20,kde=True) plt.xlabel("排名") plt.ylabel("熱度") plt.title("排名與熱度直方圖") plt.show()

4.根據數據之間的關系,分析兩個變量之間的相關系數,畫出散點圖,並建立變量之間的回歸方程(一元或多元)
import numpy as np import scipy as sp import matplotlib.pyplot as plt import matplotlib from scipy.optimize import leastsq filename = '微博熱搜.csv' colnames=["排名","熱度(單位:萬)","標題"] df = pd.read_csv(filename,skiprows=1,names=colnames) X=df.排名 Y=df.標題 def fit_func(p,x): a,b,c=p return a*x*x+b*x+c def error_func(p,x,y): return fit_func(p,x)-y p0=[2,4,6] para=leastsq(error_func,p0,args=(X,Y)) a,b,c=para[0] plt.figure(figsize=(8,4)) plt.scatter(X,Y,color="pink",label=u"熱搜數據",linewidth=2) x=np.linspace(0,25,20) y=a*x*x+b*x+c plt.plot(x,y,color="blue",label=u"擬合直線",linewidth=2) plt.title("微博熱搜回歸方程") plt.legend() plt.show()

#使用corr()函數,判斷兩個屬性是否具有相關性 df['排名'].corr(df['標題'])

5.數據持久化

6.將以上各部分的代碼匯總,附上完整程序代碼
import requests from bs4 import BeautifulSoup import pandas as pd import numpy as np import re #請求網頁 url = 'https://tophub.today/n/KqndgxeLl9' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'} response = requests.get(url,headers=headers)#發送get請求 html = response.content.decode('utf-8')#配置編碼 html = response.text #print(html) #解析網頁與抓取信息 titles = re.findall('<a href=.*? target="_blank" .*?>(.*?)</a>',html)[3:13]#正則表達 hot = re.findall('<td>(.*?)</td>',html)[0:10] a = []#創建空列表 for i in range(10): a.append([i+1,titles[i],hot[i][:-1]]) #完成創建 file = pd.DataFrame(a,columns = ['排名','標題','熱度(單位:萬)']) print(file) file.to_csv('微博熱搜.csv')#保存文件 #使用read_excel方法讀取本地csv文件-微博熱搜.csv rs = pd.DataFrame(pd.read_csv('微博熱搜.csv')) rs.head() #刪除無效列 rs.drop('熱度(單位:萬)',axis = 1,inplace=True) rs.head() #只顯示存在缺失值的行列,清楚確定缺失值位置 rs[rs.isnull().values==True].head() #統計各列的空值情況 print('\n==各列的空值情況如下: ===') rs.isnull().sum() #查找重復值 rs.duplicated() #統計缺失值NaN rs.isna().head() #使用describe查看統計信息 rs.describe() #繪制散點圖和折線圖 import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy.optimize import leastsq plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽 filename = '微博熱搜.csv' colnames=["排名","熱度(單位:萬)","標題"] df = pd.read_csv(filename,skiprows=1,names=colnames) X=df.排名 Y=df.標題 #繪制散點圖 plt.scatter(X,Y,color='green',label="樣本數據",linewidth=2) #繪制折線圖 plt.plot(X,Y,color='red',linewidth=2) plt.xlabel("排名") plt.ylabel("熱度(單位:萬)") plt.grid() plt.show() #繪制條形圖 import pandas as pd import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei']#用來正常顯示中文標簽 data=np.array([431.3,135.5,128.0,114.0,112.8,97.0,95.5,93.1,89.9,89.3]) index=['1','2','3','4','5','6','7','8','9','10'] s = pd.Series(data,index) s.name='微博熱搜條形圖' s.plot(kind='bar',title='微博熱搜條形圖') plt.xlabel(排名) plt.ylabel(熱度) plt.show() #繪制直方圖 import seaborn as sns rs = pd.read_csv('微博熱搜.csv') sns.distplot(x,color="pink",bins=20,kde=True) plt.xlabel("排名") plt.ylabel("熱度") plt.title("排名與熱度直方圖") plt.show() #回歸方程 import numpy as np import scipy as sp import matplotlib.pyplot as plt import matplotlib from scipy.optimize import leastsq filename = '微博熱搜.csv' colnames=["排名","熱度(單位:萬)","標題"] df = pd.read_csv(filename,skiprows=1,names=colnames) X=df.排名 Y=df.標題 def fit_func(p,x): a,b,c=p return a*x*x+b*x+c def error_func(p,x,y): return fit_func(p,x)-y p0=[2,4,6] para=leastsq(error_func,p0,args=(X,Y)) a,b,c=para[0] plt.figure(figsize=(8,4)) plt.scatter(X,Y,color="pink",label=u"熱搜數據",linewidth=2) x=np.linspace(0,25,20) y=a*x*x+b*x+c plt.plot(x,y,color="blue",label=u"擬合直線",linewidth=2) plt.title("微博熱搜回歸方程") plt.legend() plt.show() #使用corr()函數,判斷兩個屬性是否具有相關性 df['排名'].corr(df['標題'])
四結論(10分)
1.經過對主題數據的分析與可視化,可以得到哪些結論?
通過對數據的分析與可視化,可以清楚的展現出微博熱搜排名與熱度的變化,更直觀的體現熱度的變化。
2.對本次程序設計任務完成的情況做一個簡單的小結。
通過此次的設計作業,學習到了細心和耐心,也一定程度上加深了我對python網絡爬蟲的了解,也對爬蟲更加的感興趣,發現爬取的數據更能真實反映出數據變化。對於此次設計作業,一開始代碼出現很多問題,通過不斷的回看上課視頻,查找資料,慢慢的能夠實質上的解決,但仍有很多不足之處。對於xpath,正則表達等不能很好地處理。
