爬蟲項(xiàng)目中涉及Json數(shù)據(jù)的處理

在執(zhí)行爬蟲項(xiàng)目的過程中,有時返回的不是一個html頁面而是json格式數(shù)據(jù)忧勿,此時對數(shù)據(jù)的解析非常重要杉女。

比如京東的評論數(shù)據(jù)、淘寶的評論數(shù)據(jù)鸳吸、人人貸的數(shù)據(jù)(https://www.we.com/lend/loanList!json.action?pageIndex=3)熏挎。

(一).Json格式數(shù)據(jù)的爬取

采用Python爬取數(shù)據(jù)可以采用Scrapy或者采用urllib,requests等兩種方法,顯然在這里采用第二種方式更為簡單晌砾。

步驟如下:

1坎拐、由于有分頁的情況,因此首先構(gòu)造帶分頁的url地址养匈。

urlbase ="https://www.we.com/lend/loanList!json.action?pageIndex="

urlList = []

#拼接要爬取的地址

for?i?in?range(1,52):

? ? ?url= urlbase +str(i)+"&_=1489560949549"urlList.append( url )

#循環(huán)抓取列表頁信息

2哼勇、采用request對以上的url進(jìn)行爬取

import ?requests

content=requests.get(url,headers=headers).content

在爬取的過程中,考慮到需要模擬真實(shí)的用戶呕乎,因此需要添加cookie或者h(yuǎn)eader參數(shù)积担。

(二).對爬取的json格式數(shù)據(jù)的解析

至此,數(shù)據(jù)已經(jīng)爬取下來猬仁,存放在contend里面帝璧,但是如何提出里面的關(guān)鍵數(shù)據(jù)非常重要。

為了能在瀏覽器中方便的瀏覽Json格式的數(shù)據(jù)湿刽,建議在chrome中添加一個擴(kuò)展程序JSONView的烁,使得其Json格式的數(shù)據(jù)能夠結(jié)構(gòu)化的顯示。比如人人貸的數(shù)據(jù)顯示如下叭爱。


對于這個數(shù)據(jù)的解析有兩種方式

1撮躁、采用正則表達(dá)式解析

比如我們要獲取“amount”的內(nèi)容,可以采用以下方式獲嚷蛭怼:

importre

##使用正則提取amount字段amount = re.findall(r'"amount":(.*?),', content)

其中content是爬取下來內(nèi)容把曼。

2、基于json格式進(jìn)行獲取

實(shí)際上json的數(shù)據(jù)格式與python的dict是有極大的類似之處漓穿。在python的importjson這個包里面提供了兩個經(jīng)典的預(yù)處理方法:

import json

dict_ = {1:2, 3:4,"55":"66"}

# test json.dumps

print type(dict_), dict_

json_str =json.dumps(dict_)

print "json.dumps(dict) return:"

print type(json_str), json_str

# test json.loads

print "\njson.loads(str) return"

dict_2 =json.loads(json_str)

print type(dict_2), dict_2

輸出為:

程序結(jié)果:

{'55': '66', 1: 2, 3: 4}

json.dump(dict) return:

{"55": "66", "1": 2,"3": 4}

json.loads(str) return

{u'55': u'66', u'1': 2, u'3': 4}

從上面的樣例可以看出兩個經(jīng)典的方法dumps和loads的作用分別為:

json.dumps

:ptyhondict轉(zhuǎn)成str

json.loads:str轉(zhuǎn)成pythondict類型

有了以上的基礎(chǔ)知識后嗤军,對于人人貸的數(shù)據(jù)可以直接采用如下方式處理:

for?url?in?urlList:

? ? //獲取內(nèi)容

? ?content=requests.get(url,headers=headers).content

? ?//采用json.loads方法將str轉(zhuǎn)換為dict類型

? ?con=json.loads(content)#獲取都到評論列表,因?yàn)橹斑€有很多的其他東西晃危,這些是不需要的

? ?//直接采用python中dict的數(shù)據(jù)獲取方法叙赚,取得loans列表,然后直接取得各個數(shù)據(jù)僚饭。

? ?commentList= con["data"]["loans"]

? ?for ??item?in ?commentList:

? ? ? ?loanId= item['loanId']

? ? ? title= item['title']

? ? ? amount= item['amount']

? ? ? interest= item['interest']?

? ? ? months= item['months']

備注:

采用第二種方式的時候要注意震叮,返回的數(shù)據(jù)是不是標(biāo)準(zhǔn)的json格式的數(shù)據(jù),如果不是標(biāo)準(zhǔn)的json格式數(shù)據(jù)鳍鸵,那么可能需要額外處理一下苇瓣。比如京東商品的評論數(shù)據(jù),

https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv52063&productId=3133859&score=0&sortType=5&page=1&pageSize=10&isShadowSku=0

這是Apple iPhone 7 Plus (A1661) 128G亮黑色移動聯(lián)通電信4G手機(jī)的評論數(shù)據(jù)偿乖。

直接打開上面的鏈接后就會發(fā)現(xiàn)在jsonview下面并不是正規(guī)的json格式數(shù)據(jù)顯示击罪,那么對于這種數(shù)據(jù)類型哲嘲,可以采用正則表達(dá)式的方式來獲取,當(dāng)然也還是可以采用json轉(zhuǎn)換為dict方式來處理媳禁。

仔細(xì)分析爬下來的數(shù)據(jù):

原始頁面:

我們要爬取的是用戶評論數(shù)據(jù)眠副,而爬取下來的content并不是標(biāo)準(zhǔn)的json格式數(shù)據(jù),怎么辦竣稽,如上圖給出的提示囱怕,爬取下來的contend是把數(shù)據(jù)放到fetchJSON_comment98vv52063()里面了,而括號里面的數(shù)據(jù)則是標(biāo)準(zhǔn)的json格式數(shù)據(jù)丧枪。

因此對于此類的數(shù)據(jù)光涂,首先要正則表達(dá)是提出括號里面的數(shù)據(jù),然后再用loads方法轉(zhuǎn)換為python的dict類型數(shù)據(jù)進(jìn)行處理就可以了拧烦。

源碼如下:

#爬取

for?url ?in ?urlList:

? ? ? cont=requests.get(url,headers=headers,cookies=cookie).content

#這點(diǎn)非常重要忘闻,這里的正則表達(dá)式是取以數(shù)字或者字母開頭,后面緊跟()中的內(nèi)容 ??rex=re.compile(r'\w+[(]{1}(.*)[)]{1}')

? ?content=rex.findall(cont)[0]#取出括號中的東西恋博,這是一個標(biāo)準(zhǔn)的json格式數(shù)據(jù)

? ? con=json.loads(content,"gbk")

#獲取都到評論列表齐佳,因?yàn)橹斑€有很多的其他東西,這些是不需要的

? ? commentList= con['comments']

? ? for ?item ?in ?commentList:

? ? ? ? ?id= item['id']?

? ? ? ? content= item['content'].strip()

? ? ? ?referenceName= item['referenceName']

? ? ? ?productColor= item['productColor']

一個技巧:可以先嘗試提出()內(nèi)的數(shù)據(jù)到一些在線的json解析網(wǎng)站(http://www.bejson.com/)去看看json數(shù)據(jù)的排列格式债沮,這樣就更加清楚該怎么提取數(shù)據(jù)了炼吴。

(三)參考文獻(xiàn):

1、使用python抓取并分析數(shù)據(jù)—人人貸(urllib)

:http://bluewhale.cc/2016-12-11/use-python-crawl-and-analysis-data-renrendai-urllib-html.html#ixzz4dKuFHIgb

2 http://blog.csdn.net/yan_xing_an/article/details/46892105

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疫衩,一起剝皮案震驚了整個濱河市硅蹦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌闷煤,老刑警劉巖童芹,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件羽峰,死亡現(xiàn)場離奇詭異篷牌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)杂抽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門近顷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來生音,“玉大人,你說我怎么就攤上這事窒升∽罕椋” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵饱须,是天一觀的道長瑟由。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么歹苦? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮督怜,結(jié)果婚禮上殴瘦,老公的妹妹穿的比我還像新娘。我一直安慰自己号杠,他們只是感情好蚪腋,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著姨蟋,像睡著了一般屉凯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上眼溶,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天悠砚,我揣著相機(jī)與錄音,去河邊找鬼堂飞。 笑死灌旧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绰筛。 我是一名探鬼主播枢泰,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼铝噩!你這毒婦竟也來了衡蚂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤骏庸,失蹤者是張志新(化名)和其女友劉穎毛甲,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敞恋,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丽啡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了硬猫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片补箍。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖啸蜜,靈堂內(nèi)的尸體忽然破棺而出坑雅,到底是詐尸還是另有隱情,我是刑警寧澤衬横,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布裹粤,位于F島的核電站,受9級特大地震影響蜂林,放射性物質(zhì)發(fā)生泄漏遥诉。R本人自食惡果不足惜拇泣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望矮锈。 院中可真熱鬧霉翔,春花似錦、人聲如沸苞笨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瀑凝。三九已至序芦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粤咪,已是汗流浹背谚中。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留射窒,地道東北人藏杖。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像脉顿,于是被迫代替她去往敵國和親蝌麸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容