在 Python 中发出 GET 请求 - 教程





5.00/5 (6投票s)
我们使用 Chrome DevTools 以及 urllib 和 BeautifulSoup 库以编程方式从 www.codeproject.com 获取内容。
引言
在本文中,我们将探讨如何使用 Python 发起 GET 请求。我们将使用 urllib 库来发起 GET 请求,并使用 BeautifulSoup 库来解析响应内容。我们还将使用 Chrome DevTools 来识别网页上的 HTML 元素。
您也可以从 https://github.com/NanoBreeze/Making-GET-Requests-in-Python-Tutorial 下载相关的 Python 文件。
背景
如果您是 Web 开发或网络方面的新手,本节将为您提供有关发起 GET 请求的一些背景知识。
超文本传输协议 (HTTP) 是一套用于在服务器和客户端之间传输和解释超文本标记语言 (HTML) 的规则,HTML 是构建网站的语言。HTTP 包含几种方式(也称为请求方法),供客户端向服务器指示其所需内容。最常用的请求方法之一是 GET 请求。
当客户端需要服务器上特定资源(如 HTML 文件、图片文件或 Word 文档)时,它会向服务器发起 GET 请求。当您在 Google 搜索栏中搜索“hello world”时,您的浏览器(客户端)就会向 Google 服务器发起 GET 请求,以查找与“hello world”相关的网站。Google 服务器然后会用相关网站列表响应您的浏览器的 GET 请求。当您在浏览器的地址栏中输入 URL 后,浏览器会向托管该网站的服务器发送 GET 请求。然后,服务器会响应您键入的 URL 所关联的资源(通常是网页)。
今天,让我们学习如何在不使用浏览器的情况下以编程方式发起 GET 请求。
(题外话:另一种常用的请求方法是 POST 方法。当客户端向服务器提交信息时,例如表单提交和登录,它会发起 POST 请求。)
发起 GET 请求
urllib 库包含一个名为 urlopen(“url”)
的函数,该函数向 URL 发起 GET 请求并返回一个 HTTPResponse 对象。HTTPResponse 对象有一个 read()
方法,该方法返回与该网页关联的 HTML。
from urllib.request import urlopen
codeProjectHtml = urlopen("https://codeproject.org.cn/")
print(codeProjectHtml.read())
这是 HTML
虽然我们可以看到 HTML,但由于缺少缩进,它很难阅读。我们可以使用 BeautifulSoup 库并再添加一行代码来使 HTML 更具可读性:我们实例化一个 BeautifulSoup
对象,并向其传递两个参数。
- 来自
codeProjectHtml.read()
的 HTML - 字符串
“
html.parser
”
,它指示 BeautifulSoup 实例使用 Python 的默认解析器库。
我们打印 BeautifulSoup
实例,而不是打印 HTML。这是我们的代码:
from urllib.request import urlopen
from bs4 import BeautifulSoup
codeProjectHtml = urlopen("https://codeproject.org.cn/")
bsInstance = BeautifulSoup(codeProjectHtml.read(), "html.parser")
print(bsInstance)
HTML 的可读性大大提高
GET 请求实践
除了美化 HTML,BeautifulSoup 还可以搜索 HTML 中的元素、属性和文本。让我们通过一个练习来学习如何使用 BeautifulSoup 搜索元素:让我们找出 www.codeproject.com 上在线会员的数量。解决这个练习有四个步骤。
- 由于在线用户数量显示在 codeproject.com 上,我们需要获取 www.codeproject.com 的 HTML(我们在上一节中已经完成了此操作)。
- 确定哪个元素包含在线会员数量(我们使用 Chrome DevTools)。
- 在步骤 1 的 HTML 中搜索步骤 2 中的元素(我们使用 BeautifulSoup)。
- 显示在线会员数量。
完成步骤 1:获取 HTML
我们这样写:
codeProjectHtml = urlopen("https://codeproject.org.cn/")
完成步骤 2:使用 Chrome DevTools 确定元素
Chrome DevTools 是 Chrome 内置的一套调试工具,我们可以通过右键单击任何元素并选择“检查”来查找其 HTML。
Chrome DevTools 然后会以浅灰色高亮显示包含在线会员数量的元素相关的 HTML。同时,包含在线会员数量的文本也会以浅蓝色高亮显示。
我们注意到在线会员数量在一个 <div>
元素中,其 id
为 ctl00_MemberMenu_GenInfo
。
完成步骤 3:使用 BeautifulSoup 搜索元素
为了在步骤 1 的 HTML 中查找元素,我们实例化一个来自步骤 1 HTML 的 BeautifulSoup
实例,并调用其 find(...)
方法。find(...)
方法是重载的,我们向其传递两个参数:第一个是元素类型;第二个是一个字典,其键和值分别是元素的属性和值。我们这样写:
bsInstance = BeautifulSoup(codeProjectHtml.read(), "html.parser") memberMenu = bsInstance.find("div", {"id" : "ct100_MemberMenu_GenInfo"})
完成步骤 4:打印结果
因为我们要获取 <div>
中的文本,所以我们将调用 memberMenu
上的 get_text()
方法。我们打印该元素中的文本:
print(memberMenu.get_text())
完整代码
from urllib.request import urlopen
from bs4 import BeautifulSoup
codeProjectHtml = urlopen("https://codeproject.org.cn/")
bsInstance = BeautifulSoup(codeProjectHtml.read(), "html.parser")
memberMenu = bsInstance.find("div", {"id" : "ct100_MemberMenu_GenInfo"})
print(memberMenu.get_text())
练习
让我们尝试找到当我们在 www.codeproject.com 上搜索“Python”时出现的第一个文章的名称。
再一次,我们可以将此任务分为四个部分。
完成步骤 1:获取 HTML
我们在 codeproject 的搜索栏中手动输入“Python”,并注意到 URL 是 https://codeproject.org.cn/search.aspx?q=python。
codeProjectPythonSearchHtml = urlopen("https://codeproject.org.cn/search.aspx?q=python")
完成步骤 2:使用 Chrome DevTools 确定元素
我们检查包含第一篇文章名称的元素(在撰写本文时,它是“Python Code Generator Written in Python”),并注意到它是一个 <a>
元素,其 id
为 ct100_MC_Results_ct100_DocTitle
。通过进行不同的搜索并检查包含第一篇文章名称的元素,我们可以确保此 id
并非仅在搜索“Python”时才唯一。
完成步骤 3:使用 BeautifulSoup 搜索元素
我们调用 firstArticle
上的 find(...)
方法。
bsInstance = BeautifulSoup(codeProjectPythonSearchHtml.read(), "html.parser")
firstArticle = bsInstance.find("a", {"id" : " ct100_MC_Results_ct100_DocTitle"})
完成步骤 4:打印结果
我们打印该元素的文本。
print(firstArticle.get_text())
完整代码
from urllib.request import urlopen
from bs4 import BeautifulSoup
codeProjectPythonSearchHtml = urlopen("https://codeproject.org.cn/search.aspx?q=python")
bsInstance = BeautifulSoup(codeProjectPythonSearchHtml.read(), "html.parser")
firstArticle = bsInstance.find("a", {"id" : " ct100_MC_Results_ct100_DocTitle"})
print(firstArticle.get_text())
延伸阅读
- BeautifulSoup 文档
- Requests: HTTP for Humans(用于更高级的请求,如 POST 和会话处理)。
感谢阅读!希望本文对您有所帮助。如果您有任何反馈,请在下方留言。