使用 libxml2 和 libcurl 在 C++ 中进行网络抓取

在本文中,我将引导你使用两个功能强大的库,用 C 语言创建一个自定义网络刮擦程序: libcurl 用于处理 HTTP 请求和 libxml2 来解析 HTML。让我们开始搜索吧!

为什么使用 C 语言进行网络抓取?

C 语言以其高性能而著称。它的速度使其成为需要快速提取和处理数据的任务的合适选择,尤其是在处理大型数据集时。虽然 Python 等语言提供了用于网络搜索的简单库,但它们可能无法与 C 语言提供的原始性能相媲美。

使用 C 进行 Web 抓取的主要优势如下:

  1. 速度 C 语言比 Python 等高级语言更快,因此当速度是一个关键因素时,C 语言是理想的选择。
  2. 控制资源: C 语言允许您直接管理系统资源(如内存),这有助于优化性能。
  3. 可扩展性: C 语言能高效处理大规模网络刮擦操作,因此非常适合从多个来源或大型网站中提取数据。

所需工具

要用 C 构建 Web 爬虫,你需要安装一些库,它们可以帮助你处理 HTTP 请求和 HTML 解析。

  1. libcurl:这是一个功能强大、使用广泛的 HTTP 请求库。它支持多种协议,包括 HTTP、HTTPS 和 FTP。
  2. libxml2:该库提供解析 XML 和 HTML 文档的工具。它支持 XPath 和 XSLT,是从网站上获取数据的绝佳选择。
  3. C 语言编译器:标准 C 语言编译器,如 g (GCC) 是编译代码所必需的。

设置开发环境

在开始编码之前,您需要安装所需的库来设置您的开发环境。

使用 vcpkg(适用于 Windows、macOS 和 Linux)

vcpkg 是一个跨平台包管理器,可简化 libcurl 和 libxml2 等库的安装。

在系统中安装 vcpkg。按照 vcpkg 的 GitHub 页面.

安装完成后,打开终端,运行以下命令安装程序库:

vcpkg install curl libxml2

对于 Visual Studio 用户,请运行以下命令将 vcpkg 与 MSBuild 集成:

vcpkg 集成安装

使用 apt(Linux)

在 Ubuntu 这类基于 Debian 的系统上,你可以直接使用包管理器安装 libcurl 和 libxml2:

sudo apt-get install libcurl4-openssl-dev libxml2-dev

HTTP 基础知识:网络抓取的工作原理

网页抓取首先要向服务器发送 HTTP 请求。服务器会返回包含所需数据的 HTTP 响应,通常以 HTML 文档的形式提供。HTTP 协议对于网页抓取至关重要,因为它定义了请求和响应的处理方式。

在收件箱中接收《数据日报》的报道

扫描网站时,您通常需要制作一个 获取 请求,从服务器获取数据。下面是一个请求访问网站的示例:

GET /dictionary/esoteric HTTP/1.1
主机:www.merriam-webster.com
User-Agent: curl/8.9.1
接受:*/*

服务器收到请求后,会返回一个 HTTP 响应,其中包含状态代码(如 200 OK)和所请求的内容,通常是 HTML 页面。

构建网络抓取器

既然我们已经了解了 HTTP 的基础知识,那就开始构建网络刮板吧。

步骤 1:初始化项目

首先,为项目创建一个目录:

mkdir 刮刀
CD 刮刀
触摸 scraper.cc

这将是主文件,我们将在其中编写刮板的代码。

步骤 2:编写主函数

在 C 语言中,每个程序都以 main() 函数开始执行。在这里,我们将编写处理输入、调用请求和刮擦函数并输出结果的主函数。

#包括 
#包括 
#包括 
#包括 <curl/curl.h>
#包括 <libxml/HTMLparser.h>
#包括 <libxml/xpath.h>
int main(int argc、 烧掉 **argv)
{
if (argc != 2)
{
std::cout << "请提供一个有效的英文单词" << std::endl;
return EXIT_FAILURE;
}
std::string word = argv[1];
std::string page_content = request(字);
std::cout << 刮削(page_content) << std::endl;
return EXIT_SUCCESS;
}

该函数检查是否有单词作为命令行参数传递,并调用 request() 和 scrape() 函数。

步骤 3:请求功能:获取 HTML 内容

为了从网站获取 HTML 内容,我们将使用 libcurl。request() 函数会向网站发送 HTTP 请求,并检索 HTML 内容。

std::string request(std::string word)
{
CURLcode res_code = CURLE_FAILED_INIT;
CURL *curl = curl_easy_init();
std::string result;
std::string url = "https://www.merriam-webster.com/dictionary/"   字;
if (curl)
{
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_USERAGENT、 "简单刮刀");
// 处理响应的函数
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION、
静态投射<size_t (*)(烧掉 *, size_t, size_t, std::string *)>(
[](烧掉 *内容、 size_t 尺寸 size_t nmemb, std::string *data) -> size_t
{
size_t new_size = size * nmemb;
data->追加(内容,new_size);
return new_size;
}));
curl_easy_setopt(curl,CURLOPT_WRITEDATA,&result);
// 执行请求
res_code = curl_easy_perform(卷曲);
if (res_code != CURLE_OK)
{
return curl_easy_strerror(res_code);
}
curl_easy_cleanup(curl);
}
return 结果;
}

该函数初始化 libcurl 对象、发送请求并检索单词词典页面的 HTML 内容。

步骤 4:抓取功能:使用 XPath 提取数据

现在我们有了 HTML 内容,需要使用 libxml2 和 XPath 提取相关数据(单词定义)。

std::string 刮削(std::string markup)
{
std::string res = "";
// 解析 HTML 内容
htmlDocPtr doc = htmlReadMemory(标记。c_str(), 标记。length(), NULL, NULL, html_parse_noerror);
xmlXPathContextPtr context = xmlXPathNewContext(文件);
// XPath 查找定义
xmlXPathObjectPtr result = xmlXPathEvalExpression((xmlChar *)"//div[包含(@class,'vg-sseq-entry-item')]/div[包含(@class,'sb')]//span[包含(@class,'dtText')]"上下文);
if (result->nodesetval == NULL)
{
return "未找到定义"。;
}
for (int i = 0; i nodesetval->nodeNr; i)
{
烧掉 *def = (烧掉 *)xmlNodeGetContent(result->nodesetval->nodeTab[i]);
res = def;
res = "n";
免费的(def);
}
xmlFreeDoc(文件);
xmlCleanupParser();
return res;
}

在该函数中,我们解析 HTML 内容,评估 XPath 表达式以查找定义,并将结果存储在字符串中。

步骤 5:转换为小写的辅助函数

我们还需要一个辅助函数,在向网站发送请求之前将单词转换为小写。

std::string strtolower(std::string str)
{
std::(str.兴办(), str.end(), str.兴办(), ::tolower);
return str;
}

该函数只是将输入字符串转换为小写。

编译和运行扫瞄器

现在代码已经准备就绪,是时候编译并运行刮板了。使用以下命令编译代码:

g scraper.cc -lcurl -lxml2 -std=c  11 -o 刮刀

编译完成后,使用您选择的单词运行刮擦程序。例如

./scraper esoteric

你会看到 "esoteric "一词的字典定义输出到控制台。

最佳人工智能网络抓取工具

您在寻找更多利用自动化或人工智能促进数据收集的方法吗?探索当今最好的人工智能网络搜索工具。如需了解更多信息,请查看 最佳人工智能网络搜索工具 并看看哪些平台更突出,比如 Bright Data 和 ScrapingBee。

结论

在本教程中,我们探讨了如何使用 libcurl 和 libxml2 在 C 中构建自定义网页爬虫。虽然 Python 可能更常用于网页抓取,但 C 在性能和可扩展性方面具有显著优势,尤其适合大规模抓取任务。我们还演示了如何从网站获取 HTML 内容、解析它,并使用 XPath 提取相关数据。

虽然本示例侧重于相对简单的用例,但 C 语言网页抓取可以扩展到处理更复杂的情况,如处理 JavaScript、使用代理或避免反抓取措施。利用 C 语言的强大功能,您可以为任何数据提取任务创建高效、可扩展的网络刮擦程序。

类似文章