#####################################################################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的數據類型。