小白學爬蟲(四)– 資料提取之json

小白學爬蟲(四)– 資料提取之json
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

前言

前面兩篇文章介紹瞭如何獲取一個響應,但是響應都不是我們直接需要的資料,而是一些html頁面或者json字串。這篇文章主要介紹如何從返回的響應中提取需要的內容。

json

什麼是 JSON ?

  • JSON 指的是 JavaScript 物件表示法(JavaScript Object Notation)
  • JSON 是輕量級的文字資料交換格式
  • JSON 獨立於語言:JSON 使用 Javascript語法來描述資料物件,但是 JSON 仍然獨立於語言和平臺。JSON 解析器和 JSON 庫支援許多不同的程式語言。 目前非常多的動態(PHP,JSP,.NET)程式語言都支援JSON。
  • JSON 具有自我描述性,更易理解

上面這個是菜鳥教程裡面json的解釋。其實json就是一種資料交換格式,資料交換(Data Switching)是指在多個資料終端裝置(DTE)之間,為任意兩個終端裝置建立資料通訊臨時互連通路的過程。而json就是資料交換的一種格式或者說一種協議。

json格式

  • 資料在名稱/值對中
  • 資料由逗號分隔
  • 大括號儲存物件
  • 中括號儲存陣列

比如:

{
"sites": [
{ "name":"菜鳥教程" , "url":"www.runoob.com" }, 
{ "name":"google" , "url":"www.google.com" }, 
{ "name":"微博" , "url":"www.weibo.com" }
]
}

利用json提取資料

以百度翻譯為例

import requests
url = "http://fanyi.baidu.com/basetrans"
query_string = {"query":"一個人並不是生來就要給打敗的,你儘可以消滅它,但就是打不敗它",
"from":"zh",
"to":"en",}
m_headers = {
"User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Mobile Safari/537.36"
}
reponse = requests.post(url,data = query_string,headers = m_headers)
print(reponse)  
print(reponse.content.decode())     

執行結果如下:

{"errno":0,"from":"zh","to":"en","trans":[{"dst":"A man is not born to defeat. You can destroy it, but you can not defeat it.","prefixWrap":0,"src":"\u4e00\u4e2a\u4eba\u5e76\u4e0d\u662f\u751f\u6765\u5c31\u8981\u7ed9\u6253\u8d25\u7684\uff0c\u4f60\u5c3d\u53ef\u4ee5\u6d88\u706d\u5b83\uff0c\u4f46\u5c31\u662f\u6253\u4e0d\u8d25\u5b83","relation":[],"result":[[0,"A man is not born to defeat. You can destroy it, but you can not defeat it.",["0|90"],[],["0|90"],["0|75"]]]}],"dict":[],"keywords":[{"means":["one"],"word":"\u4e00\u4e2a\u4eba"},{"means":["isn't","fault","blame","ain't","an't"],"word":"\u4e0d\u662f"},{"means":["have an instinct for"],"word":"\u751f\u6765\u5c31"},{"means":["beat","defeat","suffer a defeat","be defeated","vanquish"],"word":"\u6253\u8d25"},{"means":["can","may","passable","pretty good","Ok"],"word":"\u53ef\u4ee5"},{"means":["eliminate","perish","die out","annihilate","cut the throat of"],"word":"\u6d88\u706d"},{"means":["quite right","exactly","even if","even","namely"],"word":"\u5c31\u662f"},{"means":["unbeaten","undefeated","invincible"],"word":"\u4e0d\u8d25"}]}

容易看出上面這個是一個json格式的資料。

現在要做的就是從這個裡面提取需要的資料,就是這句:”A man is not born to defeat. You can destroy it, but you can not defeat it”。這句話在”trans”這個鍵對應的陣列值裡面。首先利用json.loads() 方法將json格式的字串轉換成python格式,然後再進行提取。最後將所得值儲存在一個檔案裡面。完整程式碼如下:

import requests
# 匯入json, 不需要安裝
import json
url = "http://fanyi.baidu.com/basetrans"
query_string = {"query":"一個人並不是生來就要給打敗的,你儘可以消滅它,但就是打不敗它",
"from":"zh",
"to":"en",
}
# 使用header   
m_headers = {
"User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Mobile Safari/537.36"
#"Referer": "http://fanyi.baidu.com/?aldtype=16047"
}
# 獲取響應
reponse = requests.post(url,data = query_string,headers = m_headers)
# 使用json.loads將json型別的字串轉化為python型別
python_str = json.loads(reponse.content.decode())
# 獲取需要的內容
string = python_str["trans"][0]["dst"]
# 儲存在trans.txt裡面
with open("trans.txt", "w", encoding="utf-8") as f:
f.write(string)

最後結果就是:
這裡寫圖片描述

另外 如果要最後儲存的資料為json型別,那麼可以利用 json.dumps() 方法將pyton型別轉化為json型別。這個方法有兩個引數,

  • ensure_ascii = False:表示最後的結果不用ascii顯示出來,如果是中文還是中文
  • indent = 2:表示下一行在上一行的基礎上空兩格
json.dumps(json_str, ensure_ascii=False, indent=2)

什麼地方會返回json資料?

一般將瀏覽器切換到手機版或者使用抓包app的時候返回的資料格式為 json

相關文章

程式語言 最新文章