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 秒。
请求头就是发送请求时,携带的信息
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)
-
print("这是resp: ", resp)
- 这行代码输出了整个
resp
对象,它是requests.Response
类的一个实例,包含了请求的所有相关信息。
- 这行代码输出了整个
-
print("这是resp.status_code: ", resp.status_code)
-
resp.status_code
是一个整数,表示 HTTP 请求的状态码。常见的状态码有:
- 200: 请求成功
- 404: 页面不存在
- 500: 服务器内部错误
-
-
print("这是resp.encoding: ", resp.encoding)
resp.encoding
表示响应内容的编码格式,通常会根据响应头自动检测。你也可以手动设置resp.encoding
为正确的编码格式,以便正确解码响应内容。- 一般在页面源代码中,会标注
charset=utf-8"
表示内容的编码格式,有时候可以是gbk,这个时候用resp.encoding='utf-8'
,修改一下就可以正常展示内容。
-
print("\n\n这是resp.text: ", resp.text)
resp.text
以字符串的形式返回响应的文本内容。这对于大多数 Web 页面和 API 响应非常有用。
-
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')
-
异常处理:
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参数。
例如百度搜索的界面:
此时的url如上图所示。同时也可以看到请求方式为get
请求。
在负载中,我们也可以查看这些url参数信息信息
从上面的字段中,我们不难发现,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)
上文两种方法都可以正常请求。
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 库的基本用法和常见场景。三种主要的请求参数类型分别是:
- URL 参数: 用于在 URL 中传递参数。在后端中也称为Query参数。
- 表单参数: 用于在 POST 请求的请求体中传递参数。
- JSON 参数: 用于在 POST 请求的请求体中传递 JSON 格式的数据。
- 其他参数:形如
http://xxx.com/blog/17
的URL格式,那串数字( 17 )往往是一个Path参数,也成为Param参数。
四、结语
根据具体的需求,您可以选择合适的参数类型来发送请求。requests 库提供了非常灵活和强大的功能,可以帮助您轻松地完成各种 HTTP 请求操作。
有任何问题欢迎大家的评论和指正。再次声明,本专栏只做技术探讨,严谨商用,恶意攻击等。
这是我的 GitHub 主页:Rosyrain (github.com) https://github.com/rosyrain
,里面有一些我学习时候的笔记或者代码。本专栏的文档和源码存到spider-course的仓库下。
欢迎大家Follow/Star/Fork三连。