標籤:sts 去重 val time 半成品 code col values 實現
記上一次v1.0的空間爬蟲之後,準備再寫一個爬蟲分析本人說說的點贊情況
首先分析Json:
可以發現點贊的節點為data-->vFeeds(list)-->like-->likemans(list)-->user-->nickname&uin
代碼如下:
1 for i in range(0, page): 2 try: 3 html = requests.get(url_x + str(numbers) + url_y, headers=headers).content 4 data = json.loads(html) 5 6 if ‘vFeeds‘ in data[‘data‘]: 7 for vFeed in data[‘data‘][‘vFeeds‘]: 8 if ‘like‘ in vFeed: 9 for like_man in vFeed[‘like‘][‘likemans‘]:10 qq_list.append(int(like_man[‘user‘][‘uin‘]))11 # 這個dict需要定義在迴圈內,因為下面list.append()是引用傳遞12 like_me_map = dict()13 like_me_map[‘nick_name‘] = like_man[‘user‘][‘nickname‘]14 like_me_map[‘qq‘] = like_man[‘user‘][‘uin‘]15 like_me_list.append(like_me_map)16 numbers += 4017 time.sleep(10)18 print(‘正在分析前‘ + str(numbers) + ‘條資料‘)19 except:20 numbers += 4021 time.sleep(10)22 print(‘第‘ + str(numbers) + ‘條資料附近分析出錯‘)
like_me_list是一個list of dict,qq_list是所有QQ號的集合,現在定義一個dict來方便查詢qq與暱稱:
1 # 建立一個QQ與暱稱對應的map,以便查詢2 qq_name_map = dict()3 for man in like_me_list:4 qq_name_map[man[‘qq‘]] = man[‘nick_name‘]
利用set實現自動去重並計算count:
1 # 計算點贊次數,並將次數與QQ映射存入map2 qq_set = set(qq_list)3 for qq in qq_set:4 like_me_result[str(qq)] = qq_list.count(qq)
再按點贊次數降序排序處理,此處代碼比較醜陋=。=:
1 # 以下處理為:按點贊次數排序後存入一個新的map作為最終結果,代碼很不優雅=。=2 num_result = sorted(like_me_result.values(), reverse=True)3 print(num_result)4 for num in num_result:5 for key in like_me_result.keys():6 if like_me_result[key] == num:7 result[qq_name_map[key]+‘(‘ + key + ‘)‘] = num
最後,寫入檔案,大功告成:
1 try:2 with open(os.getcwd() + ‘\\‘ + ‘like_me_result.txt‘, ‘wb‘) as fo:3 for k, v in result.items():4 record = k + ‘: 點贊‘ + str(v) + ‘次!\r\n‘5 fo.write(record.encode(‘utf-8‘))6 print("點贊資料結果分析寫入完畢")7 8 except IOError as msg:9 print(msg)
然而最後我發現一個問題,就是QQ空間返回的json點贊資料並不是完整的,
num代表點贊人數,一共13人點贊,但是我觀察發現所有說說點贊人數集合likemans最多隻有3個
我猜可能是因為mobile QQ空間頁面不需要顯示點贊資訊,所以才沒有完整的點贊資訊,
UI顯示上面並沒有點贊的資訊顯示=。=
所以這個爬蟲只能算一個半成品
QQ空間Python爬蟲v2.0--點贊資料分析