第33章-请求包

这个 requests 包是一个更为python替代python自己的包 urllib 。 您会发现,使用请求包的API要简单得多。您可以使用pip或easy-install或从源代码安装请求库。

使用请求

让我们来看几个如何使用请求包的示例。我们将使用一系列小代码片段来帮助解释如何使用这个库。

>>> r = requests.get("http://www.google.com")

此示例返回 Response 对象。您可以使用响应对象的方法来了解如何使用请求。我们用 Python 的吧 dir 函数以找出可用的方法:

>>> dir(r)
['__attrs__', '__bool__', '__class__', '__delattr__', '__dict__',
'__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__getstate__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__lt__',
'__module__', '__ne__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__',
'__weakref__', '_content', '_content_consumed', 'apparent_encoding', 'close',
'connection', 'content', 'cookies', 'elapsed', 'encoding', 'headers', 'history',
'iter_content', 'iter_lines', 'json', 'links', 'ok', 'raise_for_status', 'raw',
'reason', 'request', 'status_code', 'text', 'url']

如果运行以下方法,则可以看到网页的源代码:

>>> r.content()

此命令的输出太长,无法包含在本书中,因此请务必亲自尝试。如果您想查看网页标题,可以运行以下内容:

>>> r.headers

请注意 报头 属性返回类似dict的对象,而不是函数调用。我们没有显示输出,因为网页标题太宽,无法在书中正确显示。响应对象中还有许多其他重要的函数和属性。例如,您可以获取cookie、页面中的链接以及页面返回的状态代码。

requests包支持以下HTTP请求类型:post、get、put、delete、head和options。如果页面返回JSON,则可以通过调用响应对象的 json 方法。让我们来看一个实际的例子。

如何提交Web表单

在本节中,我们将比较如何提交带有请求的Web表单与URLLIB。让我们从学习如何提交Web表单开始。我们将使用 duckduckgo.com 搜索术语 Python 并将结果保存为HTML文件。我们将从一个使用urllib的示例开始:

import urllib.request
import urllib.parse
import webbrowser

data = urllib.parse.urlencode({'q': 'Python'})
url = 'http://duckduckgo.com/html/'
full_url = url + '?' + data
response = urllib.request.urlopen(full_url)
with open("results.html", "wb") as f:
    f.write(response.read())

webbrowser.open("results.html")

当你想提交一个web表单时,你首先要做的就是找出这个表单的名字和你要发布到的网址。如果您访问duckduckgo的网站并查看源代码,您会注意到它的操作指向一个相对链接,“/html”。所以我们的网址是“http://duckduckgo.com/html”。输入字段名为“q”,因此要传递duckduckgo搜索词,我们必须将URL连接到“q”字段。结果被读取并写入磁盘。现在让我们了解一下在使用请求包时,这个过程是如何不同的。

Requests包确实能更优雅地提交表单。让我们看看:

import requests

url = 'https://duckduckgo.com/html/'
payload = {'q':'python'}
r = requests.get(url, params=payload)
with open("requests_results.html", "wb") as f:
    f.write(r.content)

对于请求,您只需要创建一个以字段名为键,搜索项为值的字典。然后你用 requests.get 进行搜索。最后,使用结果请求对象“r”,并访问保存到磁盘的内容属性。

总结

现在你知道了 requests 包。我建议您阅读该包的在线文档,因为它有许多其他示例,您可能会发现这些示例很有用。我个人认为这个模块比标准库的等效模块更直观。