使用mysql記錄從url返回的http GET請求數據操作
業務場景需求及實現邏輯分析
在業務中,我們經常會碰到需要用HTTP GET請求數據的情況,比如http請求返回的結果如下所示:
那麼,如果我們想將這些數據用mysql存儲下來,那該怎麼實現呢?
其實,調用python的httplib和MySQLdb包將會非常容易實現,httplib負責獲取url的返回,MySQLdb負責對MySQL數據庫進行操作。下面整理瞭關系邏輯圖:
那麼,我們開始代碼開發:
python依賴包準備
python需要用到的包至少有如下幾個,其中MySQLdb依賴包的安裝可以參考python安裝mysql的依賴包mysql-python
# 此為python文本編輯器界面 #!/usr/bin/python # coding=utf-8 import httplib import json import time import MySQLdb
用httplib獲取url請求返回
httplib包支持如下的一些方法和函數:
url = "http://www.testtesttest.com/mobile/kit?token=yyyyyyyyy&key=tttttt&size=1" #具體的url鏈接 conn = httplib.HTTPConnection("www.testtesttest.com") conn.request(method="GET", url=url) #指定GET方法,以及url對象 response = conn.getresponse() #創建response對象 res = response.read() #讀取url返回的內容 # 使用json.loads方法將json解碼為python對象 json_repose = json.loads(res) data = json_repose['data']
此時,http請求返回的所有信息都存在瞭對象res中,因為請求返回的是json字符串,上面我們采用瞭json.loads方法來解析。
可以留意到,最終我們將請求返回的json內容,都存到瞭python的對象中裡,而一旦將數據轉為數組或者元組等形式儲存,我們就可以用python自帶的函數對其進行解析或者其他操作瞭。
用python解析url請求返回的json
# 這裡我們定義瞭一個函數用於解析json def data_list_analyze(i): data_dict = data[i] status = data_dict['status'] devi_id = data_dict['devi_id'] update_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(data_dict['update_time'])) actived_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(data_dict['actived_time'])) return devi_id, imei, device_type, actived_time
python連接數據庫並寫入數據
接下來是數據庫的連接示例:
# 打開數據庫連接,指定數據庫ip、用戶名、密碼、連接的庫名 db = MySQLdb.connect("192.168.xxx.xxx", "db_user", "db_password", "db_database", charset='utf8') # 使用cursor()方法獲取操作遊標 cursor = db.cursor() # 建表sql語句 sql = """create table if not exists `gergsmart_list`( `devi_id` varchar(255) NOT NULL COMMENT 'IMEI, //硬件設備 IMEI', `imei` varchar(255) COMMENT 'ICCID,//硬件設備 SIM卡', `device_type` varchar(255) COMMENT '設備類型', `actived_time` datetime COMMENT '⾸次激活時間', PRIMARY KEY(`devi_id`) )ENGINE=INNODB DEFAULT CHARSET=utf8; """ # 使用execute方法執行SQL語句,建表 cursor.execute(sql) # 插入數據sql語句 insert_sql = "insert into `gergsmart_list` \ (devi_id,imei,device_type,actived_time) \ values (%s, %s, %s, %s,)"
從上面可以留意到,我們可以將python解析得到的對象devi_id、imei、device_type、actived_time,放入瞭mysql的插入語句中去,這樣我們就實現瞭“從url獲取數據,存到python對象中,再將python對象插入到mysql的記錄中”這樣的操作瞭。
總結,其實我們可以將python看作為一個中轉器,接收url請求返回,並寫入MySQL。而其中httplib負責瞭接收操作,MySQLdb負責瞭寫入操作。
補充:mysql請求超時!延伸拓展至get post請求的區別是什麼,超詳細!一篇足矣解決所有!!
將數據庫的連接地址從127.0.0.1改為localhost即可!親測有效!!
查閱瞭很多的資料,歸納總結瞭get請求和post請求的區別
做瞭以下總結:
眾所周知的是get請求的參數是直接暴露在url上面,安全性較低。post請求的參數是存放在body裡面夾帶過去,安全性較高一點。接下來我們看看稍微全面一點的解釋
我們先看一下前輩們的解釋
一、get和post請求的區別是什麼:
get是從服務器上獲取數據,post是向服務器傳送數據。
get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到。post是通過HTTPpost機制,將表單內各個字段與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。
對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據。
get傳送的數據量較小,不能大於2KB。post傳送的數據量較大,一般被默認為不受限制。但理論上,IIS4中最大量為80KB,IIS5中為100KB。
get安全性非常低,post安全性較高。
GET 請求可被緩存 POST 請求不會被緩存
GET 請求保留在瀏覽器歷史記錄中 POST 請求不會保留在瀏覽器歷史記錄中
GET 請求可被收藏為書簽 POST 不能被收藏為書簽
GET請求隻能進行url編碼(application/x-www-form-urlencoded)POST支持多種編碼方式(application/x-www-form-urlencoded 或 multipart/form-data。為二進制數據使用多重編碼。)
最直觀的區別就是GET把參數包含在URL中,POST通過request body傳遞參數。
接下來參考一下官方的說法是什麼:
二、在w3schools中也對二者進行瞭區分給出瞭官方的答案
GET在瀏覽器回退時是無害的,而POST會再次提交請求。
GET產生的URL地址可以被Bookmark,而POST不可以。
GET請求會被瀏覽器主動cache,而POST不會,除非手動設置。
GET請求隻能進行url編碼,而POST支持多種編碼方式。
GET請求參數會被完整保留在瀏覽器歷史記錄裡,而POST中的參數不會被保留。
GET請求在URL中傳送的參數是有長度限制的,而POST麼有。
對參數的數據類型,GET隻接受ASCII字符,而POST沒有限制。
GET比POST更不安全,因為參數直接暴露在URL上,所以不能用來傳遞敏感信息。
GET參數通過URL傳遞,POST放在Request body中。
GET產生一個TCP數據包;POST產生兩個TCP數據包。
基於上述以及查閱的資料做一個總結
HTTP是基於TCP/IP的關於數據如何在萬維網中如何通信的協議。 HTTP的底層是TCP/IP。所以GET和POST的底層也是TCP/IP,也就是說,GET/POST都是TCP鏈接。GET和POST能做的事情是一樣一樣的。你要給GET加上request body,給POST帶上url參數,技術上是完全行的通的。
post請求和get請求都是HTTP的請求方式,本質上來說並無區別,底層實現都是基於TCP/IP協議。但是請求有各種各樣的方式,於是HTTP對請求方式進行瞭劃分和規定,於是產生瞭get、post處理請求的分工和區別。
此外還有搜索到另外一個區別:GET產生一個TCP數據包;POST產生兩個TCP數據包。對於GET方式的請求,瀏覽器會把http header和data一並發送出去,服務器響應200(返回數據);而對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok(返回數據)。
GET與POST都有自己的語義,不能隨便混用。
據研究,在網絡環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網絡環境差的情況下,兩次包的TCP在驗證數據包完整性上,有非常大的優點。
並不是所有瀏覽器都會在POST中發送兩次包,Firefox就隻發送一次。
綜述:
“GET方式提交的數據最多隻能是1024字節”,因為GET是通過URL提交數據,那麼GET可提交的數據量就跟URL的長度有直接關系瞭。而實際上,URL不存在參數上限的問題,HTTP協議規范沒有對URL長度進行限制。這個限制是特定的瀏覽器及服務器對它的限制。IE對URL長度的限制是2083字節(2K+35)。對於其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操作系統的支持。註意這是限制是整個URL長度,而不僅僅是你的參數值數據長度。
理論上講,POST是沒有大小限制的,HTTP協議規范也沒有進行大小限制,說“POST數據量存在80K/100K的大小限制”是不準確的,POST數據是沒有限制的,起限制作用的是服務器的處理程序的處理能力。對於ASP程序,Request對象處理每個表單域時存在100K的數據長度限制。但如果使用Request.BinaryRead則沒有這個限制。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- Python requests.post()方法中data和json參數的使用方法
- Java面試題沖刺第六天–網絡編程1
- Python爬蟲爬取全球疫情數據並存儲到mysql數據庫的步驟
- Python 批量操作設備的實現步驟
- python 利用百度API進行淘寶評論關鍵詞提取