對自己的上網搜尋記錄進行爬蟲是怎樣一種體驗
原作者 Walker Harrison
編譯 CDA 編譯團隊
本文為 CDA 資料分析師原創翻譯作品,轉載需授權
前言
國外習慣用 Google 進行搜尋,可以毫不誇張的說 Google 已經徹底地融入了日常生活。如今人們一有什麼問題都習慣谷歌一下,敲敲鍵盤,你就能找到想要的答案。
與此同時,你的 Google 搜尋記錄也反映了某段時間你的心態,好奇心,追求甚至是擔憂。如果你已註冊了 Google 帳戶(通常是 Gmail ),根據你對隱私項的設定, Google 能夠記錄並提供你的搜尋歷史。下面我將告訴大家如何獲取和分析你的 Google 搜尋記錄,以及進行資料視覺化。
1. 下載資料
首先進入:https://takeout.google.com/settings/takeout,在這裡你可以找到各種個人資料集,包括你的 GChat 對話和電子郵件。 取消全選(“全不選”),然後選擇“搜尋”並點選“下一步”。在下一頁,選擇檔案型別(.tgz )和傳遞方式。 (我選擇通過郵件傳送的下載連結)。開啟該電子郵件後,點選,下載存檔並解壓縮,你將得到資料夾“ Takeout ”和“ Searches ”中的一些檔案。
2. 準備資料
資料是 JSON 格式,這種格式比較規整,可以通過通過 Python 變成向量:
import json import os import datetime import numpy as np import pandas as pd import matplotlib.pyplot as plt from collections import Counter files= os.listdir('Searches') del files[0] searches = [] dates = [] for file in files: with open('Searches/%s'%(file)) as json_data: d = json.load(json_data) for i in range(len(d['event'])): for j in range(len((d['event'][i][u'query'][u'id']))): searches.append(d['event'][i][u'query'][u'query_text']) dates.append(d['event'][i][u'query'][u'id'][j][u'timestamp_usec']) dates = [datetime.datetime.fromtimestamp(int(i)/1000000).strftime('%Y-%m-%d %H:%M:%S') for i in dates] searches = [i.encode('utf-8') for i in searches]
3. 分析資料
我們可以看到截止到 2014 年秋季的 886 天內,我總共進行了近 64,000 次 Google 搜尋,每天超過 70 次。 我每天在工作時都使用個人膝上型電腦,這能夠解釋這一巨大的搜尋數量,同時也說明我並沒有誇大 Google 搜尋的普遍性!
資料中有很多值得挖掘的模式。比如每小時搜尋資料:
hours = [datetime.datetime.strptime(i, '%Y-%m-%d %H:%M:%S').hour for i in dates] n, bins, patches = plt.hist(hours, 24, facecolor='blue', alpha=0.75) plt.xticks([0,6,12,18], ['12 AM','6 AM', '12 PM', '6 PM'], fontsize=18) plt.xlabel('Hour', fontsize=24) plt.ylabel('Frequency', fontsize=24) plt.gcf().set_size_inches(18.5, 10.5, forward=True) plt.show()
每小時圖反映了我的作息規律:當我沒有使用 Google 時,很可能我在睡覺。在到達工作地點之後,我開始各種搜尋,在下午 3 點左右達到高峰值。晚餐後經過簡短的休息,我再次開始搜尋,在 10 點左右達到又一個高峰,一直持續到過了凌晨才結束。(我是一隻夜貓子)。
我都在 Google 搜尋些什麼呢?可以對詞頻進行分析排序:
combo = ' '.join(searches)
freqs = Counter(combo.split())
top = freqs.most_common(40)
words = []
counts = []
for i in range(40):
words.append(top[i][0])
counts.append(top[i][1])
words.reverse()
counts.reverse()
plt.barh(range(40), counts, align='center', color='b', alpha=0.75)
plt.yticks(range(40), words, fontsize=16)
plt.gcf().set_size_inches(18.5, 10.5, forward=True)
plt.show()
英文中常常使用的 “the”“of” 可以忽略不計,在列表中仍然可以看到過去幾年中我的心路歷程。我經常寫部落格,而且會避免過度使用同一個詞,因此會常常搜尋同義詞。 我住在紐約(“nyc”),常常去健身房(“nysc”)。 我是一個有追求的資料科學家(“data”,“python”,“r”)。 我是典型的美國人(“baseball”,“States”),同時也很關心時事(“trump”)。
當然,時間段對搜尋詞有很大的影響。人們不會因為相同的原因每天都搜尋同一件事,同時也不會每天想同樣的事。因此,分析隨著時間推移一些特定的詞的變化很有意義。這能夠讓我們瞭解興趣和關注點是如何隨著時間的推移而變化的:
d = {"search": searches,
"time": dates}
googled = pd.DataFrame(d)
dt = datetime.datetime(2014, 10, 1)
end = datetime.datetime(2017, 3, 5)
step = datetime.timedelta(days=7)
weekly = []
while dt < end:
weekly.append(dt.strftime('%Y-%m-%d %H:%M:%S'))
dt += step
# finding/smoothing/normalizing weekly data only shown for 'trump' but same process applies to the other terms
trump_weeks = []
for i in range(len(weekly)-1):
trump_weeks.append(sum((googled['time'] > weekly[i]) &
(googled['time'] < weekly[i+1]) &
(googled['search'].str.contains('trump'))))
term = len(trump_weeks)-1
trump_weeks_smooth = [(trump_weeks[i] + trump_weeks[i-1] +trump_weeks[i+1])/3 for i in range(1, term)]
trump_weeks_smooth_norm = [i/float(max(trump_weeks_smooth)) for i in trump_weeks_smooth]
plt.plot(range(term-1), trump_weeks_smooth_norm, label='trump', linewidth=5.0)
plt.plot(range(term-1), warriors_weeks_smooth_norm, label='warriors', linewidth=5.0)
plt.plot(range(term-1), ibm_weeks_smooth_norm, label='ibm', linewidth=5.0)
plt.plot(range(term-1), python_weeks_smooth_norm, label='python', linewidth=5.0)
plt.xticks([30,60,90,120], ['May 2015','November 2015', 'June 2016', 'January 2017'], fontsize=15)
plt.legend()
plt.gcf().set_size_inches(18.5, 10.5, forward=True)
plt.show()
雖然你我素未謀面,但是你完全可以通過這個圖來了解我是誰,以及在某段時間內我在想些什麼。 畢業後,直到 2015 年夏天我都在 IBM (紅色)工作。有好幾個月,我一直特別關注金州勇士隊創紀錄的賽季(綠色)。 在 2016 年春天,我決定學習 Python (淺藍色)。接近總統選舉時,我非常關注特朗普(深藍色),其中中斷了一段時間,直到他的就職典禮又開設重新關注。
結語
讀完從這篇文章,會讓你感受到 Google 無所不知的強大性。這些反映在從地圖到 GChat 對話以及個人日曆等資料。個人的電子足跡涵蓋了多少訊息,以及誰有權獲得這些資料,這都值得我們深思。
但可以肯定的是,你有權檢視你的搜尋記錄,並且瞭解當中的意義。我們都漸漸失去了在睡前回顧一天做了些什麼的習慣,在某種程度上 Google 充當了類似日記的功能,而且反映的內容更真實。
在這裡鼓勵你試著下載自己的資料,嘗試分析。完整的程式碼連結如下。如果你習慣用的是某度搜索的話,那怪我咯~ https://github.com/WalkerHarrison/Google_searches