Python騷操作:分析史上最好用的APP有哪些?
摘要: 如今移動網際網路越來越發達,各式各樣的 App 層出不窮,也就產生了優劣之分,相比於普通 App,我們肯定願意去使用那些良心佳軟,但去發現這些 App 並不太容易,本文使用 Scrapy 框架爬取了著名應用下載市場「酷安網」上的 6000 餘款 App,透過分析,發現了各個類別領域下的佼佼者,這些 App 堪稱真正的良心之作,使用它們將會給你帶來全新的手機使用體驗。
1. 分析背景
1.1. 為什麼選擇酷安
如果說 GitHub 是程式設計師的天堂,那麼 酷安 則是手機 App 愛好者們(別稱「搞機」愛好者)的天堂,相比於那些傳統的手機應用下載市場,酷安有三點特別之處:
第一、可以搜尋下載到各種 神器、佳軟,其他應用下載市場幾乎很難找得到。比如之前的文章中說過的終端桌面「Aris」、安卓最強閱讀器「靜讀天下」、RSS 閱讀器 「Feedme」 等。
第二、可以找到很多 App 的 破解版。我們提倡「為好東西付費」,但是有些 App 很蛋疼,比如「百度網盤」,在這裡面就可以找到很多 App 的破解版。
第三、可以找到 App 的 歷史版本。很多人喜歡用最新版本的 App,一有更新就馬上升級,但是現在很多 App 越來越功利、越更新越臃腫、廣告滿天飛,倒不如 迴歸本源,使用體積小巧、功能精簡、無廣告的早期版本。
作為一名 App 愛好者,我在酷安上發現了很多不錯的 App,越用越感覺自己知道的僅僅是冰山一角,便想扒一扒這個網站上到底有多少好東西,手動一個個去找肯定是不現實了,自然想到最好的方法——用爬蟲來解決,為了實現此目的,最近就學習了一下 Scrapy 爬蟲框架,爬取了該網 6000 款左右的 App,透過分析,找到了不同領域下的精品 App,下面我們就來一探究竟。
1.2. 分析內容
總體分析 6000 款 App 的評分、下載量、體積等指標。
根據日常使用功能場景,將 App 劃分為:系統工具、資訊閱讀、社交娛樂等 10 大類別,篩選出每個類別下的精品 App。
1.3. 分析工具
Python
Scrapy
MongoDB
Pyecharts
Matplotlib
2. 資料抓取
由於酷安手機端 App 設定了反扒措施,使用 Charles 嘗試後發現無法抓包, 暫退而求其次,使用 Scrapy 抓取網頁端的 App 資訊。抓取時期截止到 2018 年 11 月 23日,共計 6086 款 App,共抓取 了 8 個欄位資訊:App 名稱、下載量、評分、評分人數、評論數、關注人數、體積、App 分類標籤。
2.1. 目標網站分析
這是我們要抓取的 目標網頁,點選翻頁可以發現兩點有用的資訊:
每頁顯示了 10 條 App 資訊,一共有610頁,也就是 6100 個左右的 App 。
網頁請求是 GET 形式,URL 只有一個頁數遞增引數,構造翻頁非常簡單。
接下來,我們來看看選擇抓取哪些資訊,可以看到,主頁面內顯示了 App 名稱、下載量、評分等資訊,我們再點選 App 圖示進入詳情頁,可以看到提供了更齊全的資訊,包括:分類標籤、評分人數、關注人數等。由於,我們後續需要對 App 進行分類篩選,故分類標籤很有用,所以這裡我們選擇進入每個 App 主頁抓取所需資訊指標。
透過上述分析,我們就可以確定抓取流程了,首先遍歷主頁面 ,抓取 10 個 App 的詳情頁 URL,然後詳情頁再抓取每個 App 的指標,如此遍歷下來,我們需要抓取 6000 個左右網頁內容,抓取工作量不算小,所以,我們接下來嘗試使用 Scrapy 框架進行抓取。
2.2. Scrapy 框架介紹
介紹 Scrapy 框架之前,我們先回憶一下 Pyspider 框架,我們之前使用它爬取了 虎嗅網 5 萬篇文章 ,它是由國內大神編寫的一個爬蟲利器, Github Star 超過 10K,但是它的整體功能還是相對單薄一些,還有比它更強大的框架麼?有的,就是這裡要說的 Scrapy 框架,Github Star 超過 30K,是 Python 爬蟲界使用最廣泛的爬蟲框架,玩爬蟲這個框架必須得會。
網上關於 Scrapy 的官方文件和教程很多,這裡羅列幾個。
Scrapy 中文文件
崔慶才的 Scrapy 專欄
Scrapy 爬拉勾
Scrapy 爬豆瓣電影
Scrapy 框架相對於 Pyspider 相對要複雜一些,有不同的處理模組,專案檔案也由好幾個程式組成,不同的爬蟲模組需要放在不同的程式中去,所以剛開始入門會覺得程式七零八散,容易把人搞暈,建議採取以下思路快速入門 Scrapy:
首先,快速過一下上面的參考教程,瞭解 Scrapy 的爬蟲邏輯和各程式的用途與配合。
接著,看上面兩個實操案例,熟悉在 Scrapy 中怎麼寫爬蟲。
最後,找個自己感興趣的網站作為爬蟲專案,遇到不懂的就看教程或者 Google。
這樣的學習路徑是比較快速而有效的,比一直摳教程不動手要好很多。下面,我們就以酷安網為例,用 Scrapy 來爬取一下。
2.3. 抓取資料
首先要安裝好 Scrapy 框架,如果是 Windwos 系統,且已經安裝了 Anaconda,那麼安裝 Scrapy 框架就非常簡單,只需開啟 Anaconda Prompt 命令視窗,輸入下面一句命令即可,會自動幫我們安裝好 Scrapy 所有需要安裝和依賴的庫。
1conda pip scrapy
2.3.1. 建立專案
接著,我們需要建立一個爬蟲專案,所以我們先從根目錄切換到需要放置專案的工作路徑,比如我這裡設定的存放路徑為:E:\my_Python\training\kuan,接著繼續輸入下面一行程式碼即可建立 kuan 爬蟲專案:
1# 切換工作路徑
2e:
3cd E:\my_Python\training\kuan
4# 生成專案
5scrapy startproject kuspider
執行上面的命令後,就會生成一個名為 kuan 的 scrapy 爬蟲專案,包含以下幾個檔案:
1scrapy. cfg # Scrapy 部署時的配置檔案
2kuan # 專案的模組,需要從這裡引入
3_init__.py
4items.py # 定義爬取的資料結構
5middlewares.py # Middlewares 中介軟體
6pipelines.py # 資料管道檔案,可用於後續儲存
7settings.py # 配置檔案
8spiders # 爬取主程式資料夾
9_init_.py
下面,我們需要再 spiders 資料夾中建立一個爬取主程式:kuan.py,接著執行下面兩行命令即可:
1cd kuan # 進入剛才生成的 kuan 專案資料夾
2scrapy genspider kuan # 生成爬蟲主程式檔案 kuan.py
2.3.2. 宣告 item
專案檔案建立好以後,我們就可以開始寫爬蟲程式了。
首先,需要在 items.py 檔案中,預先定義好要爬取的欄位資訊名稱,如下所示:
1class KuanItem(scrapy.Item):
2# define the fields for your item here like:
3name = scrapy.Field()
4volume = scrapy.Field()
5download = scrapy.Field()
6follow = scrapy.Field()
7comment = scrapy.Field()
8tags = scrapy.Field()
9score = scrapy.Field()
10num_score = scrapy.Field()
這裡的欄位資訊就是我們前面在網頁中定位的 8 個欄位資訊,包括:name 表示 App 名稱、volume 表示體積、download 表示下載數量。在這裡定義好之後,我們在後續的爬取主程式中會利用到這些欄位資訊。
2.3.3. 爬取主程式
建立好 kuan 專案後,Scrapy 框架會自動生成爬取的部分程式碼,我們接下來就需要在 parse 方法中增加網頁抓取的欄位解析內容。
1class KuanspiderSpider(scrapy.Spider):
2 name = 'kuan'
3 allowed_domains = [']
4 start_urls = [']
5
6 def parse(self, response):
7 pass
開啟主頁 Dev Tools,找到每項抓取指標的節點位置,然後可以採用 CSS、Xpath、正則等方法進行提取解析,這些方法 Scrapy 都支援,可隨意選擇,這裡我們選用 CSS 語法來定位節點,不過需要注意的是,Scrapy 的 CSS 語法和之前我們利用 pyquery 使用的 CSS 語法稍有不同,舉幾個例子,對比說明一下。
首先,我們定位到第一個 APP 的主頁 URL 節點,可以看到 URL 節點位於 class 屬性為 app_left_list
的 div 節點下的 a 節點中,其 href 屬性就是我們需要的 URL 資訊,這裡是相對地址,拼接後就是完整的 URL。
接著我們進入酷安詳情頁,選擇 App 名稱並進行定位,可以看到 App 名稱節點位於 class 屬性為 .detail_app_title
的 p 節點的文字中。
定位到這兩個節點之後,我們就可以使用 CSS 提取欄位資訊了,這裡對比一下常規寫法和 Scrapy 中的寫法:
1# 常規寫法
2url = item('.app_left_list>a').attr('href')
3name = item('.list_app_title').text()
4# Scrapy 寫法
5url = item.css('::attr("href")').extract_first()
6name = item.css('.detail_app_title::text').extract_first()
可以看到,要獲取 href 或者 text 屬性,需要用 :: 表示,比如獲取 text,則用 ::text。extract_first() 表示提取第一個元素,如果有多個元素,則用 extract() 。接著,我們就可以參照寫出 8 個欄位資訊的解析程式碼。
首先,我們需要在主頁提取 App 的 URL 列表,然後再進入每個 App 的詳情頁進一步提取 8 個欄位資訊。
1def parse(self, response):
2 contents = response.css('.app_left_list>a')
3 for content in contents:
4 url = content.css('::attr("href")').extract_first()
5 url = response.urljoin(url) # 拼接相對 url 為絕對 url
6 yield scrapy.Request(url,callback=self.parse_url)
這裡,利用 response.urljoin() 方法將提取出的相對 URL 拼接為完整的 URL,然後利用 scrapy.Request() 方法構造每個 App 詳情頁的請求,這裡我們傳遞兩個引數:url 和 callback,url 為詳情頁 URL,callback 是回撥函式,它將主頁 URL 請求返回的響應 response 傳給專門用來解析欄位內容的 parse_url() 方法,如下所示:
1def parse_url(self,response):
2 item = KuanItem()
3 item['name'] = response.css('.detail_app_title::text').extract_first()
4 results = self.get_comment(response)
5 item['volume'] = results[0]
6 item['download'] = results[1]
7 item['follow'] = results[2]
8 item['comment'] = results[3]
9 item['tags'] = self.get_tags(response)
10 item['score'] = response.css('.rank_num::text').extract_first()
11 num_score = response.css('.apk_rank_p1::text').extract_first()
12 item['num_score'] = re.search('共(.*?)個評分',num_score).group(1)
13 yield item
14
15def get_comment(self,response):
16 messages = response.css('.apk_topba_message::text').extract_first()
17 result = re.findall(r'\s+(.*?)\s+/\s+(.*?)下載\s+/\s+(.*?)人關注\s+/\s+(.*?)個評論.*?',messages) # \s+ 表示匹配任意空白字元一次以上
18 if result: # 不為空
19 results = list(result[0]) # 提取出list 中第一個元素
20 return results
21
22def get_tags(self,response):
23 data = response.css('.apk_left_span2')
24 tags = [item.css('::text').extract_first() for item in data]
25 return tags
這裡,單獨定義了 get_comment() 和 get_tags() 兩個方法.
get_comment() 方法透過正則匹配提取 volume、download、follow、comment 四個欄位資訊,正則匹配結果如下:
1result = re.findall(r'\s+(.*?)\s+/\s+(.*?)下載\s+/\s+(.*?)人關注\s+/\s+(.*?)個評論.*?',messages)
2print(result) # 輸出第一頁的結果資訊
3# 結果如下:
4[('21.74M', '5218萬', '2.4萬', '5.4萬')]
5[('75.53M', '2768萬', '2.3萬', '3.0萬')]
6[('46.21M', '1686萬', '2.3萬', '3.4萬')]
7[('54.77M', '1603萬', '3.8萬', '4.9萬')]
8[('3.32M', '1530萬', '1.5萬', '3343')]
9[('75.07M', '1127萬', '1.6萬', '2.2萬')]
10[('92.70M', '1108萬', '9167', '1.3萬')]
11[('68.94M', '1072萬', '5718', '9869')]
12[('61.45M', '935萬', '1.1萬', '1.6萬')]
13[('23.96M', '925萬', '4157', '1956')]
然後利用 result[0]、result[1] 等分別提取出四項資訊,以 volume 為例,輸出第一頁的提取結果:
1item['volume'] = results[0]
2print(item['volume'])
321.74M
475.53M
546.21M
654.77M
73.32M
875.07M
992.70M
1068.94M
1161.45M
1223.96M
這樣一來,第一頁 10 款 App 的所有欄位資訊都被成功提取出來,然後返回到 yied item 生成器中,我們輸出一下它的內容:
1[
2{'name': '酷安', 'volume': '21.74M', 'download': '5218萬', 'follow': '2.4萬', 'comment': '5.4萬', 'tags': "['酷市場', '酷安', '市場', 'coolapk', '裝機必備']", 'score': '4.4', 'num_score': '1.4萬'},
3{'name': '微信', 'volume': '75.53M', 'download': '2768萬', 'follow': '2.3萬', 'comment': '3.0萬', 'tags': "['微信', 'qq', '騰訊', 'tencent', '即時聊天', '裝機必備']",'score': '2.3', 'num_score': '1.1萬'},
4...
5]
2.3.4. 分頁爬取
以上,我們爬取了第一頁內容,接下去需要遍歷爬取全部 610 頁的內容,這裡有兩種思路:
第一種是提取翻頁的節點資訊,然後構造出下一頁的請求,然後重複呼叫 parse 方法進行解析,如此迴圈往復,直到解析完最後一頁。
第二種是先直接構造出 610 頁的 URL 地址,然後批次呼叫 parse 方法進行解析。
這裡,我們分別寫出兩種方法的解析程式碼,第一種方法很簡單,直接接著 parse 方法繼續新增以下幾行程式碼即可:
1def parse(self, response):
2 contents = response.css('.app_left_list>a')
3 for content in contents:
4 ...
5
6 next_page = response.css('.pagination li:nth-child(8) a::attr(href)').extract_first()
7 url = response.urljoin(next_page)
8 yield scrapy.Request(url,callback=self.parse )
第二種方法,我們在最開頭的 parse() 方法前,定義一個 start_requests() 方法,用來批次生成 610 頁的 URL,然後透過 scrapy.Request() 方法中的 callback 引數,傳遞給下面的 parse() 方法進行解析。
1def start_requests(self):
2 pages = []
3 for page in range(1,610): # 一共有610頁
4 url = '%s'%page
5 page = scrapy.Request(url,callback=self.parse)
6 pages.append(page)
7 return pages
以上就是全部頁面的爬取思路,爬取成功後,我們需要儲存下來。這裡,我面選擇儲存到 MongoDB 中,不得不說,相比 MySQL,MongoDB 要方便省事很多。
2.3.5. 儲存結果
我們在 pipelines.py 程式中,定義資料儲存方法,MongoDB 的一些引數,比如地址和資料庫名稱,需單獨存放在 settings.py 設定檔案中去,然後在 pipelines 程式中進行呼叫即可。
1import pymongo
2class MongoPipeline(object):
3 def __init__(self,mongo_url,mongo_db):
4 self.mongo_url = mongo_url
5 self.mongo_db = mongo_db
6 @classmethod
7 def from_crawler(cls,crawler):
8 return cls(
9 mongo_url = crawler.settings.get('MONGO_URL'),
10 mongo_db = crawler.settings.get('MONGO_DB')
11 )
12 def open_spider(self,spider):
13 self.client = pymongo.MongoClient(self.mongo_url)
14 self.db = self.client[self.mongo_db]
15 def process_item(self,item,spider):
16 name = item.__class__.__name__
17 self.db[name].insert(dict(item))
18 return item
19 def close_spider(self,spider):
20 self.client.close()
首先,我們定義一個 MongoPipeline()儲存類,裡面定義了幾個方法,簡單進行一下說明:
from crawler() 是一個類方法,用 @class method 標識,這個方法的作用主要是用來獲取我們在 settings.py 中設定的這幾項引數:
1MONGO_URL = 'localhost'
2MONGO_DB = 'KuAn'
3ITEM_PIPELINES = {
4 'kuan.pipelines.MongoPipeline': 300,
5}
open_spider() 方法主要進行一些初始化操作 ,在 Spider 開啟時,這個方法就會被呼叫 。
process_item() 方法是最重要的方法,實現插入資料到 MongoDB 中。
完成上述程式碼以後,輸入下面一行命令就可以開始整個爬蟲的抓取和儲存過程了,單機跑的話,6000 個網頁需要不少時間才能完成,保持耐心。
1scrapy crawl kuan
這裡,還有兩點補充:
第一,為了減輕網站壓力,我們最好在每個請求之間設定幾秒延時,可以在 KuanSpider() 方法開頭出,加入以下幾行程式碼:
1custom_settings = {
2 "DOWNLOAD_DELAY": 3, # 延遲3s,預設是0,即不延遲
3 "CONCURRENT_REQUESTS_PER_DOMAIN": 8 # 每秒預設併發8次,可適當降低
4 }
第二,為了更好監控爬蟲程式執行,有必要 設定輸出日誌檔案,可以透過 Python 自帶的 logging 包實現:
1import logging
2
3logging.basicConfig(filename='kuan.log',filemode='w',level=logging.WARNING,format='%(asctime)s %(message)s',datefmt='%Y/%m/%d %I:%M:%S %p')
4logging.warning("warn message")
5logging.error("error message")
這裡的 level 參數列示警告級別,嚴重程度從低到高分別是:DEBUG < INFO < WARNING < ERROR < CRITICAL,如果想日誌檔案不要記錄太多內容,可以設定高一點的級別,這裡設定為 WARNING,意味著只有 WARNING 級別以上的資訊才會輸出到日誌中去。
新增 datefmt 引數是為了在每條日誌前面加具體的時間,這點很有用處。
以上,我們就完成了整個資料的抓取,有了資料我們就可以著手進行分析,不過這之前還需簡單地對資料做一下清洗和處理。
3. 資料清洗處理
首先,我們從 MongoDB 中讀取資料並轉化為 DataFrame,然後檢視一下資料的基本情況。
1def parse_kuan():
2 client = pymongo.MongoClient(host='localhost', port=27017)
3 db = client['KuAn']
4 collection = db['KuAnItem']
5 # 將資料庫資料轉為DataFrame
6 data = pd.DataFrame(list(collection.find()))
7 print(data.head())
8 print(df.shape)
9 print(df.info())
10 print(df.describe())
從 data.head() 輸出的前 5 行資料中可以看到,除了 score 列是 float 格式以外,其他列都是 object 文字型別。
comment、download、follow、num_score 這 5 列資料中部分行帶有「萬」字字尾,需要將字元去掉再轉換為數值型;volume 體積列,則分別帶有「M」和「K」字尾,為了統一大小,則需將「K」除以 1024,轉換為 「M」體積。
整個資料一共有 6086 行 x 8 列,每列均沒有缺失值。
df.describe() 方法對 score 列做了基本統計,可以看到,所有 App 的平均得分是 3.9 分(5 分制),最低得分 1.6 分,最高得分 4.8 分。
下面,我們將以上幾列文字型資料轉換為數值型資料,程式碼實現如下:
1def data_processing(df):
2#處理'comment','download','follow','num_score','volume' 5列資料,將單位萬轉換為單位1,再轉換為數值型
3 str = '_ori'
4 cols = ['comment','download','follow','num_score','volume']
5 for col in cols:
6 colori = col+str
7 df[colori] = df[col] # 複製保留原始列
8 if not (col == 'volume'):
9 df[col] = clean_symbol(df,col)# 處理原始列生成新列
10 else:
11 df[col] = clean_symbol2(df,col)# 處理原始列生成新列
12
13 # 將download單獨轉換為萬單位
14 df['download'] = df['download'].apply(lambda x:x/10000)
15 # 批次轉為數值型
16 df = df.apply(pd.to_numeric,errors='ignore')
17
18def clean_symbol(df,col):
19 # 將字元“萬”替換為空
20 con = df[col].str.contains('萬$')
21 df.loc[con,col] = pd.to_numeric(df.loc[con,col].str.replace('萬','')) * 10000
22 df[col] = pd.to_numeric(df[col])
23 return df[col]
24
25def clean_symbol2(df,col):
26 # 字元M替換為空
27 df[col] = df[col].str.replace('M$','')
28 # 體積為K的除以 1024 轉換為M
29 con = df[col].str.contains('K$')
30 df.loc[con,col] = pd.to_numeric(df.loc[con,col].str.replace('K$',''))/1024
31 df[col] = pd.to_numeric(df[col])
32 return df[col]
以上,就完成了幾列文字型資料的轉換,我們再來檢視一下基本情況:
download 列為 App 下載數量,下載量最多的 App 有 5190 萬次,最少的為 0 (很少很少),平均下載次數為 14 萬次;從中可以看出以下幾點資訊:
volume 列為 App 體積,體積最大的 App 達到近 300M,體積最小的幾乎為 0,平均體積在 18M 左右。
comment 列為 App 評分,評分數最多的達到了 5 萬多條,平均有 200 多條。
以上,就完成了基本的資料清洗處理過程,下面將對資料進行探索性分析。
4. 資料分析
我們主要從總體和分類兩個維度對 App 下載量、評分、體積等指標進行分析。
4.1. 總體情況
4.1.1. 下載量排名
首先來看一下 App 的下載量情況,很多時候我們下載一個 App ,下載量是一個非常重要的參考指標,由於絕大多數 App 的下載量都相對較少,直方圖無法看出趨勢,所以我們擇將資料進行分段,離散化為柱狀圖,繪圖工具採用的是 Pyecharts。
可以看到多達 5517 款(佔總數 84%)App 的下載量不到 10 萬, 而下載量超過 500 萬的僅有 20 款,開發一個要想盈利的 App ,使用者下載量尤為重要,從這一點來看,大部分 App 的處境都比較尷尬,至少是在酷安平臺上。
程式碼實現如下:
1from pyecharts import Bar
2# 下載量分佈
3bins = [0,10,100,500,10000]
4group_names = ['<=10萬','10-100萬','100-500萬','>500萬']
5cats = pd.cut(df['download'],bins,labels=group_names) # 用 pd.cut() 方法進行分段
6cats = pd.value_counts(cats)
7bar = Bar('App 下載數量區間分佈','絕大部分 App 下載量低於 10 萬')
8# bar.use_theme('macarons')
9bar.add(
10 'App 數量 (個)',
11 list(cats.index),
12 list(cats.values),
13 is_label_show = True,
14 is_splitline_show = False,
15)
16bar.render(path='download_interval.png',pixel_ration=1)
接下來,我們看看 下載量最多的 20 款 App 是哪些:
可以看到,這裡「酷安」App 以 5000 萬+ 次的下載量遙遙領先,是第二名微信 2700 萬下載量的近兩倍,這麼巨大的優勢也很容易理解,畢竟是自家的 App,如果你手機上沒有「酷安」,說明你還不算是一個真正的「搞機愛好者」,從圖中我們還可以看出以下幾點資訊:
TOP 20 款 App 中,很多都是裝機必備,算是比較大眾型的 App。
右側 App 評分圖中可以看到僅有 5 款 App 評分超過了 4 分(5 分制),絕大多數的評分都不到 3 分,甚至到不到 2 分,到底是因為這些 App 開發者做不出好 App 還是根本不想做出來?
相較於其他 App,RE 管理器、綠色守護 這幾款非常突出,其中 RE 管理器在如此高的下載量下,仍然能夠得到 4.8 分(最高分)並且體積只有幾 M,實屬難得,什麼是「良心 App」,這類就是。
作為對比,我們再來看看下載量最少的 20 款 App。
可以看到,與上面的那些下載量多的 App 相比,這些就相形見絀了,下載量最少的 「廣州限行通」更是隻有 63 次下載。
這也不奇怪,可能是 App 沒有宣傳、也可能是剛開發出來,這麼少的下載量評分還不錯,也還能繼續更新,為這些開發者點贊。
其實,這類 App 不算囧,真正囧的應該是那些 下載量很多、評分卻低到不能再低 的 App,給人的感覺是:「我就這麼爛愛咋咋地,有本事別用」。
4.1.2. 評分排名
接下來,我們看看 App 的總體得分情況。這裡,將得分分為了以下 4 個區間段,並且為不同分數定義了相應的等級。
可以發現這麼幾點有意思的現象:
3 分以下的軟體非常少,只佔不到 10%,而之前下載量最多的 20 款 APP 中,微信、QQ、淘寶、支付寶等大多數軟體的得分都不到 3 分,這就有點尷尬了。
中品也就是中等得分的 App 數量最多。
4 分以上的 高分 APP 數量佔了近一半(46%),可能是這些 App 的確還不錯,也可能是由於評分數量過少,為了優中選優,後續有必要設定一定篩選門檻。
接下來,我們看看評分最高的 20 款 App 有哪些,很多時候我們下載 App 都是跟著「哪個評分高,下載哪個」這種感覺走。
可以看到,評分最高的 20 個 App,它們都得到了 4.8 分 ,包括:RE 管理器(再次出現)、Pure 輕雨圖示包等,還有一些不太常見,可能這些都是不錯的 App,不過我們還需要結合看一下下載量,它們的下載量都在 1 萬以上,有了一定的下載量,評分才算比較可靠,我們就能放心的下載下來體驗一下了。
經過上面的總體分析,我們大致發現了一些不錯的 App ,但還不夠,所以接下來將進行細分並設定一定篩選條件。
4.2. 分類情況
按照 App 功能和日常使用場景,將 App 分為以下 9 大類別,然後 從每個類別中篩選出 20 款最棒的 App。
為了儘可能找出最好的 App,這裡不妨設定 3 個條件:
評分不低於 4 分
下載量不低於 1 萬
設定一個總分評價指標(總分 = 下載量 * 評分),再標準化為滿分 1000 分,作為 App 的排名參照指標。
經過評選之後,我們依次得到了各個類別下分數最高的 20 款 App,這些 App 大部分的確是良心軟體。
4.2.1. 系統工具
系統工具包括了:輸入法、檔案管理 、系統清理、桌面、外掛、鎖屏等。
可以看到,第一名是大名鼎鼎的老牌檔案管理器「RE 管理器」,僅有 5 M 大小的它除了具備普通檔案管理器的各項功能以外,最大的特點是能夠解除安裝手機自帶的 App,不過需要 Root。
「ES 檔案瀏覽器」的檔案分析器功能非常強大,能夠有效清理臃腫的手機空間。
「一個木函」這款 App 就比較牛逼了,正如它的軟體介紹「擁有很多,不如有我」所說,開啟它你能發現它提供了好幾十項實用功能,比如:翻譯、以圖搜圖、快遞查詢、製作表情包等等。
再往下的「Super SU」、「儲存空間清理」、「鑭」、「MT 管理器」、「My Android Tools」都力薦,總之,這份榜單上的 App 可以說都值得進入你的手機 App 使用名單。
4.2.2. 社交聊天
社交聊天類中, 「Share 微部落格戶端」位居第一,作為一款第三方客戶端 App,它自然有比官方版本好的地方,比如相比正版 70M 的體積,它只有其十分之一大小,也幾乎沒有廣告,還有額外強大的諸多功能,如果你愛刷微博,那麼不妨嘗試下這款「Share」。
「即刻」這款 App 也相當不錯,再往下還能看到前陣子很火的「子彈簡訊」,宣稱將要取代微信,看來短期內應該是做不到了。
你可能會發現,這份社交榜單上沒有出現「知乎」、「豆瓣」、「簡書」這類常見的 App,是因為它們的評分都比較低,分別只有 2.9分、3.5分和 2.9 分,自然進入不了這份名單,如果你一定想用它們,推薦去使用它們的第三方客戶端或者歷史版本。
4.2.3. 資訊閱讀
可以看到,在資訊閱讀類中,「靜讀天下」牢牢佔據了第一名,我之前專門寫過一篇文章介紹它:安卓最強閱讀器。
同類別中的「多看閱讀」、「追書神器」、「微信讀書」也都進入了榜單。
另外,如果你經常為不知道去哪裡下載電子書而頭疼,那不妨試一下「搜書大師」、「老子搜書」。
4.2.4. 影音娛樂
接下來是影音娛樂版塊,網易家的「網易雲音樂」毫無壓力地佔據頭名,難得的大廠精品。
如果你愛玩遊戲,那麼 「Adobe AIR」應該嘗試一下。
如果你很文藝,那麼應該會喜歡「VUE」這款短影片拍攝 App,創作好以後發到朋友圈絕對能裝逼。
最後一位的「海貝音樂」很贊,最近發現它有一個強大的功能是結合百度網盤使用,它能夠自動識別音訊檔案然後播放。
4.2.5. 通訊網路
下面到了通訊網路類別,這個類別主要包括:瀏覽器、通訊錄、通知、郵箱等小類。
瀏覽器,我們每個人手機上都有,用的也五花八門,有些人就用手機自帶的瀏覽器,有些人用 Chrome、火狐這類大牌瀏覽器。
不過你會發現榜單上的前三位你可能聽都沒聽過,但是它們真的很牛逼,用「極簡高效、清爽極速」來形容再適合不過,其中 「Via 」和 「X 瀏覽器」 體積不到 1M ,真正的「麻雀雖小、五臟俱全」,強烈推薦。
4.2.6. 攝影圖片
拍照修圖也是我們常用的功能。也許你有自己的圖片管理軟體,但是這裡要強烈推薦第一名「快圖瀏覽」這款 App,只有 3M 大小的它,能夠瞬間發現和載入上萬張圖片,如果你是拍照狂魔,用它開啟再多的照片也能秒開,另外還擁有隱藏私密照片、自動備份百度網盤等功能。它是我使用時間最久的 App 之一。
4.2.7. 文件寫作
我們時常需要在手機上寫作、做備忘錄,那麼自然需要好的文件寫作類 App。
「印象筆記」就不用多說了,我覺得最好用的筆記總結類 App。
如果你喜歡使用 Markdown 寫作,那麼「純純寫作」這款精巧的 App 應該會很適合你。
體積不到 3M 卻擁有云備份、生成長圖、中英文自動空格等數十項功能,即使這樣,仍然保持了蘊繁於簡的設計風格,這大概就是兩三個月之內,下載量就從兩三萬飆升了十倍的原因,而這款 App 的背後是一位 犧牲了幾年的業餘時間不斷開發和更新的大佬,值得敬佩。
4.2.8. 出行交通購物
這個類別中,排名第一的居然是 12306,一提起它,就會想起那一張張奇葩的驗證碼,不過這裡的 App 不是官網的 ,而是第三方開發的。最牛逼的功能應該就是「搶票了」,如果你還在靠發朋友圈來搶票的話,那不妨試一下它。
4.2.9. Xposed 外掛
最後一個類別是 Xposed,很多人應該不太熟悉,但是一提微信上的搶紅包、防撤回功能,應該很多人就知道了。這些牛逼又不同尋常的功能就用到了 Xposed 框架裡的各種模組功能。這個框架由國外著名的 XDA 手機論壇,你經常聽到的一些所謂由 XDA 大神破解的軟體,就是來自這個論壇。
簡單地說就是,安裝了 Xposed 這個框架之後,就可以在裡面安裝一些好玩有趣的外掛,有了這些外掛,你的手機就能實現更多更大的功能。比如:能夠去除廣告、破解 App 付費功能、殺死耗電的自啟動程式、虛擬手機定位等功能。
不過使用這個框架和這些外掛需要刷機、ROOT,門檻有點高。
5. 小結
本文使用 Scrapy 框架爬取分析了酷安網的 6000 款 App,初學 Scrapy 可能會覺得程式寫起來比較散亂,所以可以嘗試先使用普通的函式方法,把程式完整地寫在一起,再分塊拆分到 Scrapy 專案中,這樣也有助於從單一程式到框架寫法的思維轉變,之後會寫單獨寫一篇文章。
由於網頁版的 App 數量比 App 中的少,所以還有很多好用的 App 沒有包括進來,比如 Chrome 、MX player、Snapseed 等,建議使用酷安 App,那裡有更多好玩的東西。
以上就是整篇文章的爬取與分析過程,文中涉及了很多精品佳軟,如有興趣可以去嘗試下載體驗一下,為了更方便你,我這裡也收集好了 24 款精品 App。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900353/viewspace-2285636/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好用的Python編輯器有哪些?Python
- 有哪些特別好用的 app 測試工具?APP
- Python有哪些好用的網站開發框架?Python網站框架
- Python有哪些好用且實用的Web框架?PythonWeb框架
- Python - 解包的各種騷操作Python
- JS中Function.apply() 的騷操作JSFunctionAPP
- [Erlang03]Erlang有哪些好用的靜態分析工具?
- 團隊協作遠端辦公,有哪些好用的app?APP
- 【入門必看】Python有有哪些好用的網站開發框架?Python網站框架
- python瀏覽器操作有哪些Python瀏覽器
- python檔案的常見的操作有哪些?Python
- Python裡的17個“騷操作”好玩有趣Python
- Python 資料庫騷操作 — RedisPython資料庫Redis
- Python資料庫MongoDB騷操作Python資料庫MongoDB
- Python 資料庫騷操作 -- RedisPython資料庫Redis
- Python 資料庫騷操作 -- MongoDBPython資料庫MongoDB
- 好用的Python編輯器有哪些?五大工具!Python
- 有哪些好用的工作彙報工具
- 轉換軟體有哪些好用的?
- Python新手入門最容易犯的錯誤有哪些?Python
- Flutter 之 AppBar 這樣的騷操作你知道嗎?FlutterAPP
- Python中的三個”黑魔法“與”騷操作“Python
- Python 4 種不同的存取檔案騷操作Python
- 這些Python騷操作,你知道嗎?Python
- &引用上的騷操作
- Zoho CRM系統有哪些好用的功能
- CRM系統好用的標準有哪些?
- 好用的CRM軟體有哪些特點?
- Git騷操作Git
- JavaScript 騷操作JavaScript
- mysql騷操作MySql
- 美團面試題:Hashmap的結構,1.7和1.8有哪些區別(史上最深入的分析)面試題HashMap
- Python中常用的資料分析工具(模組)有哪些?Python
- Python騷操作:動態定義函式Python函式
- Python玩轉PDF各種騷操作大全!Python
- iRingg:史上最簡單、好用的 macOS 鈴聲製作軟體Mac
- 有哪些免費好用的設計網站網站
- 有哪些好用的供應商管理系統