一、選題的背景
為什么要選擇此選題?要達到的數據分析的預期目標是什么?(10 分)
為了通過爬取網站獲取的信息來分析現在網絡上社會、經濟、技術等各種信息網站的影響力排行,以此了解人們對哪種信息網站更青睞,訪問的更加頻繁。
二、主題式網絡爬蟲設計方案(10 分)
1.主題式網絡爬蟲名稱
《Python爬蟲對站長之家網站分類信息網站排行榜的爬取及分析》
2.主題式網絡爬蟲爬取的內容與數據特征分析
爬取內容:各類網站的網站名稱,網址,Alexa周排名,反鏈數。
數據特征分析:Alexa周排名,反鏈數等數據可通過后續繪制直方圖、散點圖等觀察數據的變化情況。
3.主題式網絡爬蟲設計方案概述(包括實現思路與技術難點)
實現思路:本次設計方案主要使用request庫爬取網頁信息和beautifulSoup庫來提取分類信息網站排行榜的信息。
三、主題頁面的結構特征分析(10 分)
1.主題頁面的結構特征
2. 通過F12,對頁面進行檢查,查看我們所需要爬取內容的相關代碼
3.節點(標簽)查找方法與遍歷方法
查找方法:find
四、網絡爬蟲程序設計(60 分)
爬蟲程序主體要包括以下各部分,要附源代碼及較詳細注釋,並在每部分程序后面提供輸出結果的截圖。
1.數據爬取與采集
1 #導入庫 2 import requests 3 from lxml import etree 4 import pandas as pd 5 6 #初始列表 7 sitename_oyr,websites_oyr, Alexa_oyr, Antichain_oyr = [], [], [], [] 8 for a in range(15): 9 10 #爬取網站的網址並且循環爬取前15頁的內容 11 url = "https://top.chinaz.com/hangye/index_shenghuo_fenlei_{}.html".format(a*15) 12 13 #設置請求頭 14 headers = { 15 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36" 16 } 17 18 #requests請求鏈接 19 rq = requests.get(url,headers=headers).text 20 21 #使用lxml模塊中的etree方法講字符串轉化為html標簽 22 html = etree.HTML(rq) 23 24 #用xpath定位標簽位置 25 html = html.xpath("/html/body/div[4]/div[3]/div[2]/ul/li") 26 27 #獲取要爬取內容的詳情鏈接 28 for yr in html: 29 #爬取網站名稱 30 sitename = yr.xpath("./div[2]/h3/a/text()")[0] 31 #爬取網址 32 websites = yr.xpath("./div[2]/h3/span/text()")[0] 33 #爬取Alexa周排名 34 Alexa = yr.xpath("./div[2]/div/p[1]/a/text()")[0] 35 #爬取反鏈數 36 Antichain = yr.xpath("./div[2]/div/p[4]/a/text()")[0] 37 38 #輸出 39 print(sitename) 40 print(websites) 41 print(Alexa) 42 print(Antichain) 43 44 #將字段存入初始化的列表中 45 sitename_oyr.append(sitename) 46 websites_oyr.append(websites) 47 Alexa_oyr.append(Alexa) 48 Antichain_oyr.append(Antichain) 49 50 #pandas中的模塊將數據存入 51 df = pd.DataFrame({ 52 "網站名稱" : sitename_oyr, 53 "網址" : websites_oyr, 54 "Alexa周排名" : Alexa_oyr, 55 "反鏈數" : Antichain_oyr, 56 }) 57 58 #儲存為csv文件 59 df.to_csv("paiming.csv" , encoding='utf_8_sig', index=False)
2.對數據進行清洗和處理
3.文本分析(可選):jieba 分詞、wordcloud 的分詞可視化
4.數據分析與可視化(例如:數據柱形圖、直方圖、散點圖、盒圖、分布圖)
1 #直方圖 2 import pandas as pd 3 import numpy as np 4 import matplotlib.pyplot as plt 5 plt.rcParams['font.family'] = ['SimHei'] 6 s = pd.Series([5768,10433,10433,1168],['南寧趕集網','武漢百姓網','廈門百姓網','58同城長葛分類信息網']) 7 s.plot(kind = 'bar',title = '網站Alexa周排名') 8 plt.show()
5.根據數據之間的關系,分析兩個變量之間的相關系數,畫出散點圖,並建立變
量之間的回歸方程(一元或多元)。
1 #散點圖 2 sns.lmplot(x='Alexa周排名',y='反鏈數',data=paiming)
1 #回歸方程 2 import pandas as pd 3 import numpy as np 4 import matplotlib.pyplot as plt 5 from scipy.optimize import leastsq 6 X=paiming.loc[:,'反鏈數'] 7 Y=paiming.loc[:,'Alexa周排名'] 8 def func(params,x): 9 a,b,c=params 10 return a*x*x+b*x+c 11 def error_func(params,x,y): 12 return func(params,x)-y 13 P0=[1,9.0] 14 def main(): 15 plt.figure(figsize=(8,6)) 16 P0=[1,9.0,1] 17 Para=leastsq(error_func,P0,args=(X,Y)) 18 a,b,c=Para[0] 19 print("a=",a, "b=",b, "c=",c) 20 plt.scatter(X,Y,color="green",label="樣本數據",linewidth=2) 21 x=np.linspace(1,2500,10) 22 y=a*x*x+b*x+c 23 plt.plot(x,y,color="red",label="擬合曲線",linewidth=2) 24 plt.xlabel('反鏈數') 25 plt.ylabel('Alexa周排名') 26 plt.title("Alexa周排名與反鏈數回歸方程") 27 plt.grid() 28 plt.legend() 29 plt.show() 30 main()
6.數據持久化
1 #儲存為csv文件 2 df.to_csv("paiming.csv" , encoding='utf_8_sig', index=False)
7.將以上各部分的代碼匯總,附上完整程序代碼
1 #導入庫 2 import requests 3 from lxml import etree 4 import pandas as pd 5 6 #初始列表 7 sitename_oyr,websites_oyr, Alexa_oyr, Antichain_oyr = [], [], [], [] 8 for a in range(15): 9 10 #爬取網站的網址並且循環爬取前15頁的內容 11 url = "https://top.chinaz.com/hangye/index_shenghuo_fenlei_{}.html".format(a*15) 12 13 #設置請求頭 14 headers = { 15 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36" 16 } 17 18 #requests請求鏈接 19 rq = requests.get(url,headers=headers).text 20 21 #使用lxml模塊中的etree方法講字符串轉化為html標簽 22 html = etree.HTML(rq) 23 24 #用xpath定位標簽位置 25 html = html.xpath("/html/body/div[4]/div[3]/div[2]/ul/li") 26 27 #獲取要爬取內容的詳情鏈接 28 for yr in html: 29 #爬取網站名稱 30 sitename = yr.xpath("./div[2]/h3/a/text()")[0] 31 #爬取網址 32 websites = yr.xpath("./div[2]/h3/span/text()")[0] 33 #爬取Alexa周排名 34 Alexa = yr.xpath("./div[2]/div/p[1]/a/text()")[0] 35 #爬取反鏈數 36 Antichain = yr.xpath("./div[2]/div/p[4]/a/text()")[0] 37 38 #輸出 39 print(sitename) 40 print(websites) 41 print(Alexa) 42 print(Antichain) 43 44 #將字段存入初始化的列表中 45 sitename_oyr.append(sitename) 46 websites_oyr.append(websites) 47 Alexa_oyr.append(Alexa) 48 Antichain_oyr.append(Antichain) 49 50 #pandas中的模塊將數據存入 51 df = pd.DataFrame({ 52 "網站名稱" : sitename_oyr, 53 "網址" : websites_oyr, 54 "Alexa周排名" : Alexa_oyr, 55 "反鏈數" : Antichain_oyr, 56 }) 57 58 #儲存為csv文件 59 df.to_csv("paiming.csv" , encoding='utf_8_sig', index=False) 60 61 62 63 64 65 #導入庫 66 import pandas as pd 67 paiming = pd.DataFrame(pd.read_csv('paiming.csv',encoding="gbk")) 68 paiming.head() 69 70 #查找重復值 71 paiming.duplicated() 72 73 #查找空值與缺失值 74 paiming['網站名稱'].isnull().value_counts() 75 76 paiming['網址'].isnull().value_counts() 77 78 paiming['Alexa周排名'].isnull().value_counts() 79 80 paiming['反鏈數'].isnull().value_counts() 81 82 #查找異常值 83 paiming.describe() 84 85 #直方圖 86 import pandas as pd 87 import numpy as np 88 import matplotlib.pyplot as plt 89 plt.rcParams['font.family'] = ['SimHei'] 90 s = pd.Series([5768,10433,10433,1168],['南寧趕集網','武漢百姓網','廈門百姓網','58同城長葛分類信息網']) 91 s.plot(kind = 'bar',title = '網站Alexa周排名') 92 plt.show() 93 94 #散點圖 95 sns.lmplot(x='Alexa周排名',y='反鏈數',data=paiming) 96 97 #回歸方程 98 #回歸方程 99 import pandas as pd 100 import numpy as np 101 import matplotlib.pyplot as plt 102 from scipy.optimize import leastsq 103 X=paiming.loc[:,'反鏈數'] 104 Y=paiming.loc[:,'Alexa周排名'] 105 def func(params,x): 106 a,b,c=params 107 return a*x*x+b*x+c 108 def error_func(params,x,y): 109 return func(params,x)-y 110 P0=[1,9.0] 111 def main(): 112 plt.figure(figsize=(8,6)) 113 P0=[1,9.0,1] 114 Para=leastsq(error_func,P0,args=(X,Y)) 115 a,b,c=Para[0] 116 print("a=",a, "b=",b, "c=",c) 117 plt.scatter(X,Y,color="green",label="樣本數據",linewidth=2) 118 x=np.linspace(1,2500,10) 119 y=a*x*x+b*x+c 120 plt.plot(x,y,color="red",label="擬合曲線",linewidth=2) 121 plt.xlabel('反鏈數') 122 plt.ylabel('Alexa周排名') 123 plt.title("Alexa周排名與反鏈數回歸方程") 124 plt.grid() 125 plt.legend() 126 plt.show() 127 main()
五、總結(10 分)
1.經過對主題數據的分析與可視化,可以得到哪些結論?是否達到預期的目標?
通過將爬取到的各個網站的Alexa周排名還有反鏈數,加以分析與可視化后由此可知:
通常情況下反鏈數越大,Alexa周排名越高,反鏈數越小,Alexa周排名越不確切。
2.在完成此設計過程中,得到哪些收獲?以及要改進的建議?
本次網絡爬蟲課程設計的各個部分都已完成,先是用requests庫獲取到目標網頁的內容;再將所爬取的目標數據存儲到本地的csv文件,實現數據的持久化,可為未來使用和研究減少代碼量的修改;再將完整的數據進行清洗,最后通過庫對研究對象繪圖分析。從一個大框架再不斷細分完成每一部分的內容,使自己在實踐時有了更明確的思路,本次完成課程設計更是一種對自我的肯定。雖然有一些沒有完全實現出來,還存在在一些問題,但是發現了問題也就能及時查缺補漏,讓我對Python這門語言有了更深的理解,推動自己更好地進步。