成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

大數(shù)據(jù) 數(shù)據(jù)分析 移動(dòng)應(yīng)用
如今移動(dòng)互聯(lián)網(wǎng)越來(lái)越發(fā)達(dá),各式各樣的 App 層出不窮,也就產(chǎn)生了優(yōu)劣之分,相比于普通 App,我們肯定愿意去使用那些良心佳軟,但去發(fā)現(xiàn)這些 App 并不太容易,本文使用 Scrapy 框架爬取了著名應(yīng)用下載市場(chǎng)「酷安網(wǎng)」上的 6000 余款 App,通過(guò)分析,發(fā)現(xiàn)了各個(gè)類別領(lǐng)域下的佼佼者,這些 App 堪稱真正的良心之作。

[[251580]]

摘要: 如今移動(dòng)互聯(lián)網(wǎng)越來(lái)越發(fā)達(dá),各式各樣的 App 層出不窮,也就產(chǎn)生了優(yōu)劣之分,相比于普通 App,我們肯定愿意去使用那些良心佳軟,但去發(fā)現(xiàn)這些 App 并不太容易,本文使用 Scrapy 框架爬取了著名應(yīng)用下載市場(chǎng)「酷安網(wǎng)」上的 6000 余款 App,通過(guò)分析,發(fā)現(xiàn)了各個(gè)類別領(lǐng)域下的佼佼者,這些 App 堪稱真正的良心之作,使用它們將會(huì)給你帶來(lái)全新的手機(jī)使用體驗(yàn)。

1. 分析背景

1.1. 為什么選擇酷安

如果說(shuō) GitHub 是程序員的天堂,那么 酷安 則是手機(jī) App 愛(ài)好者們(別稱「搞機(jī)」愛(ài)好者)的天堂,相比于那些傳統(tǒng)的手機(jī)應(yīng)用下載市場(chǎng),酷安有三點(diǎn)特別之處:

  • 第一、可以搜索下載到各種 神器、佳軟,其他應(yīng)用下載市場(chǎng)幾乎很難找得到。比如之前的文章中說(shuō)過(guò)的終端桌面「Aris」、安卓最強(qiáng)閱讀器「靜讀天下」、RSS 閱讀器 「Feedme」 等。
  • 第二、可以找到很多 App 的 破解版。我們提倡「為好東西付費(fèi)」,但是有些 App 很蛋疼,比如「百度網(wǎng)盤(pán)」,在這里面就可以找到很多 App 的破解版。
  • 第三、可以找到 App 的 歷史版本。很多人喜歡用最新版本的 App,一有更新就馬上升級(jí),但是現(xiàn)在很多 App 越來(lái)越功利、越更新越臃腫、廣告滿天飛,倒不如 回歸本源,使用體積小巧、功能精簡(jiǎn)、無(wú)廣告的早期版本。

作為一名 App 愛(ài)好者,我在酷安上發(fā)現(xiàn)了很多不錯(cuò)的 App,越用越感覺(jué)自己知道的僅僅是冰山一角,便想扒一扒這個(gè)網(wǎng)站上到底有多少好東西,手動(dòng)一個(gè)個(gè)去找肯定是不現(xiàn)實(shí)了,自然想到最好的方法——用爬蟲(chóng)來(lái)解決,為了實(shí)現(xiàn)此目的,最近就學(xué)習(xí)了一下 Scrapy 爬蟲(chóng)框架,爬取了該網(wǎng) 6000 款左右的 App,通過(guò)分析,找到了不同領(lǐng)域下的精品 App,下面我們就來(lái)一探究竟。

1.2. 分析內(nèi)容

總體分析 6000 款 App 的評(píng)分、下載量、體積等指標(biāo)。

根據(jù)日常使用功能場(chǎng)景,將 App 劃分為:系統(tǒng)工具、資訊閱讀、社交娛樂(lè)等 10 大類別,篩選出每個(gè)類別下的精品 App。

1.3. 分析工具

  • Python
  • Scrapy
  • MongoDB
  • Pyecharts
  • Matplotlib

2. 數(shù)據(jù)抓取

由于酷安手機(jī)端 App 設(shè)置了反扒措施,使用 Charles 嘗試后發(fā)現(xiàn)無(wú)法抓包, 暫退而求其次,使用 Scrapy 抓取網(wǎng)頁(yè)端的 App 信息。抓取時(shí)期截止到 2018 年 11 月 23日,共計(jì) 6086 款 App,共抓取 了 8 個(gè)字段信息:App 名稱、下載量、評(píng)分、評(píng)分人數(shù)、評(píng)論數(shù)、關(guān)注人數(shù)、體積、App 分類標(biāo)簽。

2.1. 目標(biāo)網(wǎng)站分析

這是我們要抓取的 目標(biāo)網(wǎng)頁(yè),點(diǎn)擊翻頁(yè)可以發(fā)現(xiàn)兩點(diǎn)有用的信息:

  • 每頁(yè)顯示了 10 條 App 信息,一共有610頁(yè),也就是 6100 個(gè)左右的 App 。
  • 網(wǎng)頁(yè)請(qǐng)求是 GET 形式,URL 只有一個(gè)頁(yè)數(shù)遞增參數(shù),構(gòu)造翻頁(yè)非常簡(jiǎn)單。

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

接下來(lái),我們來(lái)看看選擇抓取哪些信息,可以看到,主頁(yè)面內(nèi)顯示了 App 名稱、下載量、評(píng)分等信息,我們?cè)冱c(diǎn)擊 App 圖標(biāo)進(jìn)入詳情頁(yè),可以看到提供了更齊全的信息,包括:分類標(biāo)簽、評(píng)分人數(shù)、關(guān)注人數(shù)等。由于,我們后續(xù)需要對(duì) App 進(jìn)行分類篩選,故分類標(biāo)簽很有用,所以這里我們選擇進(jìn)入每個(gè) App 主頁(yè)抓取所需信息指標(biāo)。

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

通過(guò)上述分析,我們就可以確定抓取流程了,首先遍歷主頁(yè)面 ,抓取 10 個(gè) App 的詳情頁(yè) URL,然后詳情頁(yè)再抓取每個(gè) App 的指標(biāo),如此遍歷下來(lái),我們需要抓取 6000 個(gè)左右網(wǎng)頁(yè)內(nèi)容,抓取工作量不算小,所以,我們接下來(lái)嘗試使用 Scrapy 框架進(jìn)行抓取。

2.2. Scrapy 框架介紹

介紹 Scrapy 框架之前,我們先回憶一下 Pyspider 框架,我們之前使用它爬取了 虎嗅網(wǎng) 5 萬(wàn)篇文章 ,它是由國(guó)內(nèi)大神編寫(xiě)的一個(gè)爬蟲(chóng)利器, Github Star 超過(guò) 10K,但是它的整體功能還是相對(duì)單薄一些,還有比它更強(qiáng)大的框架么?有的,就是這里要說(shuō)的 Scrapy 框架,Github Star 超過(guò) 30K,是 Python 爬蟲(chóng)界使用最廣泛的爬蟲(chóng)框架,玩爬蟲(chóng)這個(gè)框架必須得會(huì)。

網(wǎng)上關(guān)于 Scrapy 的官方文檔和教程很多,這里羅列幾個(gè)。

  • Scrapy 中文文檔
  • 崔慶才的 Scrapy 專欄
  • Scrapy 爬拉勾
  • Scrapy 爬豆瓣電影

Scrapy 框架相對(duì)于 Pyspider 相對(duì)要復(fù)雜一些,有不同的處理模塊,項(xiàng)目文件也由好幾個(gè)程序組成,不同的爬蟲(chóng)模塊需要放在不同的程序中去,所以剛開(kāi)始入門(mén)會(huì)覺(jué)得程序七零八散,容易把人搞暈,建議采取以下思路快速入門(mén) Scrapy:

  • 首先,快速過(guò)一下上面的參考教程,了解 Scrapy 的爬蟲(chóng)邏輯和各程序的用途與配合。
  • 接著,看上面兩個(gè)實(shí)操案例,熟悉在 Scrapy 中怎么寫(xiě)爬蟲(chóng)。
  • 最后,找個(gè)自己感興趣的網(wǎng)站作為爬蟲(chóng)項(xiàng)目,遇到不懂的就看教程或者 Google。

這樣的學(xué)習(xí)路徑是比較快速而有效的,比一直摳教程不動(dòng)手要好很多。下面,我們就以酷安網(wǎng)為例,用 Scrapy 來(lái)爬取一下。

2.3. 抓取數(shù)據(jù)

首先要安裝好 Scrapy 框架,如果是 Windwos 系統(tǒng),且已經(jīng)安裝了 Anaconda,那么安裝 Scrapy 框架就非常簡(jiǎn)單,只需打開(kāi) Anaconda Prompt 命令窗口,輸入下面一句命令即可,會(huì)自動(dòng)幫我們安裝好 Scrapy 所有需要安裝和依賴的庫(kù)。

  1. conda pip scrapy 

2.3.1. 創(chuàng)建項(xiàng)目

接著,我們需要?jiǎng)?chuàng)建一個(gè)爬蟲(chóng)項(xiàng)目,所以我們先從根目錄切換到需要放置項(xiàng)目的工作路徑,比如我這里設(shè)置的存放路徑為:E:\my_Python\training\kuan,接著繼續(xù)輸入下面一行代碼即可創(chuàng)建 kuan 爬蟲(chóng)項(xiàng)目:

  1. # 切換工作路徑 
  2. e: 
  3. cd E:\my_Python\training\kuan 
  4. # 生成項(xiàng)目 
  5. scrapy startproject kuspider 

執(zhí)行上面的命令后,就會(huì)生成一個(gè)名為 kuan 的 scrapy 爬蟲(chóng)項(xiàng)目,包含以下幾個(gè)文件:

  1. scrapy. cfg # Scrapy 部署時(shí)的配置文件 
  2. kuan # 項(xiàng)目的模塊,需要從這里引入 
  3. _init__.py 
  4. items.py # 定義爬取的數(shù)據(jù)結(jié)構(gòu) 
  5. middlewares.py # Middlewares 中間件 
  6. pipelines.py # 數(shù)據(jù)管道文件,可用于后續(xù)存儲(chǔ) 
  7. settings.py # 配置文件 
  8. spiders # 爬取主程序文件夾 
  9. _init_.py 

下面,我們需要再 spiders 文件夾中創(chuàng)建一個(gè)爬取主程序:kuan.py,接著運(yùn)行下面兩行命令即可:

  1. cd kuan # 進(jìn)入剛才生成的 kuan 項(xiàng)目文件夾 
  2. scrapy genspider kuan www.coolapk.com  # 生成爬蟲(chóng)主程序文件 kuan.py 

2.3.2. 聲明 item

項(xiàng)目文件創(chuàng)建好以后,我們就可以開(kāi)始寫(xiě)爬蟲(chóng)程序了。

首先,需要在 items.py 文件中,預(yù)先定義好要爬取的字段信息名稱,如下所示:

  1. class KuanItem(scrapy.Item): 
  2. # define the fields for your item here like
  3. name = scrapy.Field() 
  4. volume = scrapy.Field() 
  5. download = scrapy.Field() 
  6. follow = scrapy.Field() 
  7. comment = scrapy.Field() 
  8. tags = scrapy.Field() 
  9. score = scrapy.Field() 
  10. num_score = scrapy.Field() 

這里的字段信息就是我們前面在網(wǎng)頁(yè)中定位的 8 個(gè)字段信息,包括:name 表示 App 名稱、volume 表示體積、download 表示下載數(shù)量。在這里定義好之后,我們?cè)诤罄m(xù)的爬取主程序中會(huì)利用到這些字段信息。

2.3.3. 爬取主程序

創(chuàng)建好 kuan 項(xiàng)目后,Scrapy 框架會(huì)自動(dòng)生成爬取的部分代碼,我們接下來(lái)就需要在 parse 方法中增加網(wǎng)頁(yè)抓取的字段解析內(nèi)容。

  1. class KuanspiderSpider(scrapy.Spider): 
  2.    name = 'kuan' 
  3.    allowed_domains = ['www.coolapk.com'
  4.    start_urls = ['http://www.coolapk.com/'
  5.  
  6.    def parse(self, response): 
  7.        pass 

打開(kāi)主頁(yè) Dev Tools,找到每項(xiàng)抓取指標(biāo)的節(jié)點(diǎn)位置,然后可以采用 CSS、Xpath、正則等方法進(jìn)行提取解析,這些方法 Scrapy 都支持,可隨意選擇,這里我們選用 CSS 語(yǔ)法來(lái)定位節(jié)點(diǎn),不過(guò)需要注意的是,Scrapy 的 CSS 語(yǔ)法和之前我們利用 pyquery 使用的 CSS 語(yǔ)法稍有不同,舉幾個(gè)例子,對(duì)比說(shuō)明一下。

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

首先,我們定位到第一個(gè) APP 的主頁(yè) URL 節(jié)點(diǎn),可以看到 URL 節(jié)點(diǎn)位于 class 屬性為 app_left_list 的 div 節(jié)點(diǎn)下的 a 節(jié)點(diǎn)中,其 href 屬性就是我們需要的 URL 信息,這里是相對(duì)地址,拼接后就是完整的 URL。

接著我們進(jìn)入酷安詳情頁(yè),選擇 App 名稱并進(jìn)行定位,可以看到 App 名稱節(jié)點(diǎn)位于 class 屬性為 .detail_app_title 的 p 節(jié)點(diǎn)的文本中。

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

定位到這兩個(gè)節(jié)點(diǎn)之后,我們就可以使用 CSS 提取字段信息了,這里對(duì)比一下常規(guī)寫(xiě)法和 Scrapy 中的寫(xiě)法:

  1. # 常規(guī)寫(xiě)法 
  2. url = item('.app_left_list>a').attr('href'
  3. name = item('.list_app_title').text() 
  4. # Scrapy 寫(xiě)法 
  5. url = item.css('::attr("href")').extract_first() 
  6. name = item.css('.detail_app_title::text').extract_first() 

可以看到,要獲取 href 或者 text 屬性,需要用 :: 表示,比如獲取 text,則用 ::text。extract_first() 表示提取第一個(gè)元素,如果有多個(gè)元素,則用 extract() 。接著,我們就可以參照寫(xiě)出 8 個(gè)字段信息的解析代碼。

首先,我們需要在主頁(yè)提取 App 的 URL 列表,然后再進(jìn)入每個(gè) App 的詳情頁(yè)進(jìn)一步提取 8 個(gè)字段信息。

  1. def 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)  # 拼接相對(duì) url 為絕對(duì) url 
  6.        yield scrapy.Request(url,callback=self.parse_url) 

這里,利用 response.urljoin() 方法將提取出的相對(duì) URL 拼接為完整的 URL,然后利用 scrapy.Request() 方法構(gòu)造每個(gè) App 詳情頁(yè)的請(qǐng)求,這里我們傳遞兩個(gè)參數(shù):url 和 callback,url 為詳情頁(yè) URL,callback 是回調(diào)函數(shù),它將主頁(yè) URL 請(qǐng)求返回的響應(yīng) response 傳給專門(mén)用來(lái)解析字段內(nèi)容的 parse_url() 方法,如下所示:

  1. def 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('共(.*?)個(gè)評(píng)分',num_score).group(1) 
  13.     yield item 
  14.  
  15. def get_comment(self,response): 
  16.     messages = response.css('.apk_topba_message::text').extract_first() 
  17.     result = re.findall(r'\s+(.*?)\s+/\s+(.*?)下載\s+/\s+(.*?)人關(guān)注\s+/\s+(.*?)個(gè)評(píng)論.*?',messages)  # \s+ 表示匹配任意空白字符一次以上 
  18.     if result: # 不為空 
  19. 19        results = list(result[0]) # 提取出list 中第一個(gè)元素 
  20. 20        return results 
  21. 21 
  22. 22def get_tags(self,response): 
  23. 23    data = response.css('.apk_left_span2'
  24. 24    tags = [item.css('::text').extract_first() for item in data] 
  25. 25    return tags 

這里,單獨(dú)定義了 get_comment() 和 get_tags() 兩個(gè)方法.

get_comment() 方法通過(guò)正則匹配提取 volume、download、follow、comment 四個(gè)字段信息,正則匹配結(jié)果如下:

  1. result = re.findall(r'\s+(.*?)\s+/\s+(.*?)下載\s+/\s+(.*?)人關(guān)注\s+/\s+(.*?)個(gè)評(píng)論.*?',messages) 
  2. print(result) # 輸出第一頁(yè)的結(jié)果信息 
  3. # 結(jié)果如下: 
  4. [('21.74M''5218萬(wàn)''2.4萬(wàn)''5.4萬(wàn)')] 
  5. [('75.53M''2768萬(wàn)''2.3萬(wàn)''3.0萬(wàn)')] 
  6. [('46.21M''1686萬(wàn)''2.3萬(wàn)''3.4萬(wàn)')] 
  7. [('54.77M''1603萬(wàn)''3.8萬(wàn)''4.9萬(wàn)')] 
  8. [('3.32M''1530萬(wàn)''1.5萬(wàn)''3343')] 
  9. [('75.07M''1127萬(wàn)''1.6萬(wàn)''2.2萬(wàn)')] 
  10. [('92.70M''1108萬(wàn)''9167''1.3萬(wàn)')] 
  11. [('68.94M''1072萬(wàn)''5718''9869')] 
  12. [('61.45M''935萬(wàn)''1.1萬(wàn)''1.6萬(wàn)')] 
  13. [('23.96M''925萬(wàn)''4157''1956')] 

然后利用 result[0]、result[1] 等分別提取出四項(xiàng)信息,以 volume 為例,輸出第一頁(yè)的提取結(jié)果:

  1. item['volume'] = results[0] 
  2. print(item['volume']) 
  3. 21.74M 
  4. 75.53M 
  5. 46.21M 
  6. 54.77M 
  7. 3.32M 
  8. 75.07M 
  9. 92.70M 
  10. 68.94M 
  11. 61.45M 
  12. 23.96M 

這樣一來(lái),第一頁(yè) 10 款 App 的所有字段信息都被成功提取出來(lái),然后返回到 yied item 生成器中,我們輸出一下它的內(nèi)容:

  1. {'name''酷安''volume''21.74M''download''5218萬(wàn)''follow''2.4萬(wàn)''comment''5.4萬(wàn)''tags'"['酷市場(chǎng)', '酷安', '市場(chǎng)', 'coolapk', '裝機(jī)必備']"'score''4.4''num_score''1.4萬(wàn)'},  
  2. {'name''微信''volume''75.53M''download''2768萬(wàn)''follow''2.3萬(wàn)''comment''3.0萬(wàn)''tags'"['微信', 'qq', '騰訊', 'tencent', '即時(shí)聊天', '裝機(jī)必備']",'score''2.3''num_score''1.1萬(wàn)'}, 
  3. ... 

2.3.4. 分頁(yè)爬取

以上,我們爬取了第一頁(yè)內(nèi)容,接下去需要遍歷爬取全部 610 頁(yè)的內(nèi)容,這里有兩種思路:

  • 第一種是提取翻頁(yè)的節(jié)點(diǎn)信息,然后構(gòu)造出下一頁(yè)的請(qǐng)求,然后重復(fù)調(diào)用 parse 方法進(jìn)行解析,如此循環(huán)往復(fù),直到解析完最后一頁(yè)。
  • 第二種是先直接構(gòu)造出 610 頁(yè)的 URL 地址,然后批量調(diào)用 parse 方法進(jìn)行解析。

這里,我們分別寫(xiě)出兩種方法的解析代碼,第一種方法很簡(jiǎn)單,直接接著 parse 方法繼續(xù)添加以下幾行代碼即可:

  1. def 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 ) 

第二種方法,我們?cè)谧铋_(kāi)頭的 parse() 方法前,定義一個(gè) start_requests() 方法,用來(lái)批量生成 610 頁(yè)的 URL,然后通過(guò) scrapy.Request() 方法中的 callback 參數(shù),傳遞給下面的 parse() 方法進(jìn)行解析。

  1. def start_requests(self): 
  2.        pages = [] 
  3.        for page in range(1,610):  # 一共有610頁(yè) 
  4.            url = 'https://www.coolapk.com/apk/?page=%s'%page 
  5.           page =  scrapy.Request(url,callback=self.parse) 
  6.            pages.append(page) 
  7.        return pages

以上就是全部頁(yè)面的爬取思路,爬取成功后,我們需要存儲(chǔ)下來(lái)。這里,我面選擇存儲(chǔ)到 MongoDB 中,不得不說(shuō),相比 MySQL,MongoDB 要方便省事很多。

2.3.5. 存儲(chǔ)結(jié)果

我們?cè)?pipelines.py 程序中,定義數(shù)據(jù)存儲(chǔ)方法,MongoDB 的一些參數(shù),比如地址和數(shù)據(jù)庫(kù)名稱,需單獨(dú)存放在 settings.py 設(shè)置文件中去,然后在 pipelines 程序中進(jìn)行調(diào)用即可。

  1. import pymongo 
  2. class 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() 

首先,我們定義一個(gè) MongoPipeline()存儲(chǔ)類,里面定義了幾個(gè)方法,簡(jiǎn)單進(jìn)行一下說(shuō)明:

  • from crawler() 是一個(gè)類方法,用 @class method 標(biāo)識(shí),這個(gè)方法的作用主要是用來(lái)獲取我們?cè)?settings.py 中設(shè)置的這幾項(xiàng)參數(shù):
  • 1MONGO_URL = 'localhost'2MONGO_DB = 'KuAn'3ITEM_PIPELINES = {4 'kuan.pipelines.MongoPipeline': 300,5}
  • open_spider() 方法主要進(jìn)行一些初始化操作 ,在 Spider 開(kāi)啟時(shí),這個(gè)方法就會(huì)被調(diào)用 。
  • process_item() 方法是最重要的方法,實(shí)現(xiàn)插入數(shù)據(jù)到 MongoDB 中。

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

 

完成上述代碼以后,輸入下面一行命令就可以開(kāi)始整個(gè)爬蟲(chóng)的抓取和存儲(chǔ)過(guò)程了,單機(jī)跑的話,6000 個(gè)網(wǎng)頁(yè)需要不少時(shí)間才能完成,保持耐心。

  1. scrapy crawl kuan 

這里,還有兩點(diǎn)補(bǔ)充:

第一,為了減輕網(wǎng)站壓力,我們最好在每個(gè)請(qǐng)求之間設(shè)置幾秒延時(shí),可以在 KuanSpider() 方法開(kāi)頭出,加入以下幾行代碼:

  1. custom_settings = { 
  2.        "DOWNLOAD_DELAY": 3, # 延遲3s,默認(rèn)是0,即不延遲 
  3.        "CONCURRENT_REQUESTS_PER_DOMAIN": 8 # 每秒默認(rèn)并發(fā)8次,可適當(dāng)降低 
  4.    } 

第二,為了更好監(jiān)控爬蟲(chóng)程序運(yùn)行,有必要 設(shè)置輸出日志文件,可以通過(guò) Python 自帶的 logging 包實(shí)現(xiàn):

  1. import logging 
  2. logging.basicConfig(filename='kuan.log',filemode='w',level=logging.WARNING,format='%(asctime)s %(message)s',datefmt='%Y/%m/%d %I:%M:%S %p'
  3. logging.warning("warn message"
  4. logging.error("error message"

這里的 level 參數(shù)表示警告級(jí)別,嚴(yán)重程度從低到高分別是:DEBUG < INFO < WARNING < ERROR < CRITICAL,如果想日志文件不要記錄太多內(nèi)容,可以設(shè)置高一點(diǎn)的級(jí)別,這里設(shè)置為 WARNING,意味著只有 WARNING 級(jí)別以上的信息才會(huì)輸出到日志中去。

添加 datefmt 參數(shù)是為了在每條日志前面加具體的時(shí)間,這點(diǎn)很有用處。

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

以上,我們就完成了整個(gè)數(shù)據(jù)的抓取,有了數(shù)據(jù)我們就可以著手進(jìn)行分析,不過(guò)這之前還需簡(jiǎn)單地對(duì)數(shù)據(jù)做一下清洗和處理。

3. 數(shù)據(jù)清洗處理

首先,我們從 MongoDB 中讀取數(shù)據(jù)并轉(zhuǎn)化為 DataFrame,然后查看一下數(shù)據(jù)的基本情況。

  1. def parse_kuan(): 
  2.     client = pymongo.MongoClient(host='localhost', port=27017) 
  3.     db = client['KuAn'
  4.     collection = db['KuAnItem'
  5.     # 將數(shù)據(jù)庫(kù)數(shù)據(jù)轉(zhuǎn)為DataFrame 
  6.     data = pd.DataFrame(list(collection.find())) 
  7.     print(data.head()) 
  8.     print(df.shape) 
  9.    print(df.info()) 
  10.     print(df.describe()) 

 

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

從 data.head() 輸出的前 5 行數(shù)據(jù)中可以看到,除了 score 列是 float 格式以外,其他列都是 object 文本類型。

comment、download、follow、num_score 這 5 列數(shù)據(jù)中部分行帶有「萬(wàn)」字后綴,需要將字符去掉再轉(zhuǎn)換為數(shù)值型;volume 體積列,則分別帶有「M」和「K」后綴,為了統(tǒng)一大小,則需將「K」除以 1024,轉(zhuǎn)換為 「M」體積。

整個(gè)數(shù)據(jù)一共有 6086 行 x 8 列,每列均沒(méi)有缺失值。

df.describe() 方法對(duì) score 列做了基本統(tǒng)計(jì),可以看到,所有 App 的平均得分是 3.9 分(5 分制),最低得分 1.6 分,最高得分 4.8 分。

下面,我們將以上幾列文本型數(shù)據(jù)轉(zhuǎn)換為數(shù)值型數(shù)據(jù),代碼實(shí)現(xiàn)如下:

  1. def data_processing(df): 
  2. #處理'comment','download','follow','num_score','volume' 5列數(shù)據(jù),將單位萬(wàn)轉(zhuǎn)換為單位1,再轉(zhuǎn)換為數(shù)值型 
  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] # 復(fù)制保留原始列 
  8.         if not (col == 'volume'): 
  9.             df[col] = clean_symbol(df,col)# 處理原始列生成新列 
  10.         else
  11.             df[col] = clean_symbol2(df,col)# 處理原始列生成新列 
  12.  
  13.     # 將download單獨(dú)轉(zhuǎn)換為萬(wàn)單位 
  14.   df['download'] = df['download'].apply(lambda x:x/10000) 
  15.     # 批量轉(zhuǎn)為數(shù)值型 
  16.     df = df.apply(pd.to_numeric,errors='ignore'
  17.  
  18. def clean_symbol(df,col): 
  19.     # 將字符“萬(wàn)”替換為空 
  20.     con = df[col].str.contains('萬(wàn)$'
  21.     df.loc[con,col] = pd.to_numeric(df.loc[con,col].str.replace('萬(wàn)','')) * 10000 
  22.    df[col] = pd.to_numeric(df[col]) 
  23.     return df[col] 
  24.  
  25. def clean_symbol2(df,col): 
  26.     # 字符M替換為空 
  27.     df[col] = df[col].str.replace('M$',''
  28.     # 體積為K的除以 1024 轉(zhuǎn)換為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] 

以上,就完成了幾列文本型數(shù)據(jù)的轉(zhuǎn)換,我們?cè)賮?lái)查看一下基本情況:

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

download 列為 App 下載數(shù)量,下載量最多的 App 有 5190 萬(wàn)次,最少的為 0 (很少很少),平均下載次數(shù)為 14 萬(wàn)次;從中可以看出以下幾點(diǎn)信息:

  • volume 列為 App 體積,體積最大的 App 達(dá)到近 300M,體積最小的幾乎為 0,平均體積在 18M 左右。
  • comment 列為 App 評(píng)分,評(píng)分?jǐn)?shù)最多的達(dá)到了 5 萬(wàn)多條,平均有 200 多條。

以上,就完成了基本的數(shù)據(jù)清洗處理過(guò)程,下面將對(duì)數(shù)據(jù)進(jìn)行探索性分析。

4. 數(shù)據(jù)分析

我們主要從總體和分類兩個(gè)維度對(duì) App 下載量、評(píng)分、體積等指標(biāo)進(jìn)行分析。

4.1. 總體情況

4.1.1. 下載量排名

首先來(lái)看一下 App 的下載量情況,很多時(shí)候我們下載一個(gè) App ,下載量是一個(gè)非常重要的參考指標(biāo),由于絕大多數(shù) App 的下載量都相對(duì)較少,直方圖無(wú)法看出趨勢(shì),所以我們擇將數(shù)據(jù)進(jìn)行分段,離散化為柱狀圖,繪圖工具采用的是 Pyecharts。

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

可以看到多達(dá) 5517 款(占總數(shù) 84%)App 的下載量不到 10 萬(wàn), 而下載量超過(guò) 500 萬(wàn)的僅有 20 款,開(kāi)發(fā)一個(gè)要想盈利的 App ,用戶下載量尤為重要,從這一點(diǎn)來(lái)看,大部分 App 的處境都比較尷尬,至少是在酷安平臺(tái)上。

代碼實(shí)現(xiàn)如下:

  1. from pyecharts import Bar 
  2. # 下載量分布 
  3. bins = [0,10,100,500,10000] 
  4. group_names = ['<=10萬(wàn)','10-100萬(wàn)','100-500萬(wàn)','>500萬(wàn)'
  5. cats = pd.cut(df['download'],bins,labels=group_names) #  用 pd.cut() 方法進(jìn)行分段 
  6. cats = pd.value_counts(cats) 
  7. bar = Bar('App 下載數(shù)量區(qū)間分布','絕大部分 App 下載量低于 10 萬(wàn)'
  8. # bar.use_theme('macarons'
  9. bar.add
  10.     'App 數(shù)量 (個(gè))'
  11.     list(cats.index), 
  12.     list(cats.values), 
  13.    is_label_show = True
  14.     is_splitline_show = False
  15. bar.render(path='download_interval.png',pixel_ration=1) 

接下來(lái),我們看看 下載量最多的 20 款 App 是哪些:

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

可以看到,這里「酷安」App 以 5000 萬(wàn)+ 次的下載量遙遙領(lǐng)先,是第二名微信 2700 萬(wàn)下載量的近兩倍,這么巨大的優(yōu)勢(shì)也很容易理解,畢竟是自家的 App,如果你手機(jī)上沒(méi)有「酷安」,說(shuō)明你還不算是一個(gè)真正的「搞機(jī)愛(ài)好者」,從圖中我們還可以看出以下幾點(diǎn)信息:

  • TOP 20 款 App 中,很多都是裝機(jī)必備,算是比較大眾型的 App。
  • 右側(cè) App 評(píng)分圖中可以看到僅有 5 款 App 評(píng)分超過(guò)了 4 分(5 分制),絕大多數(shù)的評(píng)分都不到 3 分,甚至到不到 2 分,到底是因?yàn)檫@些 App 開(kāi)發(fā)者做不出好 App 還是根本不想做出來(lái)?
  • 相較于其他 App,RE 管理器、綠色守護(hù) 這幾款非常突出,其中 RE 管理器在如此高的下載量下,仍然能夠得到 4.8 分(最高分)并且體積只有幾 M,實(shí)屬難得,什么是「良心 App」,這類就是。

作為對(duì)比,我們?cè)賮?lái)看看下載量最少的 20 款 App。

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

可以看到,與上面的那些下載量多的 App 相比,這些就相形見(jiàn)絀了,下載量最少的 「廣州限行通」更是只有 63 次下載。

這也不奇怪,可能是 App 沒(méi)有宣傳、也可能是剛開(kāi)發(fā)出來(lái),這么少的下載量評(píng)分還不錯(cuò),也還能繼續(xù)更新,為這些開(kāi)發(fā)者點(diǎn)贊。

其實(shí),這類 App 不算囧,真正囧的應(yīng)該是那些 下載量很多、評(píng)分卻低到不能再低 的 App,給人的感覺(jué)是:「我就這么爛愛(ài)咋咋地,有本事別用」。

4.1.2. 評(píng)分排名

接下來(lái),我們看看 App 的總體得分情況。這里,將得分分為了以下 4 個(gè)區(qū)間段,并且為不同分?jǐn)?shù)定義了相應(yīng)的等級(jí)。

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

可以發(fā)現(xiàn)這么幾點(diǎn)有意思的現(xiàn)象:

  • 3 分以下的軟件非常少,只占不到 10%,而之前下載量最多的 20 款 APP 中,微信、QQ、淘寶、支付寶等大多數(shù)軟件的得分都不到 3 分,這就有點(diǎn)尷尬了。
  • 中品也就是中等得分的 App 數(shù)量最多。
  • 4 分以上的 高分 APP 數(shù)量占了近一半(46%),可能是這些 App 的確還不錯(cuò),也可能是由于評(píng)分?jǐn)?shù)量過(guò)少,為了優(yōu)中選優(yōu),后續(xù)有必要設(shè)置一定篩選門(mén)檻。

接下來(lái),我們看看評(píng)分最高的 20 款 App 有哪些,很多時(shí)候我們下載 App 都是跟著「哪個(gè)評(píng)分高,下載哪個(gè)」這種感覺(jué)走。

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

可以看到,評(píng)分最高的 20 個(gè) App,它們都得到了 4.8 分 ,包括:RE 管理器(再次出現(xiàn))、Pure 輕雨圖標(biāo)包等,還有一些不太常見(jiàn),可能這些都是不錯(cuò)的 App,不過(guò)我們還需要結(jié)合看一下下載量,它們的下載量都在 1 萬(wàn)以上,有了一定的下載量,評(píng)分才算比較可靠,我們就能放心的下載下來(lái)體驗(yàn)一下了。

經(jīng)過(guò)上面的總體分析,我們大致發(fā)現(xiàn)了一些不錯(cuò)的 App ,但還不夠,所以接下來(lái)將進(jìn)行細(xì)分并設(shè)置一定篩選條件。

4.2. 分類情況

按照 App 功能和日常使用場(chǎng)景,將 App 分為以下 9 大類別,然后 從每個(gè)類別中篩選出 20 款最棒的 App。

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

為了盡可能找出最好的 App,這里不妨設(shè)置 3 個(gè)條件:

  • 評(píng)分不低于 4 分
  • 下載量不低于 1 萬(wàn)
  • 設(shè)置一個(gè)總分評(píng)價(jià)指標(biāo)(總分 = 下載量 * 評(píng)分),再標(biāo)準(zhǔn)化為滿分 1000 分,作為 App 的排名參照指標(biāo)。

經(jīng)過(guò)評(píng)選之后,我們依次得到了各個(gè)類別下分?jǐn)?shù)最高的 20 款 App,這些 App 大部分的確是良心軟件。

4.2.1. 系統(tǒng)工具

系統(tǒng)工具包括了:輸入法、文件管理 、系統(tǒng)清理、桌面、插件、鎖屏等。

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

可以看到,第一名是大名鼎鼎的老牌文件管理器「RE 管理器」,僅有 5 M 大小的它除了具備普通文件管理器的各項(xiàng)功能以外,最大的特點(diǎn)是能夠卸載手機(jī)自帶的 App,不過(guò)需要 Root。

「ES 文件瀏覽器」的文件分析器功能非常強(qiáng)大,能夠有效清理臃腫的手機(jī)空間。

「一個(gè)木函」這款 App 就比較牛逼了,正如它的軟件介紹「擁有很多,不如有我」所說(shuō),打開(kāi)它你能發(fā)現(xiàn)它提供了好幾十項(xiàng)實(shí)用功能,比如:翻譯、以圖搜圖、快遞查詢、制作表情包等等。

再往下的「Super SU」、「存儲(chǔ)空間清理」、「鑭」、「MT 管理器」、「My Android Tools」都力薦,總之,這份榜單上的 App 可以說(shuō)都值得進(jìn)入你的手機(jī) App 使用名單。

4.2.2. 社交聊天

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

社交聊天類中, 「Share 微博客戶端」位居第一,作為一款第三方客戶端 App,它自然有比官方版本好的地方,比如相比正版 70M 的體積,它只有其十分之一大小,也幾乎沒(méi)有廣告,還有額外強(qiáng)大的諸多功能,如果你愛(ài)刷微博,那么不妨嘗試下這款「Share」。

「即刻」這款 App 也相當(dāng)不錯(cuò),再往下還能看到前陣子很火的「子彈短信」,宣稱將要取代微信,看來(lái)短期內(nèi)應(yīng)該是做不到了。

你可能會(huì)發(fā)現(xiàn),這份社交榜單上沒(méi)有出現(xiàn)「知乎」、「豆瓣」、「簡(jiǎn)書(shū)」這類常見(jiàn)的 App,是因?yàn)樗鼈兊脑u(píng)分都比較低,分別只有 2.9分、3.5分和 2.9 分,自然進(jìn)入不了這份名單,如果你一定想用它們,推薦去使用它們的第三方客戶端或者歷史版本。

4.2.3. 資訊閱讀

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

可以看到,在資訊閱讀類中,「靜讀天下」牢牢占據(jù)了第一名,我之前專門(mén)寫(xiě)過(guò)一篇文章介紹它:安卓最強(qiáng)閱讀器。

同類別中的「多看閱讀」、「追書(shū)神器」、「微信讀書(shū)」也都進(jìn)入了榜單。

另外,如果你經(jīng)常為不知道去哪里下載電子書(shū)而頭疼,那不妨試一下「搜書(shū)大師」、「老子搜書(shū)」。

4.2.4. 影音娛樂(lè)

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

接下來(lái)是影音娛樂(lè)版塊,網(wǎng)易家的「網(wǎng)易云音樂(lè)」毫無(wú)壓力地占據(jù)頭名,難得的大廠精品。

如果你愛(ài)玩游戲,那么 「Adobe AIR」應(yīng)該嘗試一下。

如果你很文藝,那么應(yīng)該會(huì)喜歡「VUE」這款短視頻拍攝 App,創(chuàng)作好以后發(fā)到朋友圈絕對(duì)能裝逼。

最后一位的「海貝音樂(lè)」很贊,最近發(fā)現(xiàn)它有一個(gè)強(qiáng)大的功能是結(jié)合百度網(wǎng)盤(pán)使用,它能夠自動(dòng)識(shí)別音頻文件然后播放。

4.2.5. 通訊網(wǎng)絡(luò)

下面到了通訊網(wǎng)絡(luò)類別,這個(gè)類別主要包括:瀏覽器、通訊錄、通知、郵箱等小類。

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

瀏覽器,我們每個(gè)人手機(jī)上都有,用的也五花八門(mén),有些人就用手機(jī)自帶的瀏覽器,有些人用 Chrome、火狐這類大牌瀏覽器。

不過(guò)你會(huì)發(fā)現(xiàn)榜單上的前三位你可能聽(tīng)都沒(méi)聽(tīng)過(guò),但是它們真的很牛逼,用「極簡(jiǎn)高效、清爽極速」來(lái)形容再適合不過(guò),其中 「Via 」和 「X 瀏覽器」 體積不到 1M ,真正的「麻雀雖小、五臟俱全」,強(qiáng)烈推薦。

4.2.6. 攝影圖片

拍照修圖也是我們常用的功能。也許你有自己的圖片管理軟件,但是這里要強(qiáng)烈推薦第一名「快圖瀏覽」這款 App,只有 3M 大小的它,能夠瞬間發(fā)現(xiàn)和加載上萬(wàn)張圖片,如果你是拍照狂魔,用它打開(kāi)再多的照片也能秒開(kāi),另外還擁有隱藏私密照片、自動(dòng)備份百度網(wǎng)盤(pán)等功能。它是我使用時(shí)間最久的 App 之一。

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

4.2.7. 文檔寫(xiě)作

我們時(shí)常需要在手機(jī)上寫(xiě)作、做備忘錄,那么自然需要好的文檔寫(xiě)作類 App。

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

「印象筆記」就不用多說(shuō)了,我覺(jué)得最好用的筆記總結(jié)類 App。

如果你喜歡使用 Markdown 寫(xiě)作,那么「純純寫(xiě)作」這款精巧的 App 應(yīng)該會(huì)很適合你。

體積不到 3M 卻擁有云備份、生成長(zhǎng)圖、中英文自動(dòng)空格等數(shù)十項(xiàng)功能,即使這樣,仍然保持了蘊(yùn)繁于簡(jiǎn)的設(shè)計(jì)風(fēng)格,這大概就是兩三個(gè)月之內(nèi),下載量就從兩三萬(wàn)飆升了十倍的原因,而這款 App 的背后是一位 犧牲了幾年的業(yè)余時(shí)間不斷開(kāi)發(fā)和更新的大佬,值得敬佩。

4.2.8. 出行交通購(gòu)物

這個(gè)類別中,排名第一的居然是 12306,一提起它,就會(huì)想起那一張張奇葩的驗(yàn)證碼,不過(guò)這里的 App 不是官網(wǎng)的 ,而是第三方開(kāi)發(fā)的。最牛逼的功能應(yīng)該就是「搶票了」,如果你還在靠發(fā)朋友圈來(lái)?yè)屍钡脑挘遣环猎囈幌滤?/p>

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

 

4.2.9. Xposed 插件

最后一個(gè)類別是 Xposed,很多人應(yīng)該不太熟悉,但是一提微信上的搶紅包、防撤回功能,應(yīng)該很多人就知道了。這些牛逼又不同尋常的功能就用到了 Xposed 框架里的各種模塊功能。這個(gè)框架由國(guó)外著名的 XDA 手機(jī)論壇,你經(jīng)常聽(tīng)到的一些所謂由 XDA 大神破解的軟件,就是來(lái)自這個(gè)論壇。

簡(jiǎn)單地說(shuō)就是,安裝了 Xposed 這個(gè)框架之后,就可以在里面安裝一些好玩有趣的插件,有了這些插件,你的手機(jī)就能實(shí)現(xiàn)更多更大的功能。比如:能夠去除廣告、破解 App 付費(fèi)功能、殺死耗電的自啟動(dòng)進(jìn)程、虛擬手機(jī)定位等功能。

不過(guò)使用這個(gè)框架和這些插件需要刷機(jī)、ROOT,門(mén)檻有點(diǎn)高。

分析了6000款A(yù)pp,竟有這么多佳軟神器沒(méi)用過(guò)

5. 小結(jié)

本文使用 Scrapy 框架爬取分析了酷安網(wǎng)的 6000 款 App,初學(xué) Scrapy 可能會(huì)覺(jué)得程序?qū)懫饋?lái)比較散亂,所以可以嘗試先使用普通的函數(shù)方法,把程序完整地寫(xiě)在一起,再分塊拆分到 Scrapy 項(xiàng)目中,這樣也有助于從單一程序到框架寫(xiě)法的思維轉(zhuǎn)變,之后會(huì)寫(xiě)單獨(dú)寫(xiě)一篇文章。

由于網(wǎng)頁(yè)版的 App 數(shù)量比 App 中的少,所以還有很多好用的 App 沒(méi)有包括進(jìn)來(lái),比如 Chrome 、MX player、Snapseed 等,建議使用酷安 App,那里有更多好玩的東西。

以上就是整篇文章的爬取與分析過(guò)程,文中涉及了很多精品佳軟,如有興趣可以去嘗試下載體驗(yàn)一下

責(zé)任編輯:未麗燕 來(lái)源: 第2大腦
相關(guān)推薦

2020-04-07 19:16:31

微信隱藏功能移動(dòng)應(yīng)用

2022-09-27 10:52:25

Pythonprint函數(shù)

2025-04-22 09:02:55

2018-06-26 15:00:24

Docker安全風(fēng)險(xiǎn)

2022-07-06 11:47:27

JAVAfor循環(huán)

2021-06-14 07:23:42

Windows10操作系統(tǒng)微軟

2017-07-26 10:08:06

FABDesign SuppAndroid

2020-12-31 05:49:44

FlinkSQL函數(shù)

2022-07-26 23:43:29

編程語(yǔ)言開(kāi)發(fā)Java

2021-01-14 05:08:44

編譯鏈接

2017-12-21 19:38:50

潤(rùn)乾中間表

2023-11-13 08:49:54

2024-02-20 08:09:51

Java 8DateUtilsDate工具類

2013-01-15 09:41:45

編程語(yǔ)言

2022-01-12 20:04:09

網(wǎng)絡(luò)故障斷網(wǎng)事件網(wǎng)絡(luò)安全

2019-08-27 08:17:57

云計(jì)算安全云服務(wù)商

2017-07-04 14:01:40

機(jī)房機(jī)柜

2017-07-12 08:20:32

閃存用途企業(yè)

2021-01-29 08:52:10

App微信移動(dòng)應(yīng)用

2020-06-01 08:04:18

三目運(yùn)算符代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产综合区 | 亚洲成人福利视频 | 亚洲成人免费在线 | 一区二区三区四区五区在线视频 | 国产一区不卡 | 日韩在线观看视频一区 | 久久久久久99 | 精品一区二区三 | 国产在线观看av | 亚洲欧美中文日韩在线v日本 | 日韩中文字幕在线观看 | 中文字幕一区二区三区在线观看 | 国产精品综合网 | 日韩av一区在线观看 | 天天操夜夜骑 | 日日噜噜噜夜夜爽爽狠狠视频, | 毛片网在线观看 | 欧美成人精品一区二区男人看 | 欧美日韩在线免费观看 | 另类 综合 日韩 欧美 亚洲 | 国产视频福利一区 | 午夜免费电影院 | 黄色片免费看视频 | 91在线看 | 麻豆一区一区三区四区 | 欧美日韩国产一区 | 国产精品久久久久久久免费观看 | 国产精品99久久久久久久久久久久 | 久久精品一区二区 | 成人在线激情 | 欧美男人天堂 | 欧美一区二区久久 | 97精品超碰一区二区三区 | 91高清视频在线观看 | 91精品中文字幕一区二区三区 | 精品一区二区在线观看 | 精品国产一区二区三区久久 | 久久一区二区视频 | 国产精品视频久久久 | 亚洲vs天堂| 亚洲日韩中文字幕一区 |