Python網絡爬蟲課程設計


一、選題的背景

為什么要選擇此選題?要達到的數據分析的預期目標是什么?(10 分)

為了通過爬取網站獲取的信息來分析現在網絡上社會、經濟、技術等各種信息網站的影響力排行,以此了解人們對哪種信息網站更青睞,訪問的更加頻繁。

二、主題式網絡爬蟲設計方案(10 分)

1.主題式網絡爬蟲名稱

《Python爬蟲對站長之家網站分類信息網站排行榜的爬取及分析》

2.主題式網絡爬蟲爬取的內容與數據特征分析

爬取內容:各類網站的網站名稱,網址,Alexa周排名,反鏈數。

數據特征分析:Alexa周排名,反鏈數等數據可通過后續繪制直方圖、散點圖等觀察數據的變化情況。

3.主題式網絡爬蟲設計方案概述(包括實現思路與技術難點)

實現思路:本次設計方案主要使用request庫爬取網頁信息和beautifulSoup庫來提取分類信息網站排行榜的信息。

技術難點:主要包括對站長之家網站分類信息網站排行榜部分的頁面進行分析采集以及數據的可視化。

三、主題頁面的結構特征分析(10 分)

1.主題頁面的結構特征

2. 通過F12,對頁面進行檢查,查看我們所需要爬取內容的相關代碼

 

3.節點(標簽)查找方法與遍歷方法

查找方法:find

遍歷方法:for循環

 

四、網絡爬蟲程序設計(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這門語言有了更深的理解,推動自己更好地進步。

 


免責聲明!

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



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