Selenium之學習雜記(五)

2020-08-10 13:12:41


如果你使用過API,那麼你很可能會喜歡用API中那些已經處理好的數據。遺憾的是,在實際工作中,API的使用次數總是少的,大多數時候,都需要我們自己來進行數據的挖掘、整理和分析等操作。既然和網際網路打交道,就少不了對各種數據型別進行轉換。需要轉換數據型別的根本原因是數據的儲存方式和應用目的不同,計算機對不同類型的數據有不同的儲存方式,比如,有的爲了節省儲存空間,有的則爲了使用方便等。這些數據在編解碼問題上往往比較麻煩。

讀寫CSV檔案

CSV(Comma-Separated Value,逗號分隔值)就是採用逗號進行分隔的值。可以直接在txt檔案中編輯CSV,這也意味着它是一個純文字檔案(只能包含數位和文字,不能包含圖片和視訊)。
Python的CSV庫主要包含兩個主要用法—— Reader和Writer,分別代表讀和寫。
自己編寫一個city.csv檔案
檔案內容如下:

城市ID,城市名,城市名(英文),國家,國家CODE
AAAAAA,安道爾A,Andorra la Vella,安道爾A,AD
BBBBBB,安道爾B,Andorra la Vella,安道爾B,BD
CCCCCC,安道爾C,Andorra la Vella,安道爾C,CD
DDDDDD,安道爾D,Andorra la Vella,安道爾D,DD
EEEEEE,安道爾E,Andorra la Vella,安道爾E,ED
FFFFFF,安道爾F,Andorra la Vella,安道爾F,FD

CSV檔案的讀取很簡單,但需要注意的是,你想要讀取的檔案包含的內容可能千奇百怪。因爲網路上的文字品質參差不齊,錯誤的拼寫、混亂的換行、空格以及混用的標點符號等都是我們處理數據時遇到的大問題,部分字元甚至可能在UTF-8編碼中不存在,所以需要把error參數設定成ignore模式(忽略可能出現的編碼錯誤)。

讀取程式碼

import csv
# 開啓檔案
file = open('city.csv', 'r', encoding='utf-8', errors='ignore')
csv_file = csv.reader(file)
# 通過遍歷元素來逐行輸出
for i in csv_file:
    print(i)

執行結果:
在这里插入图片描述
寫入程式碼:

import csv

# 需要寫入檔案
header = ["name", "gender", "score"]
file_1 = ["zhang_san", "男", "100"]
file_2 = ["Li_si", "女", "59"]
# 建立CSV檔案
# 如果不加參數newline="",會多一行空格
csvFile = open('writer.csv','w',newline="")
writer = csv.writer(csvFile)
# 寫入的內容都以列表的形式傳入函數
writer.writerow(header)
writer.writerow(file_1)
writer.writerow(file_2)
# 關閉檔案
csvFile.close()

執行結果
在这里插入图片描述

讀寫JSON檔案

JSON(JavaScript Object Notation,JavaScript物件標記)數據也是一種解決方式。JSON官方是這樣介紹JSON的:一種輕量級的數據交換格式,易於人閱讀和編寫,同時也易於機器解析和生成。採用完全獨立於語言的文字格式的JSON,是進行數據交換的理想格式。JSON基於一種「名稱:值」的集合,這和Python的字典格式非常類似。其實是因爲JSON沿用了類C語言家族(包括C、C++、Java、Python和Perl等)的習慣。如果讀者使用過API,那麼你會驚訝地發現,絕大部分API返回的數據都是JSON的。其實JSON和下面 下麪要講解的XML有很大關聯。它們的關係更像是老牌強者和後起之秀:本來XML獨大,後來JSON逐漸佔了上風。和XML相比,JSON具有以下特點,因此很多專案和網頁的內容傳輸都使用JSON。●JSON內容簡潔。●JSON採用壓縮傳輸技術來節省寬頻。●沿用了類C語言家族的習慣,適應的瀏覽器衆多。●JSON格式簡單,易於編寫和解析。Python的庫中同樣有專門針對JSON的,並且這個庫是Python自帶的,所以我們完全不必耗費時間去安裝它。JSON庫主要包含4個方法,分別是loads()、dumps()、load()和dump()。其中load()和dump()與檔案的讀寫相關。dumps()方法將dict轉化成str格式,loads()方法將str轉化成dict格式。下面 下麪是dumps()和loads()方法的使用範例。

import json
# 自定義json的範例數據
json_data = {
    "results": [
        {
            "location": {
                "id": "WX4FBXXFKE4F",
                "name": "北京",
                "country": "CN",
                "path": "北京,北京",
                "timezone": "Asia/Shanghai",
                "timezone_offset": "+08:00"
            }
        }
    ]
}
b = json.dumps(json_data)
print(b, type(b))
c = json.loads(b)
print(c, type(c))

執行結果
在这里插入图片描述

import json
# 自定義json的範例數據
json_data = {
    "results": [
        {
            "location": {
                "id": "WX4FBXXFKE4F",
                "name": "北京",
                "country": "CN",
                "path": "北京,北京",
                "timezone": "Asia/Shanghai",
                "timezone_offset": "+08:00"
            }
        }
    ]
}
# 開啓檔案
f = open('test.txt', 'w')
print(type(f))
json.dump(json_data, f)
# tip 1
f.close()
# 先讀取再關閉
f = open('test.txt', 'r')
print(f.read())
f.close()
# json讀取test.txt的內容
f = open('test.txt', 'r')
print(json.load(f))
f.close()

執行結果
在这里插入图片描述

將字典轉化爲XML

XML(eXtensible Markup Language,可延伸標示語言)是一種靈活的資訊格式,規定了一系列編碼轉換的規則,它的設計理念是讓資訊可以同時被人和機器閱讀。雖然XML檔案佔用的空間比單純的二進制檔案要多很多,但是這種可延伸標示語言更容易理解和掌握,它的這種明瞭性使其易於在任何語言、程式中讀寫數據。和HTML相比,XML繼承了通用標準標示語言的的大部分功能,技術實現卻要簡單得多,但和前面提到的JSON相比,XML格式的數據在儲存空間的有效比重上不太佔優勢。
那麼,什麼是XML呢?我們來看一個簡單的例子。在这里插入图片描述
在解析XML的時候,我們主要會用到兩個方法—— Element和tostring。前者用於建立一個XML檔案,後者則用於將XML檔案轉換爲可以被人讀取、理解的字元形式的程式碼。在以下程式碼中,我們首先提供了一個字典,然後寫了一個可以普遍使用的轉換函數,再將字典轉換爲XML,接下來輸出XML。第一次輸出結果返回的是一個記憶體地址,字典的內容儲存在這裏。第二次輸出將其轉換爲了字串,接下來我們對最外層設定一個屬性,並再次輸出。

from xml.etree.ElementTree import tostring
from xml.etree.ElementTree import Element
dict = {"name": "zhang_san", "gender": "female", "phone_number": "01234567890", "note": "none"}
# 寫一個轉換函數
def covert(tag_name, dict):
    # 建立一個XML
    elem = Element(tag_name)
    # 通過雙值回圈取出字典中的鍵和值
    for key, value in dict.items():
        # 輸出
        print(key,":",value)
        # 相當與爲鍵建立一個標籤
        xml_elem = Element(key)
        # 將鍵的值賦給這個標籤
        xml_elem.text = str(value)
        # 新增到xml檔案中
        elem.append(xml_elem)
    return elem
# 字典轉換
dict_convert = covert("test", dict)
print("-------------------------------------")
print(dict_convert)
# 轉換爲可讀的標準XML
print(tostring(dict_convert))
# 設定最外層標籤屬性
dict_convert.set('id_number', '01234567890')
# 再次輸出
print(tostring(dict_convert))

執行結果
在这里插入图片描述

Base64編碼

Base64的名字在一定程度上解釋了它的形式。Base64基於64個可列印字元來表示二進制數據。64是怎麼來的呢?Base64編碼中每6位是一個單元,而26等於64。Base64主要應用於對網路上傳輸的8位元位元組碼編碼(如電子郵件),也部分應用於加/解密(因爲它的可逆性,嚴格意義上不算加密,只是採用Base64後對人來說不可讀)。另外,曾經比較火爆的兩款下載軟體—— 迅雷、QQ旋風使用的專用鏈接也採用了Base64編碼。Python中提供了一種Base64編碼(這是內建庫)的解決方案。在Python中,你使用Base64編解碼就像使用print()那麼簡單。
Base64庫只有兩個主要函數—— encode()和decode()。下面 下麪給出一段使用encode()和decode()函數的範例程式碼。

import base64

# 定義字串
string=b"admin"
# encode表示編碼,decode表示解碼
encoded=base64.b64encode(string)
decoded=base64.b64decode(encoded)
# 輸出
print(encoded)
print(decoded)

執行結果
b’YWRtaW4=’
b’admin’

詞性分析、統計分析NLTK

NLP(Natural Language Processing,自然語言處理)是一門涵蓋語言學、電腦科學、人工智慧等領域的學科,是一種研究人與計算機之間如何用自然語言進行通訊的理論方法。簡單來說,NLP就是開發能夠理解人類語言的應用程式或服務。這裏討論一些自然語言處理的例子,如分詞、分句、詞性劃分、理解匹配詞的同義詞。當然,這並不是NLP能做的所有事情,在這裏,讀者只需要掌握常用的方法。

NLTK(Natural Language Toolkit,自然語言工具包)在使用Python處理自然語言的工具中處於領先的地位,同時,它基於Python構建。它提供了WordNet這種方便處理詞彙資源的介面(擁有超過50個語料庫和詞彙資源),還有分類、分詞、除莖、標註、語法分析、語意推理等類庫。最讓人驚喜的一點是,它基於Apache2.0開源協定免費發佈。NLTK是一個第三方軟體包,也是在NLP領域中最常使用的一個Python庫。使用者需要通過pip或者其他的包管理器或者原始碼安裝NLTK。然而,若僅僅安裝NLTK庫,它的大部分方法仍然無法使用。在NLTK中,自帶了一個函數download()。
暫時不做過多說明

雜湊表

雜湊演算法和一般的加密演算法最大的區別在於一般的加密演算法是一一對映(對特定值都進行某種變換,每個數有且僅有一個對應的函數值,每個函數值有且僅有一個對應的數,請參考函數的一一對映),因此理論上雜湊演算法是可逆的。雜湊演算法的定義域是一個無限集合,而值域(輸出位數固定)是一個有限集合,將無限集合對映到有限集合,類似於「鴿籠原理」(Pigeonhole principle),每個雜湊結果都存在無數個可能的目標文字(請參考函數的滿射)。因此,雜湊不是一個一一對映集合,定義域到值域的對映是不可逆的。雜湊演算法是一類演算法的統稱,這類具有不可逆性特徵的對映僅可以叫作雜湊演算法和加密演算法,但未必具備好的效能。好的雜湊演算法和加密演算法幾乎不會發生文字碰撞(即輸入的數不同,而輸出的函數值相同)。好的雜湊演算法應該對於內容的改變極其敏感,即使輸入有很小的改動,如1億個字元中變了1個字元,那麼結果應該截然不同。這就是爲什麼雜湊演算法可以用來檢測軟體的完整性。雜湊演算法有很廣泛的應用,加密常用的MD5(Message-Digest Algorithm 5,資訊摘要演算法5)、SHA(Secure Hash Algorithm,安全雜湊演算法)都是雜湊演算法。很多網站的密碼都是採用雜湊演算法加密的。當你忘記密碼的時候,網站並不是將你忘記的密碼發送給你,而是讓你重新修改密碼,然後讓你用這個新密碼登錄。這是因爲你在註冊賬號時輸入的密碼的雜湊值儲存在數據庫裡,而雜湊演算法不可逆,所以即使通過伺服器也不可能復原你的密碼,而只能重置密碼。
在这里插入图片描述