python 爬取華為應用市場評論
代碼分享
整個項目我放在了github上,在python3.7下可以正常使用,如果有什么問題歡迎大家指正。
github項目地址:https://github.com/LSY-C/scrapy_hauweiappstore_comment
分別爬取的一些應用信息以及應用的評論信息,數(shù)據(jù)結(jié)構(gòu)如下:
一、安裝并創(chuàng)建Scrapy項目
Scrapy官方文檔:https://docs.scrapy.org/en/latest/intro/install.html
Scrapy是一個比較好用的python爬蟲框架,官方文檔寫得也比較詳細??梢灾苯舆\行以下命令安裝:
pip install Scrapy
安裝完畢后,需要創(chuàng)建Scrapy項目,相當于是一個爬蟲項目框架,在想要放置項目的地方打開命令行并輸入以下命令會自動創(chuàng)建一個名為[project_name]的文件夾,比如我這里的[project_name]是appstore,文件夾中會自動生成的一些文件。
scrapy startproject appstore
- appstore/scrapy.cfg中包含了用于啟動爬蟲的一些基礎(chǔ)配置,一般不用管它。
- appstore/appstore/items.py:定義了爬取到的數(shù)據(jù)格式類,在這里面創(chuàng)建類來存放爬取到的數(shù)據(jù)的item格式。
- appstore/appstore/middlewares.py:定義了爬蟲中間鍵的一些行為,我一般也不會去動它。
- appstore/appstore/pipelines.py:定義了爬取到item后對其進行的處理。
- appstore/appstore/settings.py:是爬蟲配置文件。
- appstore/appstore/spiders/:這個目錄下存放的是爬蟲,也就是向網(wǎng)頁發(fā)送請求并受到應答然后進行數(shù)據(jù)處理的過程。
二、爬取應用市場評論過程
爬取網(wǎng)頁信息有兩個常用的方法:
- 直接通過xpath解析html文件
- 依據(jù)特定格式構(gòu)造請求獲取json數(shù)據(jù)進行解析
顯然前者更簡單方便一些,但是現(xiàn)在許多網(wǎng)頁都是動態(tài)的,所以后者泛用性更強一些,這里我爬取華為應用市場上所有應用的評論信息主要使用的是后面一種方法。
1. Scrapy爬蟲運行流程
首先需要大致了解Scrapy的爬蟲是如何運作的,分為以下幾個步驟:
- Step1: 在項目的spiders文件夾中新建一個.py文件,比如huawei.py,一般來說每一個文件代表一個爬蟲,也就是對某一個網(wǎng)頁的爬取策略。
- Step2: 創(chuàng)建一個類繼承自scrapy.Spider,類中至少需要有name、allowed_domain、start_urls變量以及一個函數(shù)parse(self)。其中name是此爬蟲的唯一標識,之后啟動時通過指定name來判斷啟動哪個爬蟲(因為spiders文件夾中可能包含多個爬蟲文件);allowed_domain用來指定當前爬蟲可以訪問的主域名;start_urls用來指定首先獲取的頁面,而此獲取結(jié)果將會交由parse函數(shù)進行處理。每個爬蟲中的處理函數(shù)可能有很多個,命名格式一般是parse_xxx之類的,用來處理多級頁面,比如parse處理完主頁面之后構(gòu)造新的請求獲取二級頁面信息并通過parse_second進行處理,但不管怎么樣都會包含一個parse函數(shù)。
import scrapy class HuaWei(scrapy.Spider): name = "huawei" allowed_domains = ['appstore.huawei.com', 'web-drcn.hispace.dbankcloud.cn'] start_urls = [ 'https://web-drcn.hispace.dbankcloud.cn/uowap/index?method=internal.getTemplate&serviceType=20&zone=&locale=zh'] def parse(self, response): pass
- step3: 爬蟲編寫好之后,在項目根目錄(也就是scrapy.cfg文件的同級目錄)打開命令行,并輸入以下命令啟動爬蟲:
scrapy crawl hauwei
2. 頁面分析
首先,通過瀏覽器訪問應用市場,分析一下想要爬取網(wǎng)頁的基本信息,這里我想要爬取應用市場中所有應用的評論,所以首先需要進入到所有應用的詳細界面,然后在詳細界面中展開評論進行爬取,基本的思路是:對每一個分類–>對每一個子分類–>展開每一個應用–>獲取應用全部評論。
爬取的初始頁面是https://appgallery.huawei.com/#/Apps,瀏覽器中使用F12啟動開發(fā)者模式,調(diào)試網(wǎng)頁前端代碼,我們希望的是能夠找到頁面排版的某些規(guī)律。
頁面分析過程一
我們發(fā)現(xiàn)不管在應用分類的選項卡中選擇哪一個分類或是子分類,url都不會變。也就是說,選擇分類后顯示對應的應用列表這一功能是動態(tài)實現(xiàn)的,我們沒辦法通過抓取html中的信息來獲取不同分類的應用列表,那么我們只能通過自己構(gòu)造請求獲取json數(shù)據(jù)的方式爬取信息。
首先,打開調(diào)試窗口中的Network選項卡來分析獲取不同分類應用列表時的網(wǎng)絡數(shù)據(jù)包:
除了第一個數(shù)據(jù)包以外,后面的都是獲取應用圖標數(shù)據(jù),也就是說第一個數(shù)據(jù)包里面就包含了應用的其他數(shù)據(jù),查看此數(shù)據(jù)包中的request_url為:
https://web-drcn.hispace.dbankcloud.cn/uowap/index ?method=internal.getTabDetail &serviceType=20 &reqPageNum=1 &uri=8e62cf6d238c4abdb892b400ff072f43 &maxResults=25 &zone= &locale=zh
我們直接在瀏覽器中訪問此url,可以得到一個json文件,分析后發(fā)現(xiàn)此json文件中包含了列表中應用的信息。點擊不同的分類、子分類,獲取不同的request_url,我們發(fā)現(xiàn),每一個子分類的request_url都只有uri字段不一樣,且默認情況都只顯示第1頁的25個應用。也就是說我們以此request_url為模板,修改uri字段實現(xiàn)獲取不同類別應用列表,修改reqPageNum字段獲取列表中的多頁應用。
頁面分析過程二
手動點進每一個應用的詳細界面時,我們發(fā)現(xiàn),不同應用的詳細界面的url只有最后的定位有不同,比如騰訊視頻與優(yōu)酷視頻這兩個應用詳細界面的url分別是:
多觀察幾個應用就會發(fā)現(xiàn)最后的那一串代碼應該是類似于應用唯一標識符一樣的東西。而在上一步中,我們可以發(fā)現(xiàn)在獲取的每個應用信息中包含能夠找到這些標識符(‘a(chǎn)ppid'鍵的值),于是我在這里嘗試直接以這種格式構(gòu)造url請求獲取頁面,但是失敗了,猜測可能是頁面重定向的問題,沒辦法,只能按部就班地通過其它方式繼續(xù)分析。
通過F12查看頁面排版,每一個app卡片中雖然有app名稱以及一些其他信息,但是找不到app詳細頁面的鏈接,因為獲取應用詳細信息功能被寫成了使用js動態(tài)獲取的,因此我們沒辦法直接從html界面中獲取,所以依舊采用構(gòu)造request_url的方法獲取json數(shù)據(jù)。
與分析過程一類似,我們可以獲取以下的request_url:
https://web-drcn.hispace.dbankcloud.cn/uowap/index ?method=internal.getTabDetail &serviceType=20 &reqPageNum=1 &maxResults=25 &uri=app%7CC174391 &shareTo= ¤tUrl=https%253A%252F%252Fappgallery.huawei.com%252F%2523%252Fapp%252FC174391 &accessId= &appid=C174391 &zone= &locale=zh
通過此request_url獲取的json中包含了應用的詳細信息,實際上通過測試,其中的reqPageNum、maxResults、shareTo、currentUrl、accessId、appid、zone、locale字段都是不需要的,而又發(fā)現(xiàn)uri字段中后面的“C174391”是當前應用的appid,也就是說我們只需要修改uri字段的“app%7C”后面的字符串為不同應用的appid(可以在分析過程一中的json文件里獲取),就可以獲取不同應用的詳細信息。
頁面分析過程三
有了上面兩次分析的經(jīng)驗,我們繼續(xù)來爬取每個應用的評論數(shù)據(jù),發(fā)現(xiàn)這些數(shù)據(jù)也是通過js動態(tài)獲取的,于是繼續(xù)分析request_url,格式如下:
https://web-drcn.hispace.dbankcloud.cn/uowap/index ?method=internal.user.commenList3 &serviceType=20 &reqPageNum=1 &maxResults=25 &appid=C2002 &version=10.0.0 &zone= &locale=zh
與之前類似,我們可以通過修改appid字段爬取不同應用的評論,通過修改reqPageNum字段爬取多頁評論。
3. 爬蟲實現(xiàn)
整個爬取過程就是:構(gòu)造request_url請求獲取json數(shù)據(jù)–>解析json數(shù)據(jù)–>構(gòu)造新的request_url獲取json數(shù)據(jù)–>…
下面是爬蟲中的一個處理函數(shù),功能是處理每一個應用的詳細信息并構(gòu)造獲取評論的request_url發(fā)送新的請求,接下來依次說明其中的關(guān)鍵部分。
def app_parse(self, response): """ 解析應用,獲取應用名稱、描述、資費、版本、開發(fā)者,然后轉(zhuǎn)至appcomment_parse進行處理 :param resonse: :return: """ appid = response.meta['appid'] app_json = json.loads(response.text) Name = app_json.get('layoutData')[0].get('dataList')[0].get('name') Star = app_json.get('layoutData')[0].get('dataList')[0].get('intro') Downloads = app_json.get('layoutData')[0].get('dataList')[0].get('stars') Price = app_json.get('layoutData')[3].get('dataList')[0].get('tariffDesc') Version = app_json.get('layoutData')[3].get('dataList')[0].get('version') Developer = app_json.get('layoutData')[3].get('dataList')[0].get('developer') Description = app_json.get('layoutData')[7].get('dataList')[0].get('appIntro').replace('\n', '') AppData = AppItem( AppId=appid, AppName=Name, AppDesc=Description, AppPrice=Price, AppVersion=Version, AppDeveloper=Developer, AppStar=Star, AppDownloads=Downloads ) yield AppData for pagenum in range(1, 20): request_url = "https://web-drcn.hispace.dbankcloud.cn/uowap/index?method=internal.user.commenList3&serviceType=20&reqPageNum={}&maxResults=25&appid={}&version=10.0.0&zone=&locale=zh".format( pagenum, appid) yield scrapy.Request(url=request_url, callback=self.appcomment_parse, meta={'appid': appid})
解析json并構(gòu)造請求
第8行中通過json.loads將響應解析為json格式,并在后續(xù)使用鍵值與index訪問里面的信息。
將數(shù)據(jù)保存在items中
在items.py文件中定義好Item類之后,可以在此新建一個Item對象,并在填入相應的值,將此item返回交由pipeline.py進行處理。
# items.py class AppItem(scrapy.Item): AppId = scrapy.Field() AppName = scrapy.Field() AppDesc = scrapy.Field() AppPrice = scrapy.Field() AppVersion = scrapy.Field() AppDeveloper = scrapy.Field() AppStar = scrapy.Field() AppDownloads = scrapy.Field()
yield是python中的一個關(guān)鍵詞,與return類似,會讓函數(shù)返回此關(guān)鍵詞修飾的表達式值,與return不同的是,yield在返回一個值后會繼續(xù)執(zhí)行后面的代碼,而return不會。
構(gòu)造新的請求
在最后一行中針對所有評論列表構(gòu)造新的request_url以獲取評論信息,并通過scrapy.Request發(fā)送請求,其中callback指定用于處理此請求響應的處理函數(shù),而meta中包含了想要傳遞給callback函數(shù)的信息。
item數(shù)據(jù)的處理
在爬取數(shù)據(jù)的過程中,處理函數(shù)會實時將不同的item返回并交由pipeline進行處理,此時需要在pipeline.py中指定如何處理這些item,比如在此我把數(shù)據(jù)全都記錄入csv表格中。pipeline類中必須定義process_item函數(shù)來處理每一個item,而__init__與close_spider都是可選的。
class AppStorePipeline: def __init__(self): self.app_list = [] self.comment_list = [] def process_item(self, item, spider): # 接收到item時調(diào)用的函數(shù) if isinstance(item, AppItem): self.app_list.append(dict(item)) elif isinstance(item, CommentItem): self.comment_list.append(dict(item)) return item def close_spider(self, spider): # 當爬蟲關(guān)閉時調(diào)用的函數(shù) df_app = pd.DataFrame(self.app_list) df_comment = pd.DataFrame(self.comment_list) df_app.to_csv('app_info.csv') df_comment.to_csv('comment_info.csv')
以上就是python 爬取華為應用市場評論的詳細內(nèi)容,更多關(guān)于python 爬取華為應用市場的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python中input()函數(shù)的用法實例小結(jié)
我們編寫的大部分程序,都需要讀取輸入并對其進行處理,而基本的輸入操作是從鍵盤鍵入數(shù)據(jù),Python從鍵盤鍵入數(shù)據(jù),大多使用其內(nèi)置的input()函數(shù),下面這篇文章主要給大家介紹了關(guān)于Python中input()函數(shù)用法的相關(guān)資料,需要的朋友可以參考下2022-03-03Python實現(xiàn)設置windows桌面壁紙代碼分享
這篇文章主要介紹了Python實現(xiàn)設置windows桌面壁紙,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下2015-03-03在Python中使用MySQL--PyMySQL的基本使用方法
PyMySQL 是在 Python3.x 版本中用于連接 MySQL 服務器的一個庫,Python2中則使用mysqldb。這篇文章主要介紹了在Python中使用MySQL--PyMySQL的基本使用,需要的朋友可以參考下2019-11-11對pyqt5中QTabWidget的相關(guān)操作詳解
今天小編就為大家分享一篇對pyqt5中QTabWidget的相關(guān)操作詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06Python深度學習pytorch卷積神經(jīng)網(wǎng)絡LeNet
這篇文章主要為大家講解了Python深度學習中的pytorch卷積神經(jīng)網(wǎng)絡LeNet的示例解析,有需要的朋友可以借鑒參考下希望能夠有所幫助2021-10-10Python實現(xiàn)腳本鎖功能(同時只能執(zhí)行一個腳本)
這篇文章主要介紹了Python實現(xiàn)腳本鎖功能(同時只能執(zhí)行一個腳本),本文給大家分享了兩種方法,大家可以根據(jù)個人所需選擇適合自己的方法2017-05-05