Python中使用Requests模块
Requests 是一个 Python 模块,可用于发送各种 HTTP 请求。它是一个易于使用的库,具有许多功能,从在 URL 中传递参数到发送自定义标头和 SSL 验证。在本教程中,您将学习如何使用该库在 Python 中发送简单的 HTTP 请求。
您可以在 Python 版本 2.6–2.7 和 3.3–3.6 中使用请求。在继续之前,您应该知道 Requests 是一个外部模块,因此在尝试本教程中的示例之前必须先安装它。您可以通过在终端中运行以下命令来安装它:
pip install requests
登录后复制
安装模块后,您可以使用以下命令导入模块来验证是否已成功安装:
import requests
登录后复制
如果安装成功,您将不会看到任何错误消息。
发出 GET 请求
使用 Requests 发送 HTTP 请求非常容易。您首先导入模块,然后发出请求。这是一个例子:
import requests
req = requests.get(‘https://tutsplus.com/’)
登录后复制
有关我们请求的所有信息现在都存储在名为 req
的响应对象中。例如,您可以使用 req.encoding
属性获取网页的编码。您还可以使用 req.status_code
属性获取请求的状态代码。
req.encoding # returns ‘utf-8’
req.status_code # returns 200
登录后复制
您可以使用 req.cookies
访问服务器发回的 cookie。同样,您可以使用 req.headers
获取响应标头。 req.headers
属性返回响应标头的不区分大小写的字典。这意味着 req.headers['Content-Length']
、req.headers['content-length']
和 req。 headers['CONTENT-LENGTH']
都会返回 'Content-Length'
响应头的值。
您可以检查响应是否是格式良好的 HTTP 重定向,可以使用 req.is_redirect
属性自动处理。它将根据响应返回 True
或 False
。您还可以使用 req.elapsed
属性获取发送请求和获取响应之间经过的时间。
由于多种原因(包括重定向),您最初传递给 get()
函数的 URL 可能与响应的最终 URL 不同。要查看最终的响应 URL,您可以使用 req.url
属性。
import requests
req = requests.get(‘https://www.tutsplus.com/’)
req.encoding # returns ‘utf-8’
req.status_code # returns 200
req.elapsed # returns datetime.timedelta(0, 1, 666890)
req.url # returns ‘https://oss.xajjn.com/article/2023/09/02/1640436280’, stream=True)
req.raise_for_status()
with open(‘mushrooms.jpg’, ‘wb’) as fd:
for chunk in req.iter_content(chunk_size=50000):
print(‘Received a Chunk’)
fd.write(chunk)
登录后复制
'path/to/mushrooms.jpg'
是实际的图像 URL。您可以将任何其他图像的 URL 放在这里来下载其他内容。给定的图像文件大小为 162kb,并且您已将 chunk_size
设置为 50,000 字节。这意味着“Received a Chunk”消息应在终端中打印四次。最后一个块的大小将仅为 32350 字节,因为前三次迭代后仍待接收的文件部分为 32350 字节。
您还可以用类似的方式下载视频。我们可以简单地将其值设置为 None
,而不是指定固定的 chunk_size
,然后视频将以提供的任何块大小下载。以下代码片段将从 Mixkit 下载高速公路的视频:
import requests
req = requests.get(‘path/to/highway/video.mp4’, stream=True)
req.raise_for_status()
with open(‘highway.mp4’, ‘wb’) as fd:
for chunk in req.iter_content(chunk_size=None):
print(‘Received a Chunk’)
fd.write(chunk)
登录后复制
尝试运行代码,您将看到视频作为单个块下载。
如果您决定使用 stream
参数,则应记住以下几点。响应正文的下载会被推迟,直到您使用 content
属性实际访问其值。这样,如果某些标头值之一看起来不正确,您就可以避免下载文件。
另请记住,在将流的值设置为 True
时启动的任何连接都不会关闭,除非您消耗所有数据或使用 close()
方法。确保连接始终关闭的更好方法是在 with
语句中发出请求,即使您部分读取了响应,如下所示:
import requests
with requests.get(‘path/to/highway/video.mp4’, stream=True) as rq:
with open(‘highway.mp4’, ‘wb’) as fd:
for chunk in rq.iter_content(chunk_size=None):
print(‘Received a Chunk’)
fd.write(chunk)
登录后复制
由于我们之前下载的图片文件比较小,您也可以使用以下代码一次性下载:
import requests
req = requests.get(‘path/to/mushrooms.jpg’)
req.raise_for_status()
with open(‘mushrooms.jpg’, ‘wb’) as fd:
fd.write(req.content)
登录后复制
我们跳过了设置 stream
参数的值,因此默认设置为 False
。这意味着所有响应内容将立即下载。借助 content
属性,将响应内容捕获为二进制数据。
请求还允许您在 URL 中传递参数。当您在网页上搜索某些结果(例如特定图像或教程)时,这会很有帮助。您可以使用 GET 请求中的 params
关键字将这些查询字符串作为字符串字典提供。这是一个例子:
import requests
query = {‘q’: ‘Forest’, ‘order’: ‘popular’, ‘min_width’: ‘800’, ‘min_height’: ‘600’}
req = requests.get(‘https://pixabay.com/en/photos/’, params=query)
req.url
# returns ‘https://pixabay.com/en/photos/?order=popular&min_height=600&q=Forest&min_width=800’
登录后复制
发出 POST 请求
发出 POST 请求与发出 GET 请求一样简单。您只需使用 post()
方法而不是 get()
即可。当您自动提交表单时,这会很有用。例如,以下代码将向 httpbin.org 域发送 post 请求,并将响应 JSON 作为文本输出。
import requests
req = requests.post(‘https://httpbin.org/post’, data = {‘username’: ‘monty’, ‘password’: ‘something_complicated’})
req.raise_for_status()
print(req.text)
”’
{
“args”: {},
“data”: “”,
“files”: {},
“form”: {
“password”: “something_complicated”,
“username”: “monty”
},
“headers”: {
“Accept”: “*/*”,
“Accept-Encoding”: “gzip, deflate”,
“Content-Length”: “45”,
“Content-Type”: “application/x-www-form-urlencoded”,
“Host”: “httpbin.org”,
“User-Agent”: “python-requests/2.28.1”,
“X-Amzn-Trace-Id”: “Root=1-63ad437e-67f5db6a161314861484f2eb”
},
“json”: null,
“origin”: “YOUR.IP.ADDRESS”,
“url”: “https://httpbin.org/post”
}
”’
登录后复制
您可以将这些 POST 请求发送到任何可以处理它们的 URL。举个例子,我的一位朋友创建了一个网页,用户可以在其中输入单词并使用 API 获取其含义以及发音和其他信息。我们可以用我们查询的单词向URL发出POST请求,然后将结果保存为HTML页面,如下所示:
import requests
word = ‘Pulchritudinous’
filename = word.lower() + ‘.html’
req = requests.post(‘https://tutorialio.com/tools/dictionary.php’, data = {‘query’: word})
req.raise_for_status()
with open(filename, ‘wb’) as fd:
fd.write(req.content)
登录后复制
执行上面的代码,它会返回一个包含该单词信息的页面,如下图所示。
发送 Cookie 和标头
如前所述,您可以使用 req.cookies
和 req.headers
访问服务器发回给您的 cookie 和标头。请求还允许您通过请求发送您自己的自定义 cookie 和标头。当您想要为您的请求设置自定义用户代理时,这会很有帮助。
要将 HTTP 标头添加到请求中,您只需将它们通过 dict
传递到 headers
参数即可。同样,您还可以使用传递给 cookies
参数的 dict
将自己的 cookie 发送到服务器。
import requests
url = ‘http://some-domain.com/set/cookies/headers’
headers = {‘user-agent’: ‘your-own-user-agent/0.0.1’}
cookies = {‘visit-month’: ‘February’}
req = requests.get(url, headers=headers, cookies=cookies)
登录后复制
Cookie 也可以在 Cookie Jar 中传递。它们提供了更完整的界面,允许您通过多个路径使用这些 cookie。这是一个例子:
import requests
jar = requests.cookies.RequestsCookieJar()
jar.set(‘first_cookie’, ‘first’, domain=’httpbin.org’, path=’/cookies’)
jar.set(‘second_cookie’, ‘second’, domain=’httpbin.org’, path=’/extra’)
jar.set(‘third_cookie’, ‘third’, domain=’httpbin.org’, path=’/cookies’)
url = ‘http://httpbin.org/cookies’
req = requests.get(url, cookies=jar)
req.text
# returns ‘{ “cookies”: { “first_cookie”: “first”, “third_cookie”: “third” }}’
登录后复制
会话对象
有时,在多个请求中保留某些参数很有用。 Session 对象正是这样做的。例如,它将在使用同一会话发出的所有请求中保留 cookie 数据。 Session 对象使用 urllib3 的连接池。这意味着底层 TCP 连接将被重复用于向同一主机发出的所有请求。这可以显着提高性能。您还可以将 Requests 对象的方法与 Session 对象一起使用。
以下是使用和不使用会话发送的多个请求的示例:
import requests
reqOne = requests.get(‘https://tutsplus.com/’)
reqOne.cookies[‘_tuts_session’]
#returns ‘cc118d94a84f0ea37c64f14dd868a175’
reqTwo = requests.get(‘https://code.tutsplus.com/tutorials’)
reqTwo.cookies[‘_tuts_session’]
#returns ‘3775e1f1d7f3448e25881dfc35b8a69a’
ssnOne = requests.Session()
ssnOne.get(‘https://tutsplus.com/’)
ssnOne.cookies[‘_tuts_session’]
#returns ‘4c3dd2f41d2362108fbb191448eab3b4’
reqThree = ssnOne.get(‘https://code.tutsplus.com/tutorials’)
reqThree.cookies[‘_tuts_session’]
#returns ‘4c3dd2f41d2362108fbb191448eab3b4’
登录后复制
正如您所看到的,会话cookie在第一个和第二个请求中具有不同的值,但当我们使用Session对象时它具有相同的值。当您尝试此代码时,您将获得不同的值,但在您的情况下,使用会话对象发出的请求的 cookie 将具有相同的值。
当您想要在所有请求中发送相同的数据时,会话也很有用。例如,如果您决定将 cookie 或用户代理标头与所有请求一起发送到给定域,则可以使用 Session 对象。这是一个例子:
import requests
ssn = requests.Session()
ssn.cookies.update({‘visit-month’: ‘February’})
reqOne = ssn.get(‘http://httpbin.org/cookies’)
print(reqOne.text)
# prints information about “visit-month” cookie
reqTwo = ssn.get(‘http://httpbin.org/cookies’, cookies={‘visit-year’: ‘2017’})
print(reqTwo.text)
# prints information about “visit-month” and “visit-year” cookie
reqThree = ssn.get(‘http://httpbin.org/cookies’)
print(reqThree.text)
# prints information about “visit-month” cookie
登录后复制
如您所见,"visit-month"
会话 cookie 随所有三个请求一起发送。但是, "visit-year"
cookie 仅在第二次请求期间发送。第三个请求中也没有提及 "vist-year"
cookie。这证实了单个请求上设置的 cookie 或其他数据不会与其他会话请求一起发送。
结论
本教程中讨论的概念应该可以帮助您通过传递特定标头、cookie 或查询字符串来向服务器发出基本请求。当您尝试抓取网页以获取信息时,这将非常方便。现在,一旦您找出 URL 中的模式,您还应该能够自动从不同的网站下载音乐文件和壁纸。
学习 Python
无论您是刚刚入门还是希望学习新技能的经验丰富的程序员,都可以通过我们完整的 Python 教程指南学习 Python。
以上就是Python中使用Requests模块的详细内容,更多请关注恰卡编程网(mip.qiaqa.com)其它相关文章!
推荐阅读
-
在Python中,将K添加到列元组列表中的最小元素
处理数据集涉及识别特定列中的最小值并通过添加常量值(K)来更新它。通过实施优化的解决方案,我们可以有效地执行此操作,这对于数据...
-
使用switch case语句编写的C程序,用于计算几何图形的面积
#includevoidmain(){intfig_code;floatside,base,length,...
-
如何使 C# 代码可重用?
要在C#中使代码可重用,请使用接口。接口定义属性、方法和事件,这些成员是接口的成员。接口只包含成员的声明。派生类负责定义成员。这通...
-
C# 中的覆盖和隐藏有什么区别?
方法隐藏在C#中也称为隐藏。父类的方法可供子类使用,无需在遮蔽中使用override关键字。子类有其自己版本的相同函数。在...
-
在Java中使用示例双倍longValue()函数
Java是一种强大的面向对象语言,可以对各种数据类型进行高度的控制和精确度。其中一种功能是doublelongValue(),...
-
如何在Java中定义JSON字段名称的命名约定?
TheFieldNamingPolicycanbeusedtodefineafewstandardnaming...
-
Servlet中的HttpSession接口
在JavaWeb开发领域,了解HttpSession接口是创建动态和响应式Web应用程序的关键。在本文中,我们将探讨...
-
使用while循环查找自然数之和的Java程序
自然数之和可以使用编程语言中的不同迭代语句来计算。迭代语句是执行一组特定代码行直到循环语句中的条件失败的语句。在本文中,我们将讨论...
-
我们可以将Java数组转换为列表吗?
我们可以使用Arrays.asList()方法轻松地将Java数组转换为List。语法publicstaticLi...
-
Java中如何在不使用任何外部库的情况下读取网页内容?
TheURLclassofthejava.netpackagerepresentsaUniformResour...