Python爬虫之路(7)--requests库的使用以及三种参数

requests库的使用以及三种请求参数

一、前言

在前面的文章当中,我们已经讲解了两个案例,这篇文章我将从requests库的使用以及三种请求参数进行一些知识上的补充。

二、requests基本用法

requests 库是一个优秀的 Python 第三方库,它简化了 HTTP 请求的发送过程,并提供了丰富的功能。下面让我们详细看看它的用法:

 import requests
 ​
 url = "https://www.baidu.com/"
 ​
 params={
     'tn': '68018901_16_pg',
 }
 _headers = {
     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'
 }
 ​
 resp = requests.get(url,headers=_headers,params=params,timeout=10)

参数解析:

  • url:要抓取的 url 地址。
  • headers:用于包装请求头信息(一般情况下推荐全部写入)。
  • params:请求时携带的查询字符串参数。(下文讲解)
  • timeout:超时时间,超过时间会抛出异常。可以是一个浮点数,表示总体超时时间。也可以传递一个元组,第一个值表示连接超时,第二个值表示读取超时。例如 timeout=(5.0, 30.0) 表示连接超时 5 秒,读取超时 30 秒。

请求头就是发送请求时,携带的信息

image-20240529194627730

 print("这是resp: ",resp)
 print("这是resp.status_code: ",resp.status_code)
 print("这是resp.encoding: ",resp.encoding)
 print("\n\n这是resp.text: ",resp.text)
 print("\n\n这是resp.content: ",resp.content)
  1. print("这是resp: ", resp)

    • 这行代码输出了整个 resp 对象,它是 requests.Response 类的一个实例,包含了请求的所有相关信息。
  2. print("这是resp.status_code: ", resp.status_code)

    • resp.status_code

      是一个整数,表示 HTTP 请求的状态码。常见的状态码有:

      • 200: 请求成功
      • 404: 页面不存在
      • 500: 服务器内部错误
  3. print("这是resp.encoding: ", resp.encoding)

    • resp.encoding 表示响应内容的编码格式,通常会根据响应头自动检测。你也可以手动设置 resp.encoding 为正确的编码格式,以便正确解码响应内容。
    • image-20240529195401775
    • 一般在页面源代码中,会标注charset=utf-8"表示内容的编码格式,有时候可以是gbk,这个时候用 resp.encoding='utf-8',修改一下就可以正常展示内容。
  4. print("\n\n这是resp.text: ", resp.text)

    • resp.text 以字符串的形式返回响应的文本内容。这对于大多数 Web 页面和 API 响应非常有用。
  5. print("\n\n这是resp.content: ", resp.content)

    • resp.content 以字节的形式返回响应的二进制内容。这对于处理非文本数据(如图片、视频等)很有用。

上面没有提到的一些有用的属性和方法:

  • resp.headers: 以字典形式返回响应头。
  • resp.json(): 如果响应的内容是 JSON 格式,可以使用这个方法直接解析为 Python 对象。
  • resp.cookies: 以 RequestsCookieJar 对象的形式返回响应的 cookies。
  • resp.url: 返回最终的 URL 地址,可能与原始请求的 URL 不同(比如发生了重定向)。
  • resp.history: 返回请求历史,如果有重定向的话。

请求头:

 headers = {
     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
 }
 response = requests.get('https://www.example.com', headers=headers)

文件上传:

 files = {'file': open('example.jpg', 'rb')}
 response = requests.post('https://www.example.com/upload', files=files)

Cookie 管理:

cookie是网站对你进行身份校验的一个字段,当你访问一些必须登录的页面时,他就不可忽略。

 # 发送请求并保存 Cookies
 response = requests.get('https://www.example.com')
 cookies = response.cookies
 ​
 # 使用 Cookies 发送后续请求
 response = requests.get('https://www.example.com/protected', cookies=cookies)

会话管理:

有些URL需要进行身份校验,而session就可以实现登录功能,但是我更推荐的方式是将登录之后的cookie加入到请求头中。

 session = requests.Session()
 session.auth = ('username', 'password')
 response = session.get('https://www.example.com/protected')
  1. 异常处理:

     try:
         response = requests.get('https://www.example.com', timeout=5)
     except requests.exceptions.Timeout:
         print('Request timed out')
     except requests.exceptions.RequestException as e:
         print(f'An error occurred: {e}')
    

post请求在上篇文章详细讲过,不在赘述。下面给出一个示例。

 import requests
 #百度翻译
 url = 'https://fanyi.baidu.com'
 #post请求体携带的参数,可通过开发者调试工具查看
 #查看步骤:NetWork选项->Headers选项->Form Data
 data = {'from': 'zh',
         'to': 'en',
         'query': '你好'
         }
 response = requests.post(url, data=data)
 print(response)

三、请求参数

requests 库支持三种类型的请求参数

  • URL 参数:

    url参数往往会拼接到url地址后面,在 ? 后面的参数就属于url参数。一般情况下Get请求需要参数的话,大部分都是采用的url参数。

例如百度搜索的界面:

image-20240529200710887

此时的url如上图所示。同时也可以看到请求方式为get请求。

在负载中,我们也可以查看这些url参数信息信息

image-20240529200754126

从上面的字段中,我们不难发现,wd就是我们搜索时候的输入值。

那么如何请求呢,下面就是一个示例。

方法1:直接使用完整的url请求

import requests


headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0',
}

url = 'http://www.baidu.com/s?wd=G.E.M.%E9%82%93%E7%B4%AB%E6%A3%8B&rsv_spt=1&rsv_iqid=0xe5d6b2cc00001bc2&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=68018901_16_pg&rsv_enter=1&rsv_dl=tb&oq=G%2526gt%253BM&rsv_btype=t&inputT=3373&rsv_t=eee1C7sFt%2BmVRpzKgxMwjkisut2upt%2B4YyoV7I2WYhBXX1ZbRnpJ01O5MkUrvCh3yq31b%2FM&rsv_sug3=14&rsv_sug1=9&rsv_sug7=100&rsv_pq=e6cbae7a0014dda1&rsv_sug2=0&rsv_sug4=4450'

response = requests.get(url,headers=headers)
response.encoding = 'utf-8'
print(response.text)

方法二:将 URL中?后面的参数拆出来请求

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0',
}
params = {
    'wd': 'G.E.M.邓紫棋',
}

response = requests.get(url='http://www.baidu.com/s',params=params,headers=headers)
response.encoding = 'utf-8'
print(response.text)

image-20240529203415894

上文两种方法都可以正常请求。

ps:这里请注意,百度的url是https请求的时候会返回百度验证,这点将URL中的https改为http就可以正常使用了。

  • 表单参数:

    在上文Python爬虫之路(6)-- x京新发地获取菜价波动(Post请求) - 掘金 (juejin.cn)具体将结果如何使用,大家可以去参考一下。下面给出一个简单的示例。

    data = {'username': 'admin', 'password': 'password'}
    response = requests.post('https://www.example.com/login', data=data)
    
  • JSON 参数:

    json参数大部分我们会使用上面的表单参数形式进行传递。

    json_data = {'key1': 'value1', 'key2': 'value2'}
    response = requests.post('https://www.example.com/api/create', json=json_data)
    

以上就是 requests 库的基本用法和常见场景。三种主要的请求参数类型分别是:

  1. URL 参数: 用于在 URL 中传递参数。在后端中也称为Query参数。
  2. 表单参数: 用于在 POST 请求的请求体中传递参数。
  3. JSON 参数: 用于在 POST 请求的请求体中传递 JSON 格式的数据。
  4. 其他参数:形如http://xxx.com/blog/17的URL格式,那串数字( 17 )往往是一个Path参数,也成为Param参数。

四、结语

根据具体的需求,您可以选择合适的参数类型来发送请求。requests 库提供了非常灵活和强大的功能,可以帮助您轻松地完成各种 HTTP 请求操作。


有任何问题欢迎大家的评论和指正。再次声明,本专栏只做技术探讨,严谨商用,恶意攻击等。

这是我的 GitHub 主页:Rosyrain (github.com) https://github.com/rosyrain,里面有一些我学习时候的笔记或者代码。本专栏的文档和源码存到spider-course的仓库下。

欢迎大家Follow/Star/Fork三连。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值