使用 Libcurl 使用 C 获取网页

让我们学习使用 Libcurl 模块来获取网页。 C 是一种非常复杂的语言,如果您曾经在 C 中使用过套接字,就会知道处理网络连接有时可能是一场噩梦。 在这种情况下,使用 C 获取网页似乎是一场噩梦。 但是,在本模块中,我们将学习如何使用 libcurl 轻松获取网页!

什么是 Libcurl ?

卷曲 是一个易于使用的库,可帮助我们向各种服务发出请求,例如:

  • HTTP
  • HTTPS
  • FTP
  • FTPS
  • IMAP
  • IMAPS
  • 以及更多…。

这为我们节省了很多处理套接字编程的麻烦,否则对于 C 程序员来说这将是一个噩梦。 的另一个好处 卷曲 就是它的便携性很强!

无论您使用的是 Linux、Windows、Mac 等,它的语法和构建都保持不变。这使得使用 卷曲 超级简单,我们让我们可以编写统一的代码,而不必担心操作系统特定的因素。

安装 Libcurl

Libcurl 通常不会默认安装在大多数系统上。 但是,您可以使用以下命令安装它:

$ sudo apt-get install libcurl4-gnutls-dev 

使用 libcurl 获取网页

#include <stdio.h> #include <stdlib.h> #include <curl/curl.h>  int main(void) { 	CURL *curl = curl_easy_init();  	if (!curl) 	{ 		fprintf(stderr,"[-] Failed Initializing Curln"); 		exit(-1); 	}  	CURLcode res; 	curl_easy_setopt(curl, CURLOPT_URL, "https://example.com"); 	res = curl_easy_perform(curl); 	 	if (res != CURLE_OK) 	{ 		fprintf(stderr,"[-] Could Not Fetch Webpagen[+] Error : %sn",curl_easy_strerror(res)); 		exit(-2); 	}  	curl_easy_cleanup(curl); 	return 0; } 

解释代码

让我们分解代码并详细了解它的工作原理。

第 1-3 行:包括必需的标题

#include <stdio.h> #include <stdlib.h> #include <curl/curl.h> 

我们需要以下头文件:

  • 标准输出文件:用于将消息打印到控制台。
  • 标准库文件: 打电话 出口() 如果我们遇到错误
  • curl/curl。H:包含我们将用于请求我们的网页的功能

请注意我们如何将最后一个库编写为 curl/curl。H? 这是因为与我们的标准库不同,例如 标准输出文件 或者 标准库文件 存储在 /usr/包括,它存储在 /usr/包括/curl (在某些情况下,它可能在 /usr/include/x86_64-linux-gnu /curl 以及),因此它也包括在内。

第 5 行:声明 Main

int main(void) 

我们宣布 主要的 函数声明它将返回一个整数(由前导指定 整数) 并且不接受由指定的参数 空白

第 7 行:创建 CURL 对象

CURL *curl = curl_easy_init(); 

我们在这里创建一个 卷曲容易处理 并使用函数初始化它 curl_easy_init() 并使用指针存储它 “curl”.

curl_easy_init() 使用 with 时必须是第一个调用的函数 卷曲 它返回一个 卷曲容易处理 您必须将其用作简单界面中其他功能的输入,我们将其存储在先前创建的界面中。

第 9-13 行:检查错误

if (!curl) { 	fprintf(stderr,"[-] Failed Initializing Curln"); 	exit(-1); } 

这部分比较容易理解。 我们正在检查是否 卷曲容易处理 已成功创建。 如果过程中出现任何错误 curl 变量会有一个 空值 值存储在其中,从而进入 if 块。

然后它会打印一条消息到 标准错误 并退出程序从而阻止进一步执行。

第 15-17 行:获取网页

CURLcode res; curl_easy_setopt(curl, CURLOPT_URL, "https://example.com"); res = curl_easy_perform(curl); 

首先我们创建一个类型的变量 卷曲代码,这是一个特殊的 卷曲 错误代码的 typedefed 变量。 这将有助于我们稍后获取操作的返回代码并帮助识别错误。

接下来,我们使用 curl_easy_setopt() 函数,这是这里最重要的函数之一。 它定义了 libcurl 的行为。 它需要三个参数:

  • curl :Curl 简易把手
  • CURLOPT_URL : 指定我们将传入要使用的 URL
  • https://example.com : 我们将请求的 URL

curl_easy_setopt() 是一个非常广泛的功能,可以让我们在很大程度上控制我们的请求的性质。 要了解有关相同选项和可能选项的更多信息,请输入:

$ man 3 curl_easy_setopt 

最后我们执行我们的请求 curl_easy_perform() 并将结果响应存储在变量中 “资源” 并将网页打印到我们的终端上。

第 19-23 行:检查响应

if (res != CURLE_OK) { 	fprintf(stderr,"[-] Could Not Fetch Webpagen[+] Error : %sn",curl_easy_strerror(res)); 	exit(-2); } 

接下来我们检查请求是否成功。 CURLE_OK (0) 表示请求成功,否则将返回非零数字。 您可以使用以下命令检查所有可能的响应代码及其含义:

$ man 3 libcurl-errors 

如果遇到任何错误,我们使用以下命令将错误打印到 stderr curl_easy_strerror() 它返回一个描述错误代码的字符串。 然后退出程序。

第 25-26 行:清理

curl_easy_cleanup(curl); return 0; 

curl_easy_cleanup() 使用 Curl 简易会话时,应该始终是最后调用的函数。 它会杀死传递给它的句柄以及与之相关的所有内存。 然后我们简单地返回一个整数并退出程序。

编译和执行程序

要编译程序,请使用:

$ gcc test.c -o fetch -O2 -Wall -lcurl 

在哪里,

  • gcc:是我们将使用的编译器的名称
  • test.c:是我们程序的名字
  • -o fetch:是一个标志,它告诉编译器存储可执行文件以将结果可执行文件存储为“fetch”
  • -O2:是产生优化代码的标志
  • -Wall:是一个显示更全面警告的标志
  • -lcurl:告诉编译器将程序链接到 libcurl

您可以在此处了解有关这些 GCC 标志的更多信息。

然后执行生成的可执行文件应该为我们获取网页:

$ ./fetch <!doctype html> <html> <head>     <title>Example Domain</title>      <meta charset="utf-8" />     <meta http-equiv="Content-type" content="text/html; charset=utf-8" />     <meta name="viewport" content="width=device-width, initial-scale=1" />     <style type="text/css">     body {         background-color: #f0f0f2;         margin: 0;         padding: 0;         font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;              }     div {         width: 600px;         margin: 5em auto;         padding: 2em;         background-color: #fdfdff;         border-radius: 0.5em;         box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);     }     a:link, a:visited {         color: #38488f;         text-decoration: none;     }     @media (max-width: 700px) {         div {             margin: 0 auto;             width: auto;         }     }     </style>     </head>  <body> <div>     <h1>Example Domain</h1>     <p>This domain is for use in illustrative examples in documents. You may use this     domain in literature without prior coordination or asking for permission.</p>     <p><a href="https://www.iana.org/domains/example">More information...</a></p> </div> </body> </html> 

结论

因此我们的程序来获取网页。 虽然这是一个非常基本的程序,但它为更复杂的操作铺平了道路,否则会成为噩梦。 您还可以从 FTP 服务器获取数据或抓取生成的数据以满足您的要求。