1. 程式人生 > 其它 >爬蟲(四):帶引數請求資料和request Header

爬蟲(四):帶引數請求資料和request Header

目錄
爬取思路:
  1. 分析網頁結構
  2. 找到/並確定請求的資料介面、url
    (url是否是規律的? 是否需要手動的構造? 是否需要攜帶params引數進行請求)
  3. 分析請求的介面資料格式 HTML json
  4. 爬蟲程式碼實現

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)