1. 程式人生 > 其它 >對自己的上網搜尋記錄進行爬蟲是怎樣一種體驗

對自己的上網搜尋記錄進行爬蟲是怎樣一種體驗

原作者 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