C++ Libcurl获取NCBI BioProject所有页结果:提取基因Accession号

本博客文章提供了一个C++代码示例,该示例使用Libcurl库从NCBI BioProject数据库中检索所有页面的结果,并提取基因Accession号。

代码

#include <iostream>
#include <fstream>
#include <string>
#include <curl/curl.h>

// 回调函数,用于处理libcurl接收到的数据
size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) {
    size_t total_size = size * nmemb;
    output->append((char*)contents, total_size);
    return total_size;
}

int main() {
    // 输入基因名字
    std::string gene_name;
    std::cout << '请输入基因名字:';
    std::cin >> gene_name;

    // 构建搜索URL
    std::string search_url = 'https://www.ncbi.nlm.nih.gov/bioproject/?term=' + gene_name;

    // 初始化libcurl
    curl_global_init(CURL_GLOBAL_ALL);
    CURL* curl = curl_easy_init();
    if (curl) {
        // 设置libcurl选项
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);

        // 创建回调函数的输出字符串
        std::string response;

        // 设置回调函数
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

        // 声明当前页和总页数的变量
        size_t current_page = 1;
        size_t total_pages = 1;

        // 执行HTTP请求直到获取所有页的结果
        while (current_page <= total_pages) {
            // 发送请求并检查是否成功
            curl_easy_setopt(curl, CURLOPT_URL, (search_url + '&page=' + std::to_string(current_page)).c_str());
            CURLcode res = curl_easy_perform(curl);

            if (res != CURLE_OK) {
                std::cerr << '请求失败:' << curl_easy_strerror(res) << std::endl;
                return 1;
            }

            // 在response中查找总页数
            if (current_page == 1) {
                size_t page_start_pos = response.find('Page 1 of ');
                if (page_start_pos != std::string::npos) {
                    size_t page_end_pos = response.find('</div>', page_start_pos);
                    std::string page_info = response.substr(page_start_pos, page_end_pos - page_start_pos);
                    total_pages = std::stoi(page_info.substr(10));
                }
            }

            // 在response中查找Accession号
            size_t start_pos = 0;
            while ((start_pos = response.find('Accession:', start_pos)) != std::string::npos) {
                size_t accession_start = start_pos + 10;
                size_t accession_end = response.find('</dd>', accession_start);
                std::string accession_number = response.substr(accession_start, accession_end - accession_start);
                std::ofstream output_file('accession_numbers.txt', std::ios::app);
                if (output_file.is_open()) {
                    output_file << accession_number << std::endl;
                    output_file.close();
                } else {
                    std::cerr << '无法打开文件' << std::endl;
                    return 1;
                }
                start_pos = accession_end;
            }

            // 当前页数加1
            current_page++;
        }

        // 关闭libcurl
        curl_easy_cleanup(curl);

        std::cout << 'Accession号已写入accession_numbers.txt' << std::endl;
    } else {
        std::cerr << '无法初始化libcurl' << std::endl;
        return 1;
    }

    // 清理libcurl
    curl_global_cleanup();

    return 0;
}

说明

  1. 包含头文件: 代码包含了必要的头文件,包括 <iostream>, <fstream>, <string>, 和 <curl/curl.h>
  2. WriteCallback 函数: 该函数处理 libcurl 接收到的数据,并将数据追加到一个字符串中。
  3. main 函数:
    • 获取基因名称: 代码首先提示用户输入基因名称。
    • 构建搜索 URL: 代码使用输入的基因名称构建 NCBI BioProject 数据库的搜索 URL。
    • 初始化 libcurl: 代码初始化 libcurl 库并创建一个 CURL 句柄。
    • 设置 libcurl 选项: 代码设置 libcurl 选项,包括跟随重定向 (CURLOPT_FOLLOWLOCATION)。
    • 创建输出字符串: 代码创建一个字符串来存储从服务器接收到的响应。
    • 设置回调函数: 代码设置 CURLOPT_WRITEFUNCTION 选项以指定 WriteCallback 函数用于处理接收到的数据。
    • 循环获取所有页面: 代码使用一个 while 循环来迭代所有结果页面。
    • 发送 HTTP 请求: 在循环的每次迭代中,代码使用 curl_easy_perform 函数发送一个 HTTP 请求到 NCBI BioProject 数据库。
    • 查找总页数: 在第一次迭代中,代码解析响应以查找总页数。
    • 提取 Accession 号: 对于每个页面,代码解析响应以查找并提取 Accession 号。
    • 写入文件: 代码将提取到的 Accession 号写入一个名为 'accession_numbers.txt' 的文件。
    • 清理 libcurl: 最后,代码清理 libcurl 资源。

总结

这段代码演示了如何使用 C++ 和 libcurl 库从 NCBI BioProject 数据库中检索所有页面的结果,并提取基因 Accession 号。它提供了一个网页抓取和数据提取的简单示例。

C++ Libcurl获取NCBI BioProject所有页结果:提取基因Accession号

原文地址: https://www.cveoy.top/t/topic/fUdF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录