2020年當下軟件園軟件下載總排行榜


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

1.爬蟲名稱:2020年當下軟件園軟件下載總排行榜。

2.爬取內容:排名、軟件類型、軟件名稱、用戶評分、內存大小、評級。

3.爬蟲設計方案概述:

      (1)思路:找到要爬取的網頁,按F12查看網頁代碼,找到所要爬取的數據及分析標簽,導入相應庫,然后開始對數據進行爬取,進行數據的清洗、處理、可視化和保存。

      (2)技術難點:爬取內容多不好做數據可視化處理和回歸方程,對python理解不夠透徹,回歸方程不是很理解。實在是不會;而且代碼做不到400行。

二、主題頁面的結構特征分析

1.主題頁面的結構與特征分析

 

 

2.Htmls頁面解析

 

  3.節點查找

 

 

三、網絡爬蟲程序設計

1.數據爬取與采集

 1 import requests
 2 from bs4 import BeautifulSoup
 3 import bs4
 4 import pandas as pd
 5 import matplotlib.pyplot as plt
 6 import numpy as np
 7 import re
 8 import scipy as sp
 9 from scipy.optimize import leastsq
10 import matplotlib as mpl
11 from numpy import genfromtxt
12 import seaborn as sns 
13 url = 'http://www.downxia.com/downtop/1_1.html'
14 def f(s):
15     try:
16         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'}
17         r=requests.get(s,timeout=30,headers=headers)
18         r.raise_for_status()
19         r.encoding=r.apparent_encoding
20         soup=BeautifulSoup(r.text,'lxml')
21         return soup
22     except:
23         return ""
24 soup=f(url)
25 type1=[]
26 name=[]
27 fraction=[]
28 size_=[]
29 grade_=[]
30 for link1 in soup.find_all(class_='type'): 
31     type1.append(link1.get_text())
32 for link2 in soup.find_all(class_='tit'):
33     name.append(link2.get_text().strip())
34     
35 for link3 in soup.find_all('td',class_='fa'):
36     fraction.append(link3.get_text().strip())
37 for i in range(0,200):
38     if i%2==0:
39         del fraction[0]
40     else:
41         fraction.append(fraction[0])
42         del fraction[0]
43 
44 for link4 in soup.find_all("img"):
45     grade_.append(link4)
46 grade_s=re.findall("s[0-5]",str(grade_))
47 grade=re.findall("\d",str(grade_s))
48 #print(len(grade),grade)
49 
50 size_= re.findall("<td>[A-Za-z0-9|.]+[A-Z]</td>",str(soup))
51 size=re.findall("[0-9|.]+[A-Z]",str(size_))
52 #print(len(size),size)
53 paiming=[]
54 for i in range(len(name)):
55     paiming.append("第{:}名".format(i+1))
56 data=pd.DataFrame([paiming,type1,name,fraction,size,grade],index=["排名","軟件類型","軟件名稱","用戶評分","內存大小","評級"]).T
57 print(data.loc[0:100,])
58 
59 index=range(0,len(type1))
60 s=pd.Series(type1,index)
61 #print(s.value_counts().iloc[0:3])
62 
63 fraction.sort(reverse=True)
64 #正常顯示中文文字
65 mpl.rcParams['font.sans-serif'] = ['KaiTi']
66 mpl.rcParams['font.serif'] = ['KaiTi']
67 mpl.rcParams['axes.unicode_minus'] = False 
68 
69 
70 #print(soup)
71 # print(fraction)
72 # print(type1)
73 # print(name)
74 # print(fraction)
75 
76 # plt.figure(figsize=(10,6))
77 # plt.scatter(str(type1),fraction.color="green",label="樣本數據",linewidth=2)
78 # plt.grid()
79 # plt.show()
80 
81 # a=type1[0:100]
82 # b=fraction[0:100]
83 # print(a,b)
84 # print(len(type1),len(fraction))
85 # sns.regplot(str(a),b)

 

 

 

 

 

 

 

 

 

 

2.對數據進行清洗和處理

1 #讀取文件顯示前10行
2 
3 wb = pd.DataFrame(pd.read_excel('D:\\2020年當下軟件園總排行榜.xlsx'))
4 wb.head(10)

 

 

1 #檢查是否有空值
2 
3 
4 
5 wb.isnull().sum()

 

#檢查是否有缺失值



wb.isnull()

 

 

1 刪除無效行和列
2 
3 wb.drop('內存大小', axis=1, inplace = True)
4 wb.drop('評級', axis=1, inplace = True)
5 wb.head(10)

 

 

 3,數據分析和可視化

1 #繪制折線圖
2 
3 
4 plt.plot(['第一名','第二名','第三名','第四名','第五名','第六名','第七名','第八名','第九名','第十名'],
5         [5,5.4,7,8.1,7.2,8.1,8.6,8.4,6.9,7.5],label="前10名排名與用戶評分柱狀圖")
6 plt.title("前十名排名和用戶評分之間的關系")
7 plt.legend()
8 plt.show()

 

 

1 繪制垂直柱狀圖
2 
3 plt.bar(['第一名','第二名','第三名','第四名','第五名','第六名','第七名','第八名','第九名','第十名'],
4         [5,5.4,7,8.1,7.2,8.1,8.6,8.4,6.9,7.5],label="前10名排名與用戶評分柱狀圖")

 

 

1 #水平柱狀圖
2 
3 plt.barh(['第一名','第二名','第三名','第四名','第五名','第六名','第七名','第八名','第九名','第十名'],
4         [5,5.4,7,8.1,7.2,8.1,8.6,8.4,6.9,7.5],label="前10名排名與用戶評分柱狀圖")

 

 

1 plt.rcParams['font.sans-serif']=['Arial Unicode MS'] #用來正常顯示中文標簽
2 plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號
3 data=np.array([5,5.4,7,8.1,7.2,8.1,8.6,8.4,6.9,7.5])
4 index=['第一名','第二名','第三名','第四名','第五名','第六名','第七名','第八名','第九名','第十名']
5 s = pd.Series(data, index)
6 s.name='前10名排名與用戶評分柱狀圖'
7 s.plot(kind='bar',title='前10名排名與用戶評分柱狀圖')
8 plt.show()

 

 

 

 

5.持久化

1 #創建文件名
2 
3 wb ='D:\\2020年當下軟件園總排行榜.xlsx'
4 #將數據保存
5 
6 data.to_excel(wb)

 

 

6.附上完整代碼

 

  1 #導入相應庫
  2 
  3 import requests
  4 from bs4 import BeautifulSoup
  5 import bs4
  6 import pandas as pd
  7 import matplotlib.pyplot as plt
  8 import numpy as np
  9 import re
 10 import scipy as sp
 11 from scipy.optimize import leastsq
 12 import matplotlib as mpl
 13 from numpy import genfromtxt
 14 import seaborn as sns 
 15 url = 'http://www.downxia.com/downtop/1_1.html'#網站網址
 16 def f(s):
 17     try:                                                                                 #偽裝爬蟲
 18         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'}
 19         r=requests.get(s,timeout=30,headers=headers)
 20         r.raise_for_status()
 21         r.encoding=r.apparent_encoding
 22         soup=BeautifulSoup(r.text,'lxml')
 23         return soup
 24     except:
 25         return ""
 26 soup=f(url)   #設置空列表
 27 #儲存軟件類型
 28 type1=[]
 29 #儲存軟件名稱
 30 name=[]
 31 #儲存用戶評分
 32 fraction=[]
 33 #儲存內存大小
 34 size_=[]
 35 #儲存評級
 36 grade_=[]
 37 
 38 #用for循環爬取需要的數據
 39 
 40 for link1 in soup.find_all(class_='type'): 
 41     type1.append(link1.get_text())
 42 for link2 in soup.find_all(class_='tit'):
 43     name.append(link2.get_text().strip())
 44     
 45 for link3 in soup.find_all('td',class_='fa'):
 46     fraction.append(link3.get_text().strip())
 47 for i in range(0,200):
 48     if i%2==0:
 49         del fraction[0]
 50     else:
 51         fraction.append(fraction[0])
 52         del fraction[0]
 53 
 54 for link4 in soup.find_all("img"):
 55     grade_.append(link4)
 56 grade_s=re.findall("s[0-5]",str(grade_))
 57 grade=re.findall("\d",str(grade_s))
 58 #print(len(grade),grade)
 59 
 60 size_= re.findall("<td>[A-Za-z0-9|.]+[A-Z]</td>",str(soup))
 61 size=re.findall("[0-9|.]+[A-Z]",str(size_))
 62 #print(len(size),size)
 63 paiming=[]
 64 for i in range(len(name)):
 65     paiming.append("第{:}名".format(i+1))
 66 data=pd.DataFrame([paiming,type1,name,fraction,size,grade],index=["排名","軟件類型","軟件名稱","用戶評分","內存大小","評級"]).T
 67 print(data.loc[0:100,])
 68 
 69 index=range(0,len(type1))
 70 s=pd.Series(type1,index)
 71 #print(s.value_counts().iloc[0:3])
 72 
 73 fraction.sort(reverse=True)
 74 #正常顯示中文文字
 75 mpl.rcParams['font.sans-serif'] = ['KaiTi']
 76 mpl.rcParams['font.serif'] = ['KaiTi']
 77 mpl.rcParams['axes.unicode_minus'] = False 
 78 
 79 #數據清洗和處理
 80 
 81 #讀取文件顯示前10行 
 82 wb = pd.DataFrame(pd.read_excel('D:\\2020年當下軟件園總排行榜.xlsx'))
 83 wb.head(10)
 84 
 85 #檢查是否有空值
 86 wb.isnull().sum()
 87 
 88 #檢查是否有缺失值
 89 wb.isnull()
 90 
 91 #刪除無效行和列
 92 wb.drop('內存大小', axis=1, inplace = True)
 93 wb.drop('評級', axis=1, inplace = True)
 94 wb.head(10)
 95 
 96 #繪制前十名折線圖
 97 
 98 import matplotlib as mpl
 99 plt.plot(['第一名','第二名','第三名','第四名','第五名','第六名','第七名','第八名','第九名','第十名'],
100         [5,5.4,7,8.1,7.2,8.1,8.6,8.4,6.9,7.5],label="前10名排名與用戶評分柱狀圖")
101 plt.title("前十名排名和用戶評分之間的關系")
102 plt.legend()
103 plt.show()
104 
105 #繪制前十名垂直柱狀圖
106 
107 plt.bar(['第一名','第二名','第三名','第四名','第五名','第六名','第七名','第八名','第九名','第十名'],
108         [5,5.4,7,8.1,7.2,8.1,8.6,8.4,6.9,7.5],label="前10名排名與用戶評分柱狀圖")
109 
110 #繪制前十名水平柱狀圖
111 
112 plt.barh(['第一名','第二名','第三名','第四名','第五名','第六名','第七名','第八名','第九名','第十名'],
113         [5,5.4,7,8.1,7.2,8.1,8.6,8.4,6.9,7.5],label="前10名排名與用戶評分柱狀圖")
114 
115 #繪制前十名散點圖
116 
117 plt.scatter(['第一名','第二名','第三名','第四名','第五名','第六名','第七名','第八名','第九名','第十名'],
118         [5,5.4,7,8.1,7.2,8.1,8.6,8.4,6.9,7.5],label="前10名排名與用戶評分柱狀圖")
119 plt.title("前十名排名和用戶評分之間的關系")
120 plt.legend()
121 plt.show()
122 
123 
124 plt.rcParams['font.sans-serif']=['Arial Unicode MS'] #用來正常顯示中文標簽
125 plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號
126 data=np.array([5,5.4,7,8.1,7.2,8.1,8.6,8.4,6.9,7.5])
127 index=['第一名','第二名','第三名','第四名','第五名','第六名','第七名','第八名','第九名','第十名']
128 s = pd.Series(data, index)
129 s.name='前10名排名與用戶評分柱狀圖'
130 s.plot(kind='bar',title='前10名排名與用戶評分柱狀圖')
131 plt.show()
132 
133 
134    
135 
136 #數據持久化
137 
138 #創建文件名
139 wb ='D:\\2020年當下軟件園總排行榜.xlsx'
140 #將數據保存
141 data.to_excel(wb)
142 
143 #print(soup)
144 # print(fraction)
145 # print(type1)
146 # print(name)
147 # print(fraction)
148 
149 # plt.figure(figsize=(10,6))
150 # plt.scatter(str(type1),fraction.color="green",label="樣本數據",linewidth=2)
151 # plt.grid()
152 # plt.show()
153 
154 # a=type1[0:100]
155 # b=fraction[0:100]
156 # print(a,b)
157 # print(len(type1),len(fraction))
158 # sns.regplot(str(a),b)

 

 

四、結論

1.結論:用戶評分和排名並無多大關系,數據可視化后看起來更直觀和明了。

2.小結:通過此次作業,讓自己對python爬蟲工具和數據可視化有了更全面和更深的了解,同時也認知到自己的許多不足之處和使用爬蟲工具的簡便性和全面性,今后會非常用心去學習和了解python。


免責聲明!

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



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