第 7 章 數據清洗

第二部分 高級數據采集

這部分內容就是要幫你分析原始數據棘幸,獲取隱藏在數據背后的故事——網站的真實故事其實都隱藏在 JavaScript忠烛、登錄表單和網站反抓取措施的背后株茶。
通過這部分內容的學習目代,你將掌握如何用網絡爬蟲測試網站濒蒋,自動化處理,以及通過更多的方式接入網絡楼誓。最后你將學到一些數據采集的工具玉锌,幫助你在不同的環(huán)境中收集和操作任意類型的網絡數據,深入互聯網的每個角落疟羹。

第7章 數據清洗

本章將介紹一些工具和技術主守,通過改變代碼的編寫方式禀倔,幫你從源頭控制數據零亂的問題,并且對已經進入數據庫的數據進行清洗参淫。

7.1 編寫代碼清洗數據

介紹如何獲取格式合理的 n-gram

from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
import string


def cleanSentence(sentence):
"""
在循環(huán)體中用 item.strip(string.punctuation) 對內容中的所有單詞進行清洗
單詞兩端的任何標點符號都會被去掉
但帶連字符的單詞(連字符在單詞內部)仍然會保留
剔除單字符的“單詞”救湖,除非這個字符是“i”或“a”
"""
    sentence = sentence.split(' ')
    sentence = [word.strip(string.punctuation+string.whitespace) for word in sentence]
    sentence = [word for word in sentence if len(word) > 1 or (word.lower() == 'a' or word.lower() == 'i')]
    return sentence


def cleanInput(content):
"""
忽略字母大小寫的區(qū)別
用正則表達式來移除轉義字符(\n),
把內容轉換成 UTF-8 格式以消除轉義字符
再把 Unicode 字符過濾掉
"""
    content = content.upper()
    content = re.sub('\n|[[\d+\]]', ' ', content)
    content = bytes(content, "UTF-8")
    content = content.decode("ascii", "ignore")
    sentences = content.split('. ')
    return [cleanSentence(sentence) for sentence in sentences]


def getNgramsFromSentence(content, n):
"""
ngrams 函數把一個待處理的字符串分成單詞序列(假設所有單詞按照空格分開)涎才,
然后增加到 n-gram 模型(本例中是 2-gram)里形成以每個單詞開始的二元數組鞋既。
"""
    output = []
    for i in range(len(content)-n+1):
        output.append(content[i:i+n])
    return output


def getNgrams(content, n):
    content = cleanInput(content)
    ngrams = []
    for sentence in content:
        ngrams.extend(getNgramsFromSentence(sentence, n))
    return(ngrams)


html = urlopen('http://en.wikipedia.org/wiki/Python_(programming_language)')
bs = BeautifulSoup(html, 'html.parser')
content = bs.find('div', {'id':'mw-content-text'}).get_text()
print(len(getNgrams(content, 2)))

from collections import Counter

def getNgrams(content, n):
"""
統計每個詞組出現的次數
"""
    content = cleanInput(content)
    ngrams = Counter()
    ngrams_list = []
    for sentence in content:
        newNgrams = [' '.join(ngram) for ngram in getNgramsFromSentence(sentence, n)]
        ngrams_list.extend(newNgrams)
        ngrams.update(newNgrams)
    return(ngrams)

print(getNgrams(content, 2))

7.2 數據存儲后再清洗

OpenRefine 不僅可以快速簡單地清理數據,還可以讓非編程人員輕松地看見和使用你的數據憔维。
使用 OpenRefine 可以數據執(zhí)行篩選涛救、排序、變換或刪除等操作业扒。
篩選 數據篩選可以通過兩種方法實現:過濾器(filter)和切片器(facet)检吆。
過濾器可以用正則表達式篩選數據,通過操作框輕松地組合程储、編輯和增加數據蹭沛,還可以和切片器配合使用。
切片器可以很方便地對一列的部分數據進行包含和不包含的篩選章鲤。它們都有內置的篩選工具摊灭。例如,數值篩選功能會為你提供一個數值滑動窗口败徊,讓你選擇需要的數值區(qū)間帚呼。
經過選過的數據結果可以被導成任意一種 OpenRefine 支持的數據文件格式,包括 CSV皱蹦、 HTML(HTML 表格)煤杀、Excel 以及其他格式。
清洗 只有當數據一開始就比較干凈時沪哺,數據篩選才可以直接快速地完成沈自。
OpenRefine 的數據變換功能是通過 OpenRefine 表達式語言(Expression Language)實現的,被稱為 GREL(“G”是 OpenRefine 之前的名字 GoogleRefine)辜妓。這個語言通過創(chuàng)建規(guī)則簡單的 lambda 函數來實現數據的轉換枯途。例如:
if(value.length() != 4, "invalid", value)
OpenRefine 還有許多關于單元格編輯和 GERL 數據變換的方法。詳細介紹在 OpenRefine 的 GitHub 頁面籍滴。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末酪夷,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子异逐,更是在濱河造成了極大的恐慌捶索,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灰瞻,死亡現場離奇詭異腥例,居然都是意外死亡,警方通過查閱死者的電腦和手機酝润,發(fā)現死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門燎竖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人要销,你說我怎么就攤上這事构回。” “怎么了疏咐?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵纤掸,是天一觀的道長。 經常有香客問我浑塞,道長借跪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任酌壕,我火速辦了婚禮掏愁,結果婚禮上,老公的妹妹穿的比我還像新娘卵牍。我一直安慰自己果港,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布糊昙。 她就那樣靜靜地躺著辛掠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪释牺。 梳的紋絲不亂的頭發(fā)上萝衩,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音船侧,去河邊找鬼欠气。 笑死,一個胖子當著我的面吹牛镜撩,可吹牛的內容都是我干的预柒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼袁梗,長吁一口氣:“原來是場噩夢啊……” “哼宜鸯!你這毒婦竟也來了?” 一聲冷哼從身側響起遮怜,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤淋袖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后锯梁,有當地人在樹林里發(fā)現了一具尸體即碗,經...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡焰情,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了剥懒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片内舟。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖初橘,靈堂內的尸體忽然破棺而出验游,到底是詐尸還是另有隱情,我是刑警寧澤保檐,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布耕蝉,位于F島的核電站,受9級特大地震影響夜只,放射性物質發(fā)生泄漏垒在。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一盐肃、第九天 我趴在偏房一處隱蔽的房頂上張望爪膊。 院中可真熱鬧,春花似錦砸王、人聲如沸推盛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耘成。三九已至,卻和暖如春驹闰,著一層夾襖步出監(jiān)牢的瞬間瘪菌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工嘹朗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留师妙,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓屹培,卻偏偏與公主長得像默穴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子褪秀,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內容