Python爬虫之路(7)

您所在的位置:网站首页 爬虫sign参数 Python爬虫之路(7)

Python爬虫之路(7)

2024-07-14 21:14| 来源: 网络整理| 查看: 265

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)

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 为正确的编码格式,以便正确解码响应内容。image-20240529195401775一般在页面源代码中,会标注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参数。

例如百度搜索的界面:

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 库的基本用法和常见场景。三种主要的请求参数类型分别是:

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三连。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3