第二部分 高級數據采集
這部分內容就是要幫你分析原始數據棘幸,獲取隱藏在數據背后的故事——網站的真實故事其實都隱藏在 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 頁面籍滴。