cURL是一个最流行的命令行工具,用于跨网页传输信息。它具有高度的可配置性,并提供多种编程语言的库,使其成为自动网页爬取的一个很好的选择。它能很好地工作的语言之一是Python,因其通用性和可读性而被广泛使用。
cURL和Python一起可以帮助你编写API请求的脚本,调试复杂的实例,并从网页上检索任何类型的数据。本文将演示如何结合使用这两个工具,特别是对于POST和GET请求。我们将使用 PycURL 包。
什么是cURL?
cURL是一个开源的命令行工具和库,用于在命令行或脚本中用URL语法传输数据。它支持近二十六种协议;在它能处理的多种复杂任务中,包括用户认证、FTP上传和测试REST APIs。
在Python中,cURL使用PycURL向服务器传输请求和数据。PycURL的功能是作为Python中libcURL库的一个接口。
几乎每一种编程语言都可以使用REST APIs来访问托管在网页服务器上的端点。与其使用Java、Python、C++、JavaScript或Ruby创建基于网页的调用,你可以使用cURL来演示调用,它提供了一种独立于语言的方式来显示HTTP请求及其响应。然后,你可以将这些请求翻译成适合你的语言的格式。
下面是cURL提供的一些好处。
- 它是多功能的。它几乎适用于所有的操作系统和设备,并支持各种各样的协议,包括HTTP、FILE和FTP。
- 它有助于测试端点,确定它们是否在工作。
- 它是一个低级别的命令行工具,为传输数据/HTTP请求提供了很好的性能。
- 它提供了关于发送或接收内容的报告,这可能对故障排除有帮助。
为什么要爬取网页?
网页爬取有时可能是访问互联网信息的唯一途径。很多数据在CSV导出或API中是不可用的。例如,当你可以下载一个网页论坛上的每一个帖子时,想想你可以做哪些类型的分析。
网页爬取是一种自动化技术,用于从网站上提取大量的非结构化数据,然后以结构化格式存储。刮取网站有各种方法,从API到自己编写代码。
在Python中使用cURL
在你开始之前,有一些先决条件。你需要对Python的语法有基本的了解,或者至少要有不同语言的初级编程经验。你还应该了解基本的网页概念,如协议和客户端-服务器通信。
你需要安装以下程序。
Python
- 选择要下载的 Python 版本,以及适当的 Python 可执行安装程序。本教程使用Windows可执行安装程序x86-64,下载的大小差不多是25MB。
- 当你下载完Python设置后,运行安装程序。
Pip
如果你选择的是旧版本的 Python,它很可能不包括 pip,一个与 Python 程序一起工作的软件包管理系统。请确保安装它,因为大多数软件包都推荐使用 pip,特别是当工作必须在虚拟环境中进行时。
要确认pip已经安装,请遵循以下步骤。
- 从开始菜单中,选择cmd。
- 打开命令提示符应用程序,输入pip — 版本。
- 如果pip已经安装,它将显示版本号。如果还没有安装,将出现以下信息。
"pip" is not considered to be an external or internal command. A batch file is a program to operate. PycURL
PycURL
PycURL 需要确保它所构建的 SSL 库与 libcURL 以及 PycURL 所运行的是同一个库。PycURL 的 setup.py 利用 curl-config 来确定这一点。
certifi
Certifi用来提供Mozilla根证书的SSL。你可以在项目描述网站上阅读更多关于certifi的信息。
提出GET请求
你将使用GET请求从HTTP服务器获取资源。为了创建一个GET请求,在cURL和一个网页之间建立一个连接。
import pycurl import certifi from io import BytesIO # Creating a buffer as the cURL is not allocating a buffer for the network response buffer = BytesIO() c = pycurl.Curl() #initializing the request URL c.setopt(c.URL, 'https://www.scrapingbee.com/') #setting options for cURL transfer c.setopt(c.WRITEDATA, buffer) #setting the file name holding the certificates c.setopt(c.CAINFO, certifi.where()) # perform file transfer c.perform() #Ending the session and freeing the resources c.close()
你需要创建一个缓冲区,因为cURL并没有为网页响应分配一个缓冲区。使用buffer = BytesIO()。
#retrieve the content BytesIO body = buffer.getvalue() #decoding the buffer print(body.decode('iso-8859-1'))
输出应该是这样的:
提出POST请求
POST方法是向HTTP服务器发送数据,或者创建或更新数据的默认方式。
你将使用c.setopt(c.POSTFIELDS, postfields)
函数用于POST请求。这意味着下面的程序将向服务器发送JSON数据,方法是在变量数据中填入要发送的JSON数据,并将 “内容类型 “指定为 “application/json”。
注意c.POSTFIELDS
是用来设置HTTP请求为POST操作。你可以从Python文档中获得更多关于urlencode
的信息。
搜索响应
要在响应中搜索特定的数据,利用c.getinfo()
API来访问更多的数据。回到前面提到的GET例子,在最后添加这两行。
你必须在c.close()
之前调用c.getinfo(c.RESPONSE_CODE))
,否则代码将无法工作。你可以从PycURL文档中获得更多关于getinfo()
的细节。
简单爬取
当你执行代码来爬取网页时,它请求你提到的URL。网页服务器传输数据并允许你访问你的HTML或XML页面作为回应。该代码分析HTML或XML页面,然后定位并提取信息。
要通过网页爬取和Python收集数据,请遵循以下步骤。
- 寻找你想爬取的URL。
- 检查该页面,找到你想要的数据。
- 编写你的代码并提取数据。
- 将数据保持在规定的格式。
作为一个例子,这里有一个简单的Python代码来展示HTML响应解析代码的样子。这段代码遵循了前面提供的分享缓冲区变量的例子。
对于输出,使用['导航','JS插件']
。
你可以在文档中找到更多关于HTML解析器Python库的信息。
将响应数据写到文件中
向文件写入响应的最简单方法是使用open()
方法,并加入你想要的属性。
[文中代码源自Scrapingbee]
这将打开一个名为MyParsed.txt
的文件。将解析后的StartEndTags加入其中并关闭该文件。
你可以在文档中找到更多关于如何使用打开方法的信息。
总 结
正如你所看到的,PycURL 在如何从网页上抓取信息以及其他任务(如用户认证或 SSL 连接)方面为你提供了很大的灵活性。这是一个强大的工具,可以很好地与你的Python程序配合,特别是在使用PycURL时。与Requests和其他流行的Python中的HTTP客户端相比,PycURL是一个低级别的包。它没有那么容易使用,但如果你需要并发连接的话,速度会快很多。