一、主題式網絡爬蟲設計設計方案
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。