Python【Network/XHR/json】


#####################################################################

制定一個目標(爬取周傑倫的歌曲清單);

根據目標,確認一個方案(爬取QQ音樂);

帶着方案,去分析它的網站結構;最后去寫代碼

#####################################################################

什么是Network

 

 

調用“檢查”(ctrl+shift+i)工具,然后點擊Network

 

記錄在當前頁面上發生的所有請求。

現在看上去好像空空如也的樣子,這是因為Network記錄的是實時網絡請求。

現在網頁都已經加載完成,所以不會有東西。

 

點擊一下刷新,瀏覽器會重新訪問網絡,這樣就會有記錄

 

瀏覽器總是在向服務器,發起各式各樣的請求。

當這些請求完成,它們會一起組成我們在Elements中看到的網頁源代碼

 

一般來說,都是這種第0個請求先啟動了

其他的請求才會關聯啟動,一點點地將網頁給填充起來

 

也有一些網頁,直接把所有的關鍵信息都放在第0個請求里

 

方法:

先找到哪一個請求當中。再用requests庫,去模擬這個請求

+++++++++++++++++++++++++++++++++++++++++++++++++++++

Network怎么用

 

第一行

ALL(查看全部)/XHR(僅查看XHR,我們等會重點講它)/Doc(Document,第0個請求一般在這里),

有時候也會看看:Img(僅查看圖片)/Media(僅查看媒體文件)/Other(其他)。

最后,JS和CSS,則是前端代碼,負責發起請求和頁面實現;Font是文字的字體;

而理解WS和Manifest,需要網絡編程的知識,倘若不是專門做這個,你不需要了解

 

第二行

是一個時間軸。記錄什么時間,有哪些請求

 

第三行

統計:有多少個請求,一共多大,花了多長時間

############################################################

什么是XHR?

把鼠標在XHR上懸停,你可以看到它的完整表述是XHR and Fetch

 

#了解即可:Ajax技術 應用這種技術,好處是顯而易見的——更新網頁內容,而不用重新加載整個網頁。又省流量又省時間

工作的時候,會創建一個XHR(或是Fetch)對象,

然后利用XHR對象來實現,服務器和瀏覽器之間傳輸數據。

在這里,XHR和Fetch並沒有本質區別,只是Fetch出現得比XHR更晚一些,所以對一些開發人員來說會更好用,但作用都是一樣的

+++++++++++++++++++++

XHR怎么請求?

 

 

列子:

點擊XHR按鈕。

網頁里一共有10個XHR或Fetch,我們要從里面找出帶有歌單的那一個(嘗試閱讀它們的名字client_search)

從左往右分別是:Headers:標頭(請求信息)、Preview:預覽、Response:原始信息、Timing:時間。

點擊Preview按照這樣的順序:data-song-list-0-name,就能看到歌名

#最左側的Headers,點擊它-General-Requests URL-瀏覽器中打開鏈接(字典層層嵌套),比較難看

直接看Preview,按照這樣的順序:data-song-list-0-name,歌曲名就在這里,它的鍵是name

 

 

XHR是一個字典,鍵data對應的值也是一個字典;

在該字典里,鍵song對應的值也是一個字典;

在該字典里,鍵list對應的值是一個列表;

在該列表里,一共有20個元素;

每一個元素都是一個字典;在每個字典里,鍵name的值,對應的是歌曲名。

XHR{data:{song:{list:[name:{歌曲名}

 

  

 1 import requests  2 
 3 # 引用requests庫
 4 
 5 res = requests.get('https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=60997426243444153&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=%E5%91%A8%E6%9D%B0%E4%BC%A6&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0')  6 
 7 #URL地址點擊XHR --Name--Copy link address 或者復制Request URL
 8 
 9 # 調用get方法,下載這個字典
10 
11 print(res.text) 12 
13 # 把它打印出來 結果不是我們想要的列表/字典,數據取不出來

######################################################

json是什么?

  

 

json是一種特殊的字符串,這種字符串特殊在它的寫法——它是用列表/字典的語法寫成的

和html一樣,常用來做網絡數據傳輸

 

json的數據類型是“文本”,在Python語言當中,我們把它稱為字符串

 

不是所有的編程語言都能讀懂Python里的數據類型(如,列表/字符串),

但是所有的編程語言,都支持文本(在Python中,用字符串這種數據類型來表示文本)這種最朴素的數據類型

json數據能實現,跨平台,跨語言工作。

 

json和XHR之間的關系

XHR用於傳輸數據,它能傳輸很多種數據,json是被傳輸的一種數據格式

 

可以將json格式的數據,轉換成正常的列表/字典,也可以將列表/字典,轉換成json

+++++++++++++++++++++++++++++++++++++++++++++++++++++

json數據如何解析?

搜索“requests 官方文檔”

 

Requests 中也有一個內置的 JSON 解碼器,助你處理 JSON 數據: 

>>> import requests

>>> r = requests.get('https://api.github.com/events')

>>> r.json()

 

[{u'repository': {u'open_issues': 0, u'url': 'https://github.com/...

 

如果 JSON 解碼失敗, r.json() 就會拋出一個異常。例如,響應內容是 401 (Unauthorized),嘗試訪問 r.json() 將會拋出 ValueError: No JSON object could be decoded 異常。

 

需要注意的是,成功調用 r.json() 並**不**意味着響應的成功。有的服務器會在失敗的響應中包含一個 JSON 對象(比如 HTTP 500 的錯誤細節)。

這種 JSON 會被解碼返回。要檢查請求是否成功,請使用 r.raise_for_status() 或者檢查 r.status_code 是否和你的期望相同。

 1 import requests  2 
 3 # 引用requests庫
 4 
 5 res_music = requests.get('https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=60997426243444153&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=%E5%91%A8%E6%9D%B0%E4%BC%A6&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0')  6 
 7 # 調用get方法,下載這個字典
 8 
 9 json_music = res_music.json() 10 
11 # 使用json()方法,將response對象,轉為列表/字典
12 
13 print(type(json_music)) 14 
15 # 打印json_music的數據類型 <class 'dict'>
 1 import requests  2 
 3 # 引用requests庫
 4 
 5 res_music = requests.get('https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=60997426243444153&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=%E5%91%A8%E6%9D%B0%E4%BC%A6&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0')  6 
 7 # 調用get方法,下載這個字典
 8 
 9 json_music = res_music.json() 10 
11 # 使用json()方法,將response對象,轉為列表/字典
12 
13 list_music = json_music['data']['song']['list'] 14 
15 # 一層一層地取字典,獲取歌單列表
16 
17 for music in list_music: 18 
19 # list_music是一個列表,music是它里面的元素
20 
21     print(music['name']) 22 
23     # 以name為鍵,查找歌曲名
24 
25     print('所屬專輯:'+music['album']['name']) 26 
27     # 查找專輯名
28 
29     print('播放時長:'+str(music['interval'])+'') 30 
31     # 查找播放時長
32 
33     print('播放鏈接:https://y.qq.com/n/yqq/song/'+music['mid']+'.html\n\n') 34 
35     # 查找播放鏈接

 


 

擴展json

 1 import json  2 
 3 # 引入json模塊
 4 
 5 a = [1,2,3,4]  6 
 7 # 創建一個列表a。
 8 
 9 b = json.dumps(a) 10 
11 # 使用dumps()函數,將列表a轉換為json格式的字符串,賦值給b。
12 
13 print(b) 14 
15 # 打印b。
16 
17 print(type(b)) 18 
19 # 打印b的數據類型。
20 
21  
22 
23 c = json.loads(b) 24 
25 # 使用loads()函數,將json格式的字符串b轉為列表,賦值給c。
26 
27 print(c) 28 
29 # 打印c。
30 
31 print(type(c)) 32 
33 # 打印c的數據類型。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM