
文章插圖
在爬蟲開發(fā)的過程中,我們經常遇到一些 Ajax 加載的接口會返回 JSON 數(shù)據(jù) 。如下圖所示,是 Twitter 的用戶時間線接口,返回了一段3000多行的深層嵌套 JSON:
其中的cursor這個字段,是請求下一頁的必要字段,我必須把它的 value 值讀取出來,拼接到請求 URL 中,才能請求下一頁的內容 。
現(xiàn)在問題來了,cursor字段在這個 JSON 里面的哪個位置?從最外層開始,我應該怎么樣才能讀取到最里面的這個cursor中的value字段的值?
我知道已經有一些第三方庫可以直接根據(jù)字段名讀取 JSON 內部任意深度的值,不過用別人的東西總沒有自己寫一個輪子來得過癮 。所以今天我們自己來手寫一個模塊,我把他叫做JsonPathFinder,傳入一個 JSON 字符串和需要讀取的字段名,返回從最外層開始直到這個字段的路徑 。
效果演示我們用 Python 之父龜叔的 Twitter 時間線來作為演示,運行以后,效果如下圖所示:
可以看到,從最外層開始一路讀到cursor字段,需要經過非常多的字段名,對應到 JSON 中,如下圖所示:
由于entries 字段列表中一共有20個元素,所以這里的18、19實際上對應了倒數(shù)第二條和倒數(shù)第一條數(shù)據(jù) 。其中,倒數(shù)第二條的 cursor 對應的是本頁第一條推文,而倒數(shù)第一條對應的是本頁最后一條推文 。所以當我們要往后翻頁的時候,應該用的是倒數(shù)第一條的 cursor 。
我們試著來讀取一下結果:
非常輕松地獲取到了數(shù)據(jù) 。不需要再肉眼在 JSON 中尋找字段了 。
原理分析JsonPathFinder 的原理并不復雜,全部代碼加上空行,一共只有32行,如下圖所示:
因為一個字段在 JSON 中可能出現(xiàn)很多次,所以find_one方法返回從外層到目標字段的第一條路徑 。而find_all方法返回從外層到目標字段的所有路徑 。
而核心算法,就是iter_node方法 。在把 JSON 字符串轉成 Python 的字典或者列表以后,這個方法使用深度優(yōu)先遍歷整個數(shù)據(jù),記錄它走過的每一個字段,如果遇到列表就把列表的索引作為 Key 。直到遍歷到目標字段,或者某個字段的值不是列表也不是字典時結束本條路徑,繼續(xù)遍歷下個節(jié)點 。
代碼第10-15行,分別對列表和字典進行處理 。對于字典來說,我們分離 key 和 value,寫作:
forkey,valueinxxx.items():...對于列表,我們分離索引和元素,寫作:
forindex,elementinenumerate(xxx):...所以如在第11和第13行,使用生成器推導式分別處理字典和列表,這樣得到的key_value_iter生成器對象,就可以在第16行被相同的 for 循環(huán)迭代 。
我們知道,在 Python 里面可以迭代的對象除了字典和列表以外,還有很多其他的對象,不過我這里只處理了字典和列表 。大家也可以試一試修改10-15行的條件判斷,增加對其他可迭代對象的處理邏輯 。
代碼第16-22行,對處理以后的 key-value 進行迭代 。首先記錄到當前字段為止的迭代路徑到current_path列表中 。然后判斷當前字段是不是目標字段 。如果是,那么把當前的路徑通過 yield 拋出來 。如果當前路徑的值是列表或者字典,那么把這個值遞歸傳入 iter_node 方法,進一步檢查內部還有沒有目標字段 。需要注意的是,無論當前字段是不是目標字段,只要它的值是列表或者字典,都需要繼續(xù)迭代 。因為即使當前字段的名字是目標字段,但也許它內部還有某個子孫字段的字段名也是目標字段名 。
對于普通函數(shù)來說,要遞歸調用,直接return 當前函數(shù)(參數(shù))就可以了 。但是對于生成器來說,要遞歸調用,就需要使用yield from 當前函數(shù)名(參數(shù)) 。
以上關于本文的內容,僅作參考!溫馨提示:如遇健康、疾病相關的問題,請您及時就醫(yī)或請專業(yè)人士給予相關指導!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內容,希望對您有所幫助:- 虛擬主機和云服務器的區(qū)別 虛擬主機的配置怎么選擇
- 可以發(fā)外鏈的平臺推薦 seo外鏈怎么發(fā)布
- 桶裝水桶里面的青苔怎么洗
- 產品防護的目的及意義 產品防護包括哪些內容
- js同步和異步的理解 js同步和異步的區(qū)別是什么
- 獲取管理員權限win10的步驟 win10提升管理員權限的方法
- python貪吃蛇最簡單代碼 python的idle怎么用
- 申請加入電商平臺的條件 電商入駐條件
- 蘋果電腦雙系統(tǒng)的好處 蘋果電腦裝雙系統(tǒng)利弊
- 以太網(wǎng)沒有有效的ip配置怎么解決 以太網(wǎng)沒有有效的ip配置
