爬蟲(四):帶引數請求資料和request Header
阿新 • • 發佈:2021-07-13
目錄
爬取思路:
爬取思路:
- 分析網頁結構
- 找到/並確定請求的資料介面、url
(url是否是規律的? 是否需要手動的構造? 是否需要攜帶params引數進行請求) - 分析請求的介面資料格式 HTML json
- 爬蟲程式碼實現
url 組成
url由兩部分組成,“?”(有時候是“#”)的前半部分是我們請求的地址,“?”的後半部分是請求所附帶的引數。
字串引數
為了程式碼的簡介和方便閱讀,通常會把引數封裝成一個字典,新增進請求中去。通過對引數進行修改,我們就能爬到許多資訊。
-
Query String Parametres的中文翻譯就是:查詢字串引數。這個面板用類似字典的形式,呈現了各個引數的鍵值。
-
讀懂引數,有兩個重要的方法是“觀察”和“比較”。“觀察”指的是閱讀引數的鍵與值,嘗試去理解引數的含義。“比較”指的是比較兩個相近的XHR,例如選電影的初始頁面和點選”載入更多“之後。看看它們的引數有哪些不同。
-
requests模組裡的requests.get()提供了一個引數叫params,可以讓我們用字典的形式,把引數傳進去。
res= requests.get(url, params=param, headers=headers)
Request Headers 請求頭
請求頭會有一些關於該請求的基本資訊
- user-agent(既使用者代理)記錄的就是我的電腦系統資訊和瀏覽器
- origin和referer則是記錄了這個請求的最初來源是哪個頁面
與封裝params非常類似,只需要將origin或referer一併作為字典寫入headers
爬取qq音樂歌詞
url = "https://c.y.qq.com/soso/fcgi-bin/client_search_cp" headers = { 'origin': 'https://y.qq.com', 'referer': 'https://y.qq.com/', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } for x in range(1,4): params = { 'ct': '24', 'qqmusic_ver': '1298', 'new_json': '1', 'remoteplace': 'txt.yqq.song', 'searchid': '54195112887504902', 't': '0', 'aggr': '1', 'cr': '1', 'catZhida': '1', 'lossless': '0', 'flag_qc': '0', 'p': x, 'n': '10', 'w': '王菲', 'g_tk_new_20200303': '5381', 'g_tk': '5381', 'loginUin': '0', 'hostUin': '0', 'format': 'json', 'inCharset': 'utf8', 'outCharset': 'utf-8', 'notice': '0', 'platform': 'yqq.json', 'needNewCode': '0' } res = requests.get(url=url, params=params, headers=headers) try: if res.status_code == 200: music_json = res.json() # print(music_json) music_list = music_json['data']['song']['list'] # print(music_list) for music in music_list: name = music['name'] print(name) id = music['mid'] print(id) # music_url = music['singer'] # print(music_url) url_music = music['url'] # print(url_music) url_lyrics = "https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_new.fcg" headers_lyrics = {'origin': 'https://y.qq.com', 'referer': 'https://y.qq.com/', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'} params_lyrics = {'_': '1626093927027', 'cv': '4747474', 'ct': '24', 'format': 'json', 'inCharset': 'utf-8', 'outCharset': 'utf-8', 'notice': '0', 'platform': 'yqq.json', 'needNewCode': '1', 'uin': '0', 'g_tk_new_20200303': '5381', 'g_tk': '5381', 'loginUin': '0', 'songmid': str(id)} # 觀察url的不同 res_lyrics = requests.get(url = url_lyrics,params=params_lyrics,headers = headers_lyrics) lyrics_json = res_lyrics.json() lyrics_str = lyrics_json['lyric'] #str型別,是編碼過的,需要用bs4解碼 lyrics_b = bytes(lyrics_str, encoding = "utf8") #bs4解碼需要位元組型別,不是字串型別,需要變成位元組型別 lyric = base64.decodebytes(lyrics_b) print(lyric.decode()) # 解碼 else: print("請求失敗") except Exception as error: print(error)