爬蟲返回的Json數(shù)據(jù)怎么玩?一篇文章搞定!

1、Json是什么
JSON,全稱為JavaScript Object Notation
JSON是輕量級的文本數(shù)據(jù)存儲和交換格式,獨立于語言。(JSON使用JavaScript語法來描述數(shù)據(jù)對象,但是JSON仍然獨立于語言和平臺,JSON解析器和JSON庫支持許多不同的編程語言)
下面來看看Json數(shù)據(jù)到底長啥樣?
2、Json長啥樣
打開瀏覽器,輸入如下網(wǎng)址:“https://www.douban.com/j/search_photo?q=宋智孝”
你要問為啥是“宋智孝”,那你自己猜吧。
我們可以看到很清爽的 JSON 格式對象(是不是很像Python中的“字典”)
展示的形式是這樣的:
{
????"images":?[
????????{
????????????"src":?"https://img1.doubanio.com/view/photo/photo/public/p2185662697.webp",
????????????"author":?"蹦咕嚕霸會念經(jīng)",
????????????"url":?"https://www.douban.com/link2/?url=http%3A%2F%2Fwww.douban.com%2Fphotos%2Fphoto%2F2185662697%2F&query=%E5%AE%8B%E6%99%BA%E5%AD%9D&cat_id=1025&type=search",
????????????"id":?"2185662697",
????????????"title":?"有一種美叫做宋智孝",
????????????"width":?381,
????????????"height":?500
????????},
????????{
????????????"src":?"https://img1.doubanio.com/view/photo/photo/public/p2185662777.webp",
????????????"author":?"蹦咕嚕霸會念經(jīng)",
????????????"url":?"https://www.douban.com/link2/?url=http%3A%2F%2Fwww.douban.com%2Fphotos%2Fphoto%2F2185662777%2F&query=%E5%AE%8B%E6%99%BA%E5%AD%9D&cat_id=1025&type=search",
????????????"id":?"2185662777",
????????????"title":?"有一種美叫做宋智孝",
????????????"width":?452,
????????????"height":?600
????????}
????],
????"total":?2658,
????"limit":?20,
????"more":?true
}
數(shù)據(jù)被放到了 images 對象里,它是個數(shù)組的結(jié)構(gòu),每個數(shù)組的元素是個字典的類型。
src、author、url、id、title、width 和height 這些字段代表的含義分別是原圖片的地址、作者、發(fā)布地址、圖片 ID、標題、圖片寬度、圖片高度等信息。
json的格式本來就很清爽了,那我要想更加“清爽”的查看數(shù)據(jù)之間的層級關(guān)系,該怎么辦呢?
這時候就需要用到一個插(shen)件(qi)了。
JSON-handle(如圖)

解析之后的數(shù)據(jù)長這樣:

嗯,更清爽了!
3、在Python中玩轉(zhuǎn)Json
在 Python 中有 JSON 庫,可以讓我們將 Python 對象和 JSON 對象進行轉(zhuǎn)換,便于數(shù)據(jù)的解析。
在Json庫里有兩個方法:
json.dumps() 將Python對象(字符串)轉(zhuǎn)換成為Json對象(字典)
json.loads() 將Json對象轉(zhuǎn)換成為Python對象
下面這段代碼中,通過loads()函數(shù)把data從“json?string”轉(zhuǎn)化為“dict”;又通過dumps()函數(shù)把data從“dict”轉(zhuǎn)化為“json string”(折騰來、折騰去)
說白了就是一個“ 雙引號”的問題,把雙引號干掉,就是“dict”,放在python中就可以輕松的取到想要的節(jié)點數(shù)據(jù)。

代碼可通過網(wǎng)址查看:
https://tech.io/snippet/JqONpVh
4、實戰(zhàn)演練
打開瀏覽器,輸入如下網(wǎng)址:“https://www.douban.com/j/search_photo?q=宋智孝”,獲得的src字段為圖片的url地址。

我們要做的是把作者、原地址、標題保存為DataFrame,并存儲為csv文件,然后根據(jù)圖片的原地址把關(guān)于“宋智孝”的圖片全部下載下來。
數(shù)據(jù)保存的代碼:
利用request模塊獲取API的數(shù)據(jù)(記得加上headers,模擬瀏覽器的操作),然后把每一份數(shù)據(jù)存在“字典”里,再追加到“列表”中。
利用 pandas模塊,把數(shù)據(jù)轉(zhuǎn)為DataFrame,在保存為csv文件(注意中文亂碼的問題)
import?requests
import?pandas?as?pd
query?=?'宋智孝'
headers?=?{?"user-agent":?"Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?"
??????????????????????????"AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/83.0.4103.106?Safari/537.36"}
url?=?'https://www.douban.com/j/search_photo?q='?+?query
response?=?requests.get(url,?headers=headers).json()?#?得到返回結(jié)果
#?print(response)
result?=?[]
for?image?in?response['images']:????
????dict?=?{}
????dict["pic"]?=?image["src"]
????dict["author"]?=?image["author"]
????dict["title"]?=?image["title"]??
????result.append(dict)
????print(image['src'])??#?查看當前下載的圖片網(wǎng)址
????download(image['src'],?image['id'])??#?下載一張圖片
result_pd?=?pd.DataFrame(result)
result_pd.to_csv("result_pd.csv",encoding='utf_8_sig')下載圖片的代碼:
根據(jù)圖片的URL地址,把圖片下載到.py文件的同級目錄,命名為“str(i).jpg”
def?download(src,?id):
????dir?=?'./'?+?str(id)?+?'.jpg'
????try:
????????pic?=?requests.get(src,?headers=headers,?timeout=10)
????????#?print(pic)
????????with?open(dir,?"wb")?as?f:
????????????f.write(pic.content)
????except?requests.exceptions.ConnectionError:
????????print('圖片無法下載')
運行結(jié)果:
5、我是小結(jié)
JSON是輕量級的文本數(shù)據(jù)存儲和交換格式,獨立于語言,可以使用Json Handle插件來“一目了然”地查看Json數(shù)據(jù)的層級關(guān)系。
利用Json擴展庫,可以方便的把json數(shù)據(jù)轉(zhuǎn)為python數(shù)據(jù)類型,通過一個批量下載圖片的案例,介紹了Request庫與json數(shù)據(jù)的訪問。
希望這篇文章能幫助你在Python中更好地玩轉(zhuǎn)Json數(shù)據(jù)。

