爬虫(四):带参数请求数据和request Header

时间:2021-07-13
本文章向大家介绍爬虫(四):带参数请求数据和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)

原文地址:https://www.cnblogs.com/The-dancing-salted-fish/p/15006893.html