網站數據分析(5)——使用python獲取運營數據

使用Python獲取數據,目前主要的方法集中在文本文件、Excel文件、關係型和非關係型數據庫、API、網頁等方面。php

獲取數據所用到的包:html

Numpy中文文檔:www.numpy.org.cn/article/bas…python

Pands中文文檔:www.pypandas.cn/docs/mysql

1、從文本文件讀取運營數據

1.1 使用read、readline、readlines讀取數據

Python能夠讀取任意格式的文本數據,使用Python讀取文本數據的基本步驟是:git

(1)定義數據文件;(2)獲取文件對象; (3)讀取文件內容; (4)關閉文件對象。github

(1)定義數據文件

定義數據文件即定義要讀取的文件,該步驟不是必須的,能夠跟「獲取文件對象」整合。但爲了後續操做的便捷性、全局數據對象的可 維護性以及減小代碼冗餘,建議讀者養成習慣,將數據文件預先賦值給一個對象。web

定義文本數據文件的方法是:正則表達式

file_name = [文件名稱]
複製代碼

實例:sql

file_name = 'text.txt'
複製代碼

文件名稱中能夠只寫文件名,此時默認Python讀取當前工做目錄下 的文件;也能夠加入路徑,默認使用斜槓,尤爲是Windows下要注意用法。mongodb

(2)獲取文件對象

獲取文件對象的意義是基於數據文件產生對象,後續全部關於該數據文件的操做都基於該對象產生。

語法:

fileobject = open(name[,mode][,buffering])
複製代碼

參數:

  • name:要讀取的文件名稱,即上一個環節定義的file_name,必填
  • mode:打開文件的模式,選填,在實際應用中,r、r+、w、w+、a、a+是使用最多的模式。
  • buffering:文件所需的緩衝區大小,選填;0表示無緩衝,1表示線路緩衝。

返回:經過open函數會建立一個文件對象(fileobject)。示例:

file_name = 'text.txt'
file_object=open(file_name)
複製代碼

file_object=open('text.txt')
複製代碼

(3)讀取文件內容

Python基於文件對象的讀取分爲3種方法,以讀取text.txt爲例:

這是第一行
這是第二行
這是第三行
複製代碼

關於read()方法:

一、讀取整個文件,將文件內容放到一個字符串變量中

二、若是文件大於可用內存,不可能使用這種處理

執行代碼:

file_name = 'text.txt'
file_object=open(file_name,encoding='utf-8')
text1 = file_object.read()
text1
複製代碼

結果

'這是第一行\n這是第二行\n這是第三行'
複製代碼

關於readline()方法:

一、readline()每次讀取一行,比readlines()慢得多

二、readline()返回的是一個字符串對象,保存當前行的內容

執行代碼:

file_name = 'text.txt'
file_object=open(file_name,encoding='utf-8')
text2 = file_object.readline()
text2
複製代碼

結果

'這是第一行\n'
複製代碼

關於readlines()方法:

一、一次性讀取整個文件。

二、自動將文件內容分析成一個行的列表。

執行代碼:

file_name = 'text.txt'
file_object=open(file_name,encoding='utf-8')
text3 = file_object.readlines()
text3
複製代碼

結果

['這是第一行\n', '這是第二行\n', '這是第三行']
複製代碼

在實際應用中,read方法和readlines方法比較經常使用,並且兩者都能讀取所有文件中的數據。

兩者的區別只是返回的數據類型不一樣,前者返回字符串,適用於全部行都是完整句子的文本文件,例如大段文字信息;

後者返回列表,適用於每行是一個單獨的數據記錄,例如日誌信息。不一樣的讀取方法會直接影響後續基於內容的處理應用;readline因爲每次只讀取一行數據,所以一般須要配合seek、next等指針操做才能完整遍歷讀取全部數據記錄。

(4)關閉文件內容

每次使用完數據對象以後,須要關閉數據對象。方法是

file_object.close()
複製代碼

理論上,Python能夠讀取任意格式的文件,但在這裏先講以讀取格式化的文本數據文件爲主,其中包括txt、csv、tsv等格式的文件,以及有固定分隔符分隔並以通用數據編碼和字符集編碼(例如utf八、ASCII、GB2312等)存放的無擴展名格式的數據文件。

另外,Python文件操做中的指針相似於Word操做中的光標,指針所處的位置就是光標的位置,它決定了Python的讀寫從哪裏開始。默認狀況下,當經過open函數打開文件時,文件的指針處於第一個對象的位置。所以,在上述經過readline讀取文件內容時,獲取的是第一行數據。仍然是上面示例中的數據文件,咱們經過以下代碼演示基於不一樣指針位置讀取的內容:

fn=open('text.txt',encoding='utf-8')#得到文件對象
print(fn.tell())#輸出指針位置
line1=fn.readline()#得到文件第一行數據 
print(line1)#輸出第一行數據
print(fn.tell())#輸出指針位置
line2=fn.readline()#得到文件第二行數據
print(line2)#輸出第二行數據
print(fn.tell())#輸出指針位置 
line3=fn.readline()#得到文件第三行數據
print(line3)#輸出第三行數據
fn.close()#關閉文件對象
複製代碼

結果:

0
這是第一行
16
這是第二行
32
這是第三行
複製代碼

1.2 使用Numpy的loadtxt、load、fromfile讀取數據

Numpy讀取數據的方法包括loadtxt、load和fromfile等3種

(1)numpy的loadtxt()方法

numpy.loadtxt(fname, dtype=<type 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0)
複製代碼
參數 做用
fname 被讀取的文件名(文件的相對地址或者絕對地址)
dtype 指定讀取後數據的數據類型
comments 跳過文件中指定參數開頭的行(即不讀取)
delimiter 指定讀取文件中數據的分割符
converters 對讀取的數據進行預處理
skiprows 選擇跳過的行數
usecols 指定須要讀取的列
unpack 選擇是否將數據進行向量輸出
encoding 對讀取的文件進行預編碼

執行代碼:

import numpy as np
txt_array = np.loadtxt('text.txt',dtype=str,comments='#',encoding='utf-8')
print(txt_array)
複製代碼

結果

['這是第一行' '這是第二行' '這是第三行']
複製代碼

(2)numpy的load()方法

numpy.load(file, mmap_mode=None, allow_pickle=True, fix_imports=True, encoding='ASCII')[source])
複製代碼
參數 做用
file 要讀取的文件,字符串或pathlib.Path。類文件對象必須支持 seek()和read()方法。pickle文件要求類文件對象也支持該readline()方法。
mmap_mode 內存映射模式,值域爲None、'r+'、'r'、'w+'、'c',選填。
allow_pickle 布爾型,選填,決定是否容許加載存儲在npy文件中的pickled對象數組,默認值爲True。
fix_imports 布爾型,選填,僅在Python3上加載Python2生成的pickle文件時纔有用,其中包括包含對象數組的npy / npz文件。若是fix_imports爲True,則pickle將嘗試將舊的Python 2名稱映射到Python 3中使用的新名稱。
encoding 字符串,決定讀取Python2字符串時使用何種編碼,選填。

執行代碼:

import numpy as np#導入nump庫
write_data=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])#定義要存儲的數據 np.save('load_data',write_data)#保存爲npy數據文件
np.save('load_data',write_data)#保存爲npy數據文件
read_data=np.load('load_data.npy')#讀取npy文件
print(read_data)#load()沒法直接讀取txt文件,只能讀取.npy或者.npz的文件。
複製代碼

結果

[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
複製代碼

(3)numpy的fromfile()方法

numpy.fromfile(file, dtype=float, count=-1, sep='')
複製代碼
參數 做用
file 要讀取的文件,字符串或pathlib.Path。
dtype 數據類型
count 整數型,讀取數據的數量,-1意味着讀取全部數據。
sep 字符串,若是file是一個文本文件,那麼該值就是數據間的分隔符。若是爲空("")則意味着file是一個二進制文件,多個空格將按照一個空格處理。

執行代碼:

import numpy as np
txt_array3 = np.loadtxt('text.txt',dtype=str,comments='#',encoding='utf-8')
print(txt_array3)
tofile_name = 'binary'#定義導出二進制文件名
txt_array3.tofile(tofile_name)#導出二進制文件
fromfile_data = np.fromfile(tofile_name,dtype='float32')#讀取二進制文件print(fromfile_data)#打印數據
複製代碼

結果

['這是第一行' '這是第二行' '這是第三行']
複製代碼

1.3 使用Pandas的read_csv、read_fwf、read_table讀取數據

(1)Pandas的read_csv()方法

pandas.read_csv(filepath_or_buffer: Union[str, pathlib.Path, IO[~AnyStr]], sep=',', delimiter=None, header='infer', names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=0, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, cache_dates=True, iterator=False, chunksize=None, compression='infer', thousands=None, decimal=b'.', lineterminator=None, quotechar='"', quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, dialect=None, error_bad_lines=True, warn_bad_lines=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None)
複製代碼
參數 做用
file 要讀取的文件,字符串或pathlib.Path。
dtype 數據類型
count 整數型,讀取數據的數量,-1意味着讀取全部數據。
sep 字符串,若是file是一個文本文件,那麼該值就是數據間的分隔符。若是爲空("")則意味着file是一個二進制文件,多個空格將按照一個空格處理。

text.csv文檔原始數據:

1            	2
這是第一行第一列	這是第一行第二列
這是第二行第一列	這是第二行第二列
複製代碼

執行代碼:

import pandas as pd
txt_array4 = pd.read_csv('text.csv',sep=',',dtype='str',encoding='gbk')
print(txt_array4)
複製代碼

結果

1                 2
0  這是第一行第一列  這是第一行第二列
1  這是第二行第一列  這是第二行第二列
複製代碼

(2)Pandas的read_fwf()方法

pandas.read_fwf(filepath_or_buffer, colspecs='infer', widths=None, **kwds)
複製代碼
參數 做用
filepath_or_buffer 要讀取的文件,字符串或pathlib.Path。
widths 由整數組成的列表,選填,若是間隔是連續的,可使用的字段寬度列表而不是「colspecs」。

執行代碼:

import pandas as pd
txt_array4 = pd.read_fwf('text.csv',sep=',',dtype='str',encoding='gbk')
print(txt_array4)
複製代碼

結果

1,2
0  這是第一行第一列,這是第一行第二列
1  這是第二行第一列,這是第二行第二列
複製代碼

(3)Pandas的read_table()方法

pandas.read_table(filepath_or_buffer, sep='\t', delimiter=None, header='infer', names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, iterator=False, chunksize=None, compression='infer', thousands=None, decimal=b'.', lineterminator=None, quotechar='"', quoting=0, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=None, error_bad_lines=True, warn_bad_lines=True, skipfooter=0, skip_footer=0, doublequote=True, delim_whitespace=False, as_recarray=None, compact_ints=None, use_unsigned=None, low_memory=True, buffer_lines=None, memory_map=False, float_precision=None)[source]
複製代碼

參數:對於read_table而言,參數與read_csv徹底相同。其實read_csv原本就是read_table中分隔符是逗號的一個特例,表如今語法中是read_csv的sep=','(默認)。所以,具體參數請查閱read_csv的參數部分。

read_csv() 讀取以‘,’分割的文件到DataFrame

read_table()讀取以‘/t’分割的文件到DataFrame

分割符既有空格又有製表符(‘/t’),sep參數用‘/s+’,能夠匹配任何空格。

參數 做用
filepath_or_buffer 要讀取的文件,字符串或pathlib.Path。
widths 由整數組成的列表,選填,若是間隔是連續的,可使用的字段寬度列表而不是「colspecs」。

執行代碼:

import pandas as pd
txt_array4 = pd.read_table('text.csv',sep='/s+',dtype='str',encoding='gbk')
print(txt_array4)
複製代碼

結果

1,2
0  這是第一行第一列,這是第一行第二列
1  這是第二行第一列,這是第二行第二列
複製代碼

1.4 如何選擇最佳讀取數據的方法

  • 對於純文本格式或非格式化、非結構化的數據,一般用於天然語言處理、非結構化文本解析、應用正則表達式等後續應用場景下,Python默認的三種方法更爲適合。

  • 對於結構化的、純數值型的數據,而且主要用於矩陣計算、數據建模的,使用Numpy的loadtxt方法更爲方便,例如本書中使用的sklearn 自己就依賴於Numpy。

  • 對於二進制的數據處理,使用Numpy的load和fromfile方法更爲合適。

  • 對於結構化的、探索性的數據統計和分析場景,使用Pandas方法進行讀取效果更佳,由於其提供了相似於R的數據框,能夠實現「仿SQL」式的操做方式,對數據進行任意翻轉、切片(塊等)、關聯等都 很是方便。

  • 對於結構化的、數值型和文本型組合的數據統計分析場景,使用Pandas更爲合適,由於每一個數據框中幾乎能夠裝載並處理任意格式的數 據。

2、從EXCEL文件讀取運營數據

現有的Excel分爲兩種格式:xls(Excel 97-2003)和xlsx(Excel 2007及以上)。

Python處理Excel文件主要是第三方模塊庫xlrd、xlwt、pyexcel-xls、xluntils和pyExcel-erator,以及win32com和openpyxl模塊,此外Pandas中也帶有能夠讀取Excel文件的模塊(read_excel)。

咱們主要說主流的read_excel()

pandas.read_excel(io,sheet_name = 0,header = 0,names = None,index_col = None,usecols = None,squeeze = False,dtype = None, ...)
複製代碼
參數 做用
io 字符串,文件的路徑對象。
sheet_name None、string、int、字符串列表或整數列表,默認爲0。字符串用於工做表名稱,整數用於零索引工做表位置,字符串列表或整數列表用於請求多個工做表,爲None時獲取全部工做表。
header 指定做爲列名的行,默認0,即取第一行的值爲列名。數據爲列名行如下的數據;若數據不含列名,則設定 header = None。
names 默認爲None,要使用的列名列表,如不包含標題行,應顯示傳遞header=None。
index_col 指定列爲索引列,默認None列(0索引)用做DataFrame的行標籤。
usecols int或list,默認爲None。
squeeze boolean,默認爲False,若是解析的數據只包含一列,則返回一個Series。
dtype 列的類型名稱或字典,默認爲None。數據或列的數據類型。例如{'a':np.float64,'b':np.int32}使用對象保存存儲在Excel中的數據而不解釋dtype。若是指定了轉換器,則它們將應用於dtype轉換的INSTEAD。
skiprows 省略指定行數的數據,從第一行開始。
skipfooter 省略指定行數的數據,從尾部數的行開始。

執行代碼:

import pandas as pd
txt_array4 = pd.read_excel('text.xlsx',sep='\s+',encoding='gbk')
print(txt_array4)
複製代碼

結果

1                   2
0  這是第一行第一列  這是第一行第二列
1  這是第二行第一列  這是第二行第二列
複製代碼

3、從關係型數據庫MySQL讀取運營數據

3.1 第一步,下載Navicat,鏈接mysql

3.2 第二步,將Excel數據導入數據庫

選擇要導入的表,右鍵選擇「導入嚮導」,再選擇格式類型「EXCEL」。

3.3 第三步,用python的pymysql包鏈接mysql數據庫

pymysql語法教程連接:www.runoob.com/python3/pyt…

import pymysql
# 打開數據庫鏈接(IP地址,用戶名,密碼,數據庫名稱)
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# 使用 cursor() 方法建立一個遊標對象 cursor
cursor = db.cursor()
# 使用 execute() 方法執行 SQL 查詢 
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法獲取單條數據.
data = cursor.fetchone()
print ("Database version : %s " % data)
# 關閉數據庫鏈接
db.close()
複製代碼

結果

Database version : 5.5.57-log 
複製代碼

3.4 第四步,操做mysql數據

SQL語句教程:www.w3school.com.cn/sql/index.a…

正則表達式教程:www.runoob.com/regexp/rege…

# SQL 查詢語句
sql = "SELECT `訂單產品數據`.`訂單狀態`,COUNT(*) FROM `訂單產品數據` GROUP BY `訂單產品數據`.`訂單狀態`"
try:
   # 執行SQL語句
   cursor.execute(sql)
   # 獲取全部記錄列表
   results = cursor.fetchall()
   print (results)
except:
   print ("報錯")
複製代碼

結果:

(('交易取消', 33), ('交易完成', 16), ('待發貨', 17), ('待收貨', 218), ('拍下商品', 20), ('退貨完成', 6))
複製代碼

4、從非關係型數據庫MongoDB讀取運營數據

PyMongo教程:www.runoob.com/python3/pyt…

4.1 安裝MongoDB

MongoDB教程:www.runoob.com/mongodb/mon…

4.2 測試是否正常啓動

import pymongo
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
dblist = myclient.list_database_names()
if "runoobdb" in dblist:
  print("數據庫已存在!")
複製代碼

結果

數據庫已存在!
複製代碼

4.3 建立集合,插入多個文檔

mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
mylist = [
  { "name": "Taobao", "alexa": "100", "url": "https://www.taobao.com" },
  { "name": "QQ", "alexa": "101", "url": "https://www.qq.com" },
  { "name": "Facebook", "alexa": "10", "url": "https://www.facebook.com" },
  { "name": "知乎", "alexa": "103", "url": "https://www.zhihu.com" },
  { "name": "Github", "alexa": "109", "url": "https://www.github.com" }
]
 
x = mycol.insert_many(mylist)
 
# 輸出插入的全部文檔對應的 _id 值
print(x.inserted_ids)
複製代碼

結果

[ObjectId('5b236aa9c315325f5236bbb6'), ObjectId('5b236aa9c315325f5236bbb7'), ObjectId('5b236aa9c315325f5236bbb8'), ObjectId('5b236aa9c315325f5236bbb9'), ObjectId('5b236aa9c315325f5236bbba')]
複製代碼

4.4 查詢集合中全部數據

mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
for x2 in mycol.find():
  print(x2)
複製代碼

結果

{'_id': ObjectId('5d4390faa89575889f30d11e'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}
{'_id': ObjectId('5d439138a89575889f30d11f'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5d439138a89575889f30d120'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5d439138a89575889f30d121'), 'name': 'Facebook', 'alexa': '10', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5d439138a89575889f30d122'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5d439138a89575889f30d123'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
複製代碼

在企業實際應用中,非關係型數據庫每每基於「大數據」的場景產生,伴隨着海量、實時、多類型等特徵。這些數據庫經過捨棄了關係型數據庫的某些特徵和約束,而後在特定方面進行加強,所以才能知足特定應用需求。非關係型數據庫因爲約束性、規範性、一致性和數據準確性低於關係性數據庫,所以經常使用於實時海量數據讀寫、非結構化和半結構化信息讀寫、海量集羣擴展、特殊場景應用等。因此在金融、保險、財務、銀行等領域內,這種應用比較少;而互聯網、移動應用等新興產 業和行業領域則應用較多。

5、從API獲取運營數據

爲了更好地讓全部讀者都能瞭解從API獲取數據的具體過程,本節使用百度免費API做爲實際數據來源。百度API提供了衆多地圖類功 能,如基本地圖、位置搜索、周邊搜索、公交駕車導航、定位服務、地理編碼及逆地理編碼等。本節使用的是百度Web服務API中的Geocoding API。

Geocoding API用於提供從地址到經緯度座標或者從經緯度座標到地址的轉換服務,用戶能夠發送請求且接收JSON、XML的返回數。 該應用可用於對運營數據中的地址相關信息進行解析,從而得到經緯度信息,這些信息可用於進一步基於地理位置進行解析、展現和分析等。

要得到該API,須要擁有百度相關帳戶和AK信息。

第一步 得到百度帳戶,沒有帳戶的讀者可在 passport.baidu.com/v2/?reg 處免費註冊獲取。

第二步 註冊成爲百度開放平臺開發者,讀者可進入 lbsyun.baidu.com/apicon-sole… 完成相關注冊。 該過程很是簡單,遵循引導整個過程在5分鐘內便可完成。

第三步 註冊完成以後,會有一個名爲「【百度地圖開放平臺】開發者激活郵件」的驗證連接發送到指定(註冊時郵箱)郵箱,點擊連接便可完成驗證。

第四步 點擊「申請祕鑰」進入建立應用界面,在該應用建立中,我 們主要使用Geocoding API v2,其餘應用服務根據實際需求勾選。IP白名單區域,若是不作限制,請設置爲「0.0.0.0/0」。設置完成後,點擊提 交。

第五步 得到AK祕鑰。完成上述步驟以後,會默認跳轉到應用列表界面,界面中的「訪問應用(AK)」即是該應用的祕鑰。

5.1 獲取並解析XML數據

咱們先經過Python請求該API來得到JSON格式的數據。本示例的目標是經過給百度API發送一條地理位置數據,返回其經緯度信息。 本節會用到Python第三方庫requests,讀者須要先經過pip install requests進行安裝。完整代碼以下:

import requests # 導入庫 
add = '廣州市天河區正佳廣場' # 定義地址 
ak = 'DdOyOKo0VZBgdDFQnyhINKYDGkzBkuQr' # 建立訪問應用時得到的AK 
url = 'http://api.map.baidu.com/geocoder/v2/?address=%s&output=xml&ak=%s' # 請求URL 
res = requests.get(url % (add, ak)) # 得到返回請求 
add_info = res.text # 返回文本信息 
print (add_info) # 打印輸出
複製代碼

結果

<?xml version="1.0" encoding="utf-8"?>
<GeocoderSearchResponse>
	<status>0</status>
	<result>
		<location>
			<lng>113.333581818</lng>
			<lat>23.1383236194</lat>
		</location>
		<precise>1</precise>
		<confidence>80</confidence>
		<comprehension>100</comprehension>
		<level>購物</level>
	</result>
</GeocoderSearchResponse>
複製代碼

接着咱們經過引入一個XML格式化處理庫來從中提取經緯度信息。

# 設置字符編碼爲utf-8 
import importlib
importlib.reload(sys)
import xml.etree.ElementTree as Etree # 導入XML中的ElementTree方法 
root = Etree.fromstring(add_info) # 得到XML的根節點 
lng = root[1][0][0].text # 得到lng數據 
lat = root[1][0][1].text # 得到lat數據 
print ('lng: %s' % lng) # 格式化打印輸出 
print ('lat: %s' % lat) # 格式化打印輸出
複製代碼

結果

lng: 113.333581818
lat: 23.1383236194
複製代碼

5.2 獲取並解析JSON數據

import requests # 導入庫 
add = '廣州市天河區正佳廣場' # 定義地址 
ak = 'DdOyOKo0VZBgdDFQnyhINKYDGkzBkuQr' # 建立訪問應用時得到的AK 
url = 'http://api.map.baidu.com/geocoder/v2/?address=%s&output=json&ak=%s' # 請求URL 
res = requests.get(url % (add, ak)) # 得到返回請求 
add_info = res.text # 返回文本信息 
print (add_info) # 打印輸出
複製代碼

結果

{"status":0,"result":{"location":{"lng":113.33358181846966,"lat":23.138323619365097},"precise":1,"confidence":80,"comprehension":100,"level":"購物"}}
複製代碼

該結果能夠經過JSON進行格式化處理

import json # 導入庫 
add_json = json.loads(add_info) # 加載JSON字符串對象 
lat_lng = add_json['result']['location'] # 得到經緯度信息 
print (lat_lng) # 打印輸出
複製代碼

結果

{'lng': 113.33358181846965, 'lat': 23.138323619365096}
複製代碼

有關百度API的更多信息,具體查閱

lbsyun.baidu.com/index.php?t…

在API應用中,中文的編碼處理因細節太多而經常讓人頭疼。所以,若是能夠則應儘可能減小直接在API的數據中出現中文字符。在實際企業應用中,會出現多種API形式,但不管哪一種形式,其基本實現思路 都是一致的:導入庫→定義請求變量→發送請求→得到返回數據→格式化並得到目標數據,所以須要掌握JSON和XML的數據與其餘數據的轉換方法。

6、讀取非結構化網頁、文本、圖像、視頻、語音

6.1 讀取非結構化網頁

舉個簡單的例子

import requests  # 導入庫
url = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=python&oq=python'  # 定義要抓取的網頁地址
res = requests.get(url)  # 得到返回請求
html = res.text  # 返回文本信息
print(html)  # 打印輸出網頁源代碼
複製代碼

想進階的朋友看Scrapy爬取網頁教程:www.imooc.com/learn/1017

6.2 讀取非結構化文本

非結構化的文本數據指的是文本數據中沒有結構化的格式,須要定製化解析才能獲取數據,而且每條記錄的字段也可能存在差別,這意味 着傳統的結構化讀取方式很難工做。非結構化的日誌就是一個典型示例,服務器的日誌可由運維工程師自行定義,所以不一樣公司的日誌格式有所不一樣;另外在網站日誌中還可能包含經過頁面「埋碼」的方式而採集來的用戶行爲數據,這些都會使日誌面臨非結構化的解析問題。

file = 'file_log'
fn = open(file, 'r')  # 打開要讀取的日誌文件對象
content = fn.readlines()  # 以列表形式讀取日誌數據
print(content[:2])
fn.close()  # 關閉文件對象
複製代碼

其實日誌文件只是普通文本文件中的一種類型而已,其餘的非結構化數據文件均可以以相似的方法讀取,即便文件沒有任何擴展名。 對於非結構化的文本處理,一般更多地側重於特定場景,通用性較差,緣由就在於非結構化的形式自己變化多樣。天然語言理解、文本處 理和挖掘、用戶日誌和機器日誌解析等都是該領域中的主要工做。

6.3 讀取圖像數據

Python讀取圖像一般使用PIL和OpenCV兩個庫,相對而言,筆者使用後者的狀況更多。

OpenCV教程:juejin.im/post/5afd25…

import cv2
# 一、文件的讀取 二、封裝格式解析 三、數據解碼 四、數據加載
img = cv2.imread('canton.jpg',1)
cv2.imshow('image',img)
# jpg png 一、文件頭 二、文件數據
cv2.waitKey (0)
# waitKey(0),以毫秒爲單位延遲。0是指「永遠」的特殊值
複製代碼

6.4 讀取視頻數據

Python讀取視頻最經常使用的庫也是OpenCV。

import cv2  # 導入庫

cap = cv2.VideoCapture("test.avi")  # 得到視頻對象
status = cap.isOpened()  # 判斷文件知否正確打開


# 輸出基本屬性
if status:  # 若是正確打開,則得到視頻的屬性信息
    frame_width = cap.get(3)  # 得到幀寬度
    frame_height = cap.get(4)  # 得到幀高度
    frame_count = cap.get(7)  # 得到總幀數
    frame_fps = cap.get(5)  # 得到幀速率
    print('frame width: ', frame_width)  # 打印輸出
    print('frame height: ', frame_height)  # 打印輸出
    print('frame count: ', frame_count)  # 打印輸出
    print('frame fps: ', frame_fps)  # 打印輸出

# 讀取視頻內容並展現視頻
success, frame = cap.read()  # 讀取視頻第一幀
while success:  # 若是讀取狀態爲True
    cv2.imshow('vidoe frame', frame)  # 展現幀圖像
    success, frame = cap.read()  # 獲取下一幀
    k = cv2.waitKey(int(1000 / frame_fps))  # 每次幀播放延遲必定時間,同時等待輸入指令
    if k == 27:  # 若是等待期間檢測到按鍵ESC
        break  # 退出循環

# 操做結束釋放全部對象
cv2.destroyAllWindows()  # 關閉全部窗口
cap.release()  # 釋放視頻文件對象
複製代碼

6.5 讀取語音數據

對於語音文件的讀取,可使用Python的audioop、aifc、wav等庫實現。但針對語音處理這一細分領域,當前市場上已經具有很是成熟的 解決方案,例如科大訊飛、百度語音等,大多數狀況下,咱們會經過調用其API實現語音分析處理,或者做爲分析處理前的預處理。

以百度語音API服務應用爲例,說明如何經過請求百度語音的API,將語音數據轉換爲文字信息。

申請百度語音API教程:jingyan.baidu.com/article/f3e…

# 導入庫
import json  # 用來轉換JSON字符串
import base64  # 用來作語音文件的Base64編碼
import requests  # 用來發送服務器請求

# 得到token
API_Key = 'DdOyOKo0VZBgdDFQnyhINKYDGkzBkuQr'  # 從申請應用的key信息中得到
Secret_Key = 'oiIboc5uLLUmUMPws3m0LUwb00HQidPx'  # 從申請應用的key信息中得到
token_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s"  # 得到token的地址
res = requests.get(token_url % (API_Key, Secret_Key))  # 發送請求
res_text = res.text  # 得到請求中的文字信息
token = json.loads(res_text)['access_token']  # 提取token信息

# 定義要發送的語音
voice_file = 'baidu_voice_test.pcm'  # 要識別的語音文件
voice_fn = open(voice_file, 'rb')  # 以二進制的方式打開文件
org_voice_data = voice_fn.read()  # 讀取文件內容
org_voice_len = len(org_voice_data)  # 得到文件長度
base64_voice_data = base64.b64encode(org_voice_data).decode('utf-8')  # 將語音內容轉換爲base64編碼格式

# 發送信息
# 定義要發送的數據主體信息
headers = {'content-type': 'application/json'}  # 定義header信息
payload = {
    'format': 'pcm',  # 以具體要識別的語音擴展名爲準
    'rate': 8000,  # 支持8000或16000兩種採樣率
    'channel': 1,  # 固定值,單聲道
    'token': token,  # 上述獲取的token
    'cuid': 'B8-76-3F-41-3E-2B',  # 本機的MAC地址或設備惟一識別標誌
    'len': org_voice_len,  # 上述獲取的原始文件內容長度
    'speech': base64_voice_data  # 轉碼後的語音數據
}
data = json.dumps(payload)  # 將數據轉換爲JSON格式
vop_url = 'http://vop.baidu.com/server_api'  # 語音識別的API
voice_res = requests.post(vop_url, data=data, headers=headers)  # 發送語音識別請求
api_data = voice_res.text  # 得到語音識別文字返回結果
text_data = json.loads(api_data)['result']
print(api_data)  # 打印輸出總體返回結果
print(text_data)  # 打印輸出語音識別的文字
複製代碼
相關文章
相關標籤/搜索