Python【Network/XHR/json】

#####################################################################html

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

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

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

#####################################################################編程

什麼是Networkjson

 

 

調用「檢查」(ctrl+shift+i)工具,而後點擊Networkapi

 

記錄在當前頁面上發生的全部請求。瀏覽器

如今看上去好像空空如也的樣子,這是由於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的數據類型。
相關文章
相關標籤/搜索