網絡爬蟲-4:jsonpath+實戰

1.jsonpath
2.通過jsonpath實戰

一.Jasonpath核心符號

1)$:

  1. 含義:表示 JSON 文檔的根節點。

  2. 用法:所有 JSONPath 表達式都以?$?開頭,表示從根節點開始查詢。

{"store": {"book": [{"title": "Book 1", "price": 10},{"title": "Book 2", "price": 20}]}
}

$?表示整個 JSON 文檔。

2) . :

  • 含義:用于訪問對象的屬性。

  • 用法:通過點號?.?可以訪問對象的屬性。

$.store?表示獲取?store?對象。

$.store.book?表示獲取?store?對象中的?book?數組。

from jsonpath import jsonpath
data={"store": {"book": [{"title": "Book 1", "price": 10},{"title": "Book 2", "price": 20}]}
}
store=jsonpath(data,"$.store")
book = jsonpath(data,"$.store.book")
print(store)
print(book)
[{'book': [{'title': 'Book 1', 'price': 10}, {'title': 'Book 2', 'price': 20}]}]
[[{'title': 'Book 1', 'price': 10}, {'title': 'Book 2', 'price': 20}]]

3) [ ]:

  • 含義:用于訪問數組元素或對象的屬性(支持屬性名或索引)。

  • 用法

    • 訪問數組元素:[index]

    • 訪問對象屬性:['property']

$.store.book[0]?表示獲取?book?數組的第一個元素。

$['store']['book'][0]?也可以用于訪問屬性。

from jsonpath import jsonpath
data={"store": {"book": [{"title": "Book 1", "price": 10},{"title": "Book 2", "price": 20}]}
}
a = jsonpath(data,"$.store[book]")
b = jsonpath(data,"$[store][book][0]")
print(a)
print(b)
[[{'title': 'Book 1', 'price': 10}, {'title': 'Book 2', 'price': 20}]]
[{'title': 'Book 1', 'price': 10}]

4) .. :

  • 含義:遞歸下降,表示從當前節點開始遞歸搜索所有子節點。

  • 用法:用于查找 JSON 文檔中所有符合條件的節點。

$..title?表示在整個 JSON 文檔中查找所有?title?屬性。

$..book?表示查找所有?book?節點。

from jsonpath import jsonpath
data={"store": {"book": [{"title": "Book 1", "price": 10},{"title": "Book 2", "price": 20}]}
}
a = jsonpath(data,"$..title")
b = jsonpath(data,"$..book")
print(a)
print(b)
['Book 1', 'Book 2']
[[{'title': 'Book 1', 'price': 10}, {'title': 'Book 2', 'price': 20}]]

5)@:

  • 含義:在過濾器表達式中表示當前節點。

  • 用法:用于在??()?中引用當前節點。

$.store.book[?(@.price < 10)]?中的?@?表示當前?book?元素。

6)?():

  • 含義:過濾器表達式,用于根據條件篩選數據。

  • 用法:在??()?中編寫條件表達式,篩選符合條件的節點。

$.store.book[?(@.price < 10)]?表示獲取?book?數組中價格小于 10 的所有元素。

$.store.book[?(@.category == 'fiction')]?表示獲取?category?為?fiction?的書籍。

二.實戰

當網頁返回的源代碼為json格式時,使用JSONPATH進行網頁爬取

1.通過判斷,騰訊網?為異步加載,所以要查看Fetch/XHR

2.在通過jsonpath獲取想要的信息部分

import requests
from jsonpath import jsonpath
import random
def get_data(url,headers,payload):response = requests.post(url, headers=headers,json=payload)if response.status_code == 200:html_data = response.json()return html_dataelse:print("請求代碼:",response.status_code)def parse_json(html_data):titles = jsonpath(html_data,'$.data..title')times = jsonpath(html_data,'$..publish_time')hrefs = jsonpath(html_data,'$..link_info[url]')for title,time,href in zip(titles,times,hrefs):print("新聞標題:",title)print("發布時間:",time)print("新聞鏈接:",href)if __name__ == '__main__':url="https://i.news.qq.com/web_feed/getHotModuleList"USER_AGENTS = ["Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)","Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)","Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)","Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)"]headers = {"user-agent": random.choice(USER_AGENTS),"cookie": "你的cookies"}payload={"你的瀏覽器requests payload"}html_data = get_data(url,headers,payload)parse_json(html_data)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/74326.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/74326.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/74326.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GD32 ARM單片機開發規范檢查清單 GD32嵌入式C代碼檢查清單

GD32 ARM單片機開發規范檢查清單 以下檢查清單基于您的編程規范制定&#xff0c;可用于代碼審查和自檢過程。通過逐項檢查&#xff0c;確保代碼符合項目規范要求。 #mermaid-svg-Ye0FEIS4ZoXDXqaH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:…

求職招聘網站源碼,找工作招工系統,支持H5和各種小程序

招聘找活招工平臺系統源碼 招聘求職找工作軟件 發布信息積分充值招聘系統,里面帶纖細教程 功能介紹: 招工小程序主要針對工地招工工人找工作,工地可以發布招工信息,工人可以發布找活信息,招工信息可以置頂,置頂需要積分,積分可以通過簽到、分享邀請好友、充值獲取,后…

《Oracle DBA入門實戰:十大高頻問題詳解與避坑指南》

Oracle DBA 入門作業十問十答 本文為 Oracle DBA 入門作業整理&#xff0c;涵蓋工具使用、配置管理及權限控制等核心知識點&#xff0c;適合新手快速上手。 如有疑問或補充&#xff0c;歡迎評論區交流&#xff01; 1. DBA 常用工具有哪些&#xff1f; Oracle Universal Instal…

解決用戶同時登錄輪詢獲取用戶信息錯亂,使用WebSocket和Server-Sent Events (SSE)

為什么更推薦WebSocket Server-Sent Events (SSE) 是一種服務器向客戶端推送數據的單向通信協議&#xff0c;適合某些場景&#xff0c;在解決用戶同時登錄和實時獲取用戶信息的問題上&#xff0c;WebSocket 是更好的選擇。 1. SSE 的局限性 單向通信 SSE 是單向的&#xff0…

發票查驗/發票驗真如何用Java實現接口調用

一、什么是發票查驗&#xff1f;發票驗真接口&#xff1f; 輸入發票基本信息發票代碼、發票號碼、開票日期、校驗碼后6位、不含稅金額、含稅金額&#xff0c;核驗發票真偽。 該接口也適用于機動車、二手車銷售發票、航空運輸電子客票、鐵路電子客票等。 二、如何用Java實現接口…

html5-qrcode前端打開攝像頭掃描二維碼功能

實現的效果如圖所示&#xff0c;全屏打開并且掃描到二維碼后彈窗提醒&#xff0c;主要就是使用html5-qrcode這個依賴庫&#xff0c;html5-qrcode開源地址&#xff1a;GitHub - mebjas/html5-qrcode: A cross platform HTML5 QR code reader. See end to end implementation at:…

cpp-友元

理解 C 中的友元&#xff08;Friend&#xff09; 在 C 語言中&#xff0c;封裝&#xff08;Encapsulation&#xff09; 是面向對象編程的重要特性之一。它允許類將數據隱藏在私有&#xff08;private&#xff09;或受保護&#xff08;protected&#xff09;成員中&#xff0c;…

JavaWeb基礎-HTTP協議、請求協議、響應協議

一. HTTP協議 1. HTTP協議&#xff1a;Hyper Text Transfer Protocol&#xff0c;超文本傳輸協議&#xff0c;規定了瀏覽器和服務器之間數據傳輸的規則 2. HTTP協議特點&#xff1a; ① 基于TCP協議&#xff1a;面向鏈接&#xff0c;安全 ② 基于請求-響應模型的&#xff1a;一…

search_fields與filterset_fields的使用

在Django中&#xff0c;search_fields 和 filterset_fields 可以在視圖類中使用&#xff0c;尤其是在 Django REST Framework (DRF) 中。它們分別用于實現搜索和過濾功能。以下是它們在視圖類中的具體使用方法。 1. search_fields 在視圖類中的使用 search_fields 是 DRF 中 S…

數據建模流程: 概念模型>>邏輯模型>>物理模型

數據建模流程 概念模型 概念模型是一種高層次的數據模型&#xff0c;用于描述系統中的關鍵業務概念及其之間的關系。它主要關注業務需求和數據需求&#xff0c;而不涉及具體的技術實現細節。概念模型通常用于在項目初期幫助業務人員和技術人員達成共識&#xff0c;確保對業務需…

在 Ubuntu 中用 Docker 安裝 RAGFlow

一、安裝 1.前提條件 CPU > 4 核 RAM > 16 GB Disk > 50 GB Docker > 24.0.0 & Docker Compose > v2.26.1 安裝docker&#xff1a;在Ubuntu中安裝Docker并配置國內鏡像 2.設置 vm.max_map_count #設置 vm.max_map_count 不小于 262144# 查看 sysctl vm.…

Java隨機生成n位驗證碼

Java學習筆記 今天寫一個隨機生成n位的驗證碼&#xff0c;包含字母大小寫和數字&#xff0c;直接見代碼。 package com.itheima.hello;// 生成一個隨機位數的驗證碼 public class ScannerDemo1 {public static void main(String[] args){System.out.println(getCode(4));Syst…

go復習目錄

全部都是博主的學習筆記&#xff0c;放著鏈接用的&#xff0c;自己收藏&#xff0c;包含基礎內容、go三方包、vue、數據結構、web框架、設計模式、docker、go連接kafka、redis、grpc、中間件 文章目錄 基礎內容go三方包vue數據結構web框架設計模式dockergo連接kafkaredisgrpc中…

23種設計模式-創建型模式-抽象工廠

文章目錄 簡介場景問題1. 風格一致性失控2. 對象創建硬編碼3. 產品族管理失效 解決總結 簡介 抽象工廠是一種創建型設計模式&#xff0c;可以生成相關對象系列&#xff0c;而無需指定它們的具體類。 場景 假設你正在寫一個家具店模擬器。 你的代碼這些類組成&#xff1a; 相…

案例:網絡命名空間模擬隔離主機場景

場景描述 假設我們需要在同一臺物理機上模擬兩臺獨立的主機&#xff08;Host A 和 Host B&#xff09;&#xff0c;它們分別位于不同的網絡命名空間中&#xff0c;并通過虛擬以太網對&#xff08;veth pair&#xff09;進行通信。目標是展示網絡命名空間的隔離性和跨命名空間的…

新聞發布時間抽取(二)

1. 再論抽取方法 在前一期實驗中&#xff0c;對gne組件進行分析和完善&#xff0c;對三種時間抽取的方法進行了實驗對比。 在對抽取結果進行個例分析的過程中&#xff0c;我發現此前實驗存在幾個問題&#xff1a; 抽取的1000篇新聞存在一定的重復&#xff0c;經過ID去重大約減…

算法基礎——棧

一、棧的概念 棧是?種只允許在?端進?數據插?和刪除操作的線性表。 進?數據插?或刪除的?端稱為棧頂&#xff0c;另?端稱為棧底。不含元素的棧稱為空棧。進棧就是往棧中放?元素&#xff0c;出棧就是將元素彈出棧頂。 二、棧的模擬實現 1. 創建 本質還是線性表&#…

Android11至15系統定制篇

Android 11至15系統定制核心要點解析 一、Android 11關鍵定制特性 ?分區存儲強制化? 公共目錄&#xff08;如Downloads、Pictures&#xff09;與應用專屬目錄分離&#xff0c;應用更新后無法通過requestLegacyExternalStorage繞過限制?1。需申請MANAGE_EXTERNAL_STORAGE權限…

macOS 使用 enca 識別 文件編碼類型(比 file 命令準確)

文章目錄 macOS 上安裝 enca基本使用起因 - iconv關于 enca安裝 Encaenca & enconv 其它用法 macOS 上安裝 enca brew install enca基本使用 enca filepath.txt示例 $ enca 動態規劃算法.txt [0] Simplified Chinese National Standard; GB2312CRLF line terminat…

線段樹與掃描線 —— 詳解算法思想及其C++實現

目錄 一、線段樹&#xff08;Segment Tree&#xff09; 基本概念 結構 操作 示例代碼 二、掃描線&#xff08;Sweep Line&#xff09; 基本概念 應用場景 示例代碼&#xff08;矩形面積并集&#xff09; 三、總結 一、線段樹&#xff08;Segment Tree&#xff09; 基本…