CAPSOLVER
Blog
Cara menggunakan libcurl untuk WebScraping

Cara menggunakan libcurl untuk WebScraping

Logo of CapSolver

Ethan Collins

Pattern Recognition Specialist

22-Oct-2024

Web scraping adalah teknik yang ampuh untuk mengekstrak data dari situs web, memungkinkan otomatisasi tugas seperti mengumpulkan informasi harga, memantau pembaruan konten, atau mengumpulkan kumpulan data besar. Salah satu pustaka yang paling populer untuk melakukan web scraping di C++ adalah libcurl, pustaka transfer URL sisi klien yang gratis dan sumber terbuka. Ini mendukung beberapa protokol seperti HTTP, HTTPS, FTP, dan banyak lagi, menjadikannya pilihan ideal untuk mengambil konten web.

Pengantar libcurl

libcurl adalah pustaka C yang ampuh untuk membuat permintaan HTTP, mendukung berbagai protokol seperti HTTP, HTTPS, FTP, dan banyak lagi. Ini adalah alat yang fleksibel yang digunakan secara luas dalam aplikasi C++ untuk melakukan permintaan web.

Fitur:

  • Dukungan multi-protokol: HTTP, HTTPS, FTP, FTPS, SMTP, dan banyak lainnya.
  • Dukungan asinkron: Melalui CURLM untuk mengelola beberapa permintaan sekaligus.
  • Penanganan kesalahan: Menyediakan pesan kesalahan dan kode status terperinci.
  • Otentikasi: Mendukung dasar, pencernaan, NTLM, Negosiasi, dll.
  • Cookie dan sesi: Dapat mengelola cookie dan informasi sesi dengan mudah.

Prasyarat

Sebelum menggunakan libcurl, Anda harus:

  • Instal libcurl di sistem Anda.
  • Sertakan header curl/curl.h dalam kode C++ Anda.

Anda dapat menginstal libcurl di Linux dengan:

bash Copy
sudo apt-get install libcurl4-openssl-dev

Contoh Dasar: Membuat Permintaan GET

Berikut cara melakukan permintaan GET sederhana menggunakan libcurl di C++:

cpp Copy
#include <iostream>
#include <curl/curl.h>

static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp)
{
    ((std::string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

int main() {
    CURL* curl;
    CURLcode res;
    std::string readBuffer;

    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();
    
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://httpbin.org/get");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);

        res = curl_easy_perform(curl);
        if(res != CURLE_OK) {
            std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
        } else {
            std::cout << "Response: " << readBuffer << std::endl;
        }

        curl_easy_cleanup(curl);
    }
    curl_global_cleanup();
    
    return 0;
}

Contoh Web Scraping: Mengambil Data JSON dari API

Berikut adalah contoh di mana kita mengambil data dari API dan mencetak hasilnya:

cpp Copy
#include <iostream>
#include <curl/curl.h>

static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp)
{
    ((std::string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

int main() {
    CURL* curl;
    CURLcode res;
    std::string readBuffer;

    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);

        res = curl_easy_perform(curl);
        if(res != CURLE_OK) {
            std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
        } else {
            std::cout << "Response: " << readBuffer << std::endl;
        }

        curl_easy_cleanup(curl);
    }
    curl_global_cleanup();
    
    return 0;
}

Menangani Proksi dengan libcurl

Untuk mengarahkan permintaan Anda melalui server proxy dengan libcurl:

cpp Copy
#include <iostream>
#include <curl/curl.h>

static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp)
{
    ((std::string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

int main() {
    CURL* curl;
    CURLcode res;
    std::string readBuffer;

    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://httpbin.org/ip");
        curl_easy_setopt(curl, CURLOPT_PROXY, "http://proxyserver:8080");
        curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, "username:password");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);

        res = curl_easy_perform(curl);
        if(res != CURLE_OK) {
            std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
        } else {
            std::cout << "Response: " << readBuffer << std::endl;
        }

        curl_easy_cleanup(curl);
    }
    curl_global_cleanup();
    
    return 0;
}

libcurl dapat mengelola cookie dengan mengaktifkan opsi COOKIEFILE:

cpp Copy
#include <iostream>
#include <curl/curl.h>

static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp)
{
    ((std::string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

int main() {
    CURL* curl;
    CURLcode res;
    std::string readBuffer;

    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://httpbin.org/cookies/set?name=value");
        curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);

        res = curl_easy_perform(curl);
        if(res != CURLE_OK) {
            std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
        } else {
            std::cout << "Response: " << readBuffer << std::endl;
        }

        curl_easy_cleanup(curl);
    }
    curl_global_cleanup();
    
    return 0;
}

Penggunaan Lanjutan: Header Kustom dan Permintaan POST

Untuk mengirim header kustom atau melakukan permintaan POST dengan libcurl:

cpp Copy
#include <iostream>
#include <curl/curl.h>

static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp)
{
    ((std::string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

int main() {
    CURL* curl;
    CURLcode res;
    std::string readBuffer;
    
    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(curl) {
        struct curl_slist* headers = nullptr;
        headers = curl_slist_append(headers, "User-Agent: Mozilla/5.0");
        headers = curl_slist_append(headers, "Accept-Language: en-US,en;q=0.5");

        curl_easy_setopt(curl, CURLOPT_URL, "https://httpbin.org/post");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "username=testuser&password=testpass");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);

        res = curl_easy_perform(curl);
        if(res != CURLE_OK) {
            std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
        } else {
            std::cout << "Response: " << readBuffer << std::endl;
        }

        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    }
    curl_global_cleanup();

    return 0;
}

Contoh: Menyelesaikan ReCaptcha V3 dengan CapSolver dan libcurl (C++)

Dalam contoh ini, kami akan menunjukkan cara menyelesaikan ReCaptcha V3 menggunakan CapSolver: dengan pustaka libcurl di C++. API CapSolver memungkinkan interaksi mudah dengan tugas ReCaptcha dan mengambil solusi.

Sebelum memulai, pastikan Anda memiliki prasyarat berikut:

  • libcurl diinstal pada sistem Anda (instal melalui sudo apt-get install libcurl4-openssl-dev di Linux).
  • Kunci API CapSolver (ganti "YourKey" dalam kode di bawah dengan kunci Anda yang sebenarnya).

Berikut adalah panduan langkah demi langkah untuk menyelesaikan ReCaptcha V3 menggunakan CapSolver:

Langkah 1: Membuat Tugas

Langkah pertama adalah mengirim permintaan ke API CapSolver untuk membuat tugas untuk menyelesaikan ReCaptcha. Tugas tersebut mencakup detail seperti URL situs web, kunci situs (dari halaman target), dan tindakan halaman tertentu.

cpp Copy
#include <iostream>
#include <string>
#include <curl/curl.h>
#include <json/json.h>

const std::string CAPSOLVER_KEY = "YourKey";
const std::string PAGE_URL = "https://antcpt.com/score_detector";
const std::string PAGE_KEY = "6LcR_okUAAAAAPYrPe-HK_0RULO1aZM15ENyM-Mf";
const std::string PAGE_ACTION = "homepage";

static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
    ((std::string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

std::string createTask(const std::string& url, const std::string& key, const std::string& action) {
    CURL* curl;
    CURLcode res;
    std::string readBuffer;

    curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://api.capsolver.com/createTask");
        curl_easy_setopt(curl, CURLOPT_POST, 1L);

        // JSON payload for task creation
        Json::Value payload;
        payload["clientKey"] = CAPSOLVER_KEY;
        payload["task"]["type"] = "ReCaptchaV3TaskProxyLess";
        payload["task"]["websiteURL"] = url;
        payload["task"]["websiteKey"] = key;
        payload["task"]["pageAction"] = action;

        Json::StreamWriterBuilder writer;
        std::string requestData = Json::writeString(writer, payload);

        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestData.c_str());

        struct curl_slist* headers = nullptr;
        headers = curl_slist_append(headers, "Content-Type: application/json");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);

        res = curl_easy_perform(curl);
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    }
    return readBuffer;
}

Fungsi ini mengirim permintaan POST ke API CapSolver dengan detail tugas yang diperlukan dan mengembalikan respons, yang akan menyertakan taskId.

Langkah 2: Mengambil Solusi CAPTCHA

Setelah tugas dibuat, Anda perlu mengkueri API CapSolver untuk mendapatkan hasil tugas, yang berisi token untuk melewati tantangan ReCaptcha.

cpp Copy
std::string getTaskResult(const std::string& taskId) {
    CURL* curl;
    CURLcode res;
    std::string readBuffer;

    curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://api.capsolver.com/getTaskResult");
        curl_easy_setopt(curl, CURLOPT_POST, 1L);

        // JSON payload to get the task result
        Json::Value payload;
        payload["clientKey"] = CAPSOLVER_KEY;
        payload["taskId"] = taskId;

        Json::StreamWriterBuilder writer;
        std::string requestData = Json::writeString(writer, payload);

        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestData.c_str());

        struct curl_slist* headers = nullptr;
        headers = curl_slist_append(headers, "Content-Type: application/json");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);

        do {
            readBuffer.clear();
            res = curl_easy_perform(curl);
            std::this_thread::sleep_for(std::chrono::seconds(5));
        } while (readBuffer.find("\"status\":\"ready\"") == std::string::npos);

        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    }
    return readBuffer;
}

Fungsi ini berulang kali memeriksa status tugas hingga siap, pada saat itu mengembalikan solusi ReCaptcha.

Langkah 3: Menggabungkan Semuanya

Terakhir, berikut cara Anda dapat mengintegrasikan kedua fungsi tersebut ke dalam kode utama Anda:

cpp Copy
int main() {
    std::cout << "Creating CAPTCHA task..." << std::endl;
    std::string taskResponse = createTask(PAGE_URL, PAGE_KEY, PAGE_ACTION);

    Json::CharReaderBuilder reader;
    Json::Value jsonResponse;
    std::string errors;
    std::istringstream taskStream(taskResponse);
    std::string taskId;

    if (Json::parseFromStream(reader, taskStream, &jsonResponse, &errors)) {
        taskId = jsonResponse["taskId"].asString();
        std::cout << "Task ID: " << taskId << std::endl;

        std::cout << "Retrieving CAPTCHA result..." << std::endl;
        std::string resultResponse = getTaskResult(taskId);

        Json::Value resultJson;
        std::istringstream resultStream(resultResponse);
        Json::parseFromStream(reader, resultStream, &resultJson, &errors);

        std::string token = resultJson["solution"]["gRecaptchaResponse"].asString();
        std::cout << "Token Solution: " << token << std::endl;
    } else {
        std::cerr << "Error parsing task response: " << errors << std::endl;
    }

    return 0;
}

Kode ini akan:

  1. Membuat tugas ReCaptcha melalui CapSolver.
  2. Tunggu tugas selesai.
  3. Ambil solusi token ReCaptcha dan cetak.

Kode Bonus

Klaim Kode Bonus Anda untuk solusi captcha teratas di CapSolver: scrape. Setelah menukarkannya, Anda akan mendapatkan bonus tambahan 5% setelah setiap pengisian ulang, tanpa batas.

CapSolver Bonus

Kesimpulan

Dengan libcurl, Anda dapat dengan mudah menangani permintaan HTTP di aplikasi C++. Dengan mengintegrasikannya dengan CapSolver, Anda dapat menyelesaikan captcha seperti ReCaptcha V3 dan menggunakan hasilnya dalam permintaan Anda.

Pernyataan Kepatuhan: Informasi yang diberikan di blog ini hanya untuk tujuan informasi. CapSolver berkomitmen untuk mematuhi semua hukum dan peraturan yang berlaku. Penggunaan jaringan CapSolver untuk kegiatan ilegal, penipuan, atau penyalahgunaan sangat dilarang dan akan diselidiki. Solusi penyelesaian captcha kami meningkatkan pengalaman pengguna sambil memastikan kepatuhan 100% dalam membantu menyelesaikan kesulitan captcha selama pengambilan data publik. Kami mendorong penggunaan layanan kami secara bertanggung jawab. Untuk informasi lebih lanjut, silakan kunjungi Syarat Layanan dan Kebijakan Privasi.

Lebih lanjut

Cara Mengatasi Blok Pengambilan Data Web: Metode Praktis yang Efektif
Cara Mengatasi Hambatan Penyedotan Web: Metode Praktis yang Efektif

Pelajari cara mengatasi pembatasan pengambilan data web secara efektif. Temukan metode praktis, wawasan teknis tentang deteksi bot, dan solusi yang dapat diandalkan untuk ekstraksi data.

the-other-captcha
Logo of CapSolver

Ethan Collins

03-Apr-2026

Optimalkan Waktu Respons API Penyelesaian CAPTCHA untuk Otomatisasi yang Lebih Cepat
Optimalkan Waktu Respons API Penyelesaian CAPTCHA untuk Otomatisasi yang Lebih Cepat

Pelajari cara menyempurnakan waktu respons API penyelesaian CAPTCHA untuk otomasi yang lebih cepat dan andal. Panduan ini mencakup faktor kunci seperti kompleksitas CAPTCHA, kinerja API, dan strategi polling, dengan tips praktis menggunakan CapSolver untuk mencapai waktu penyelesaian di bawah 10 detik.

Logo of CapSolver

Ethan Collins

03-Apr-2026

Teknik Anti-Deteksi Pengambilan Data Web: Ekstraksi Data yang Stabil
Teknik Anti-Deteksi Pengambilan Data Web: Ekstraksi Data yang Stabil

Menguasai teknik anti-pendeteksian web scraping untuk memastikan ekstraksi data yang stabil. Pelajari cara menghindari deteksi dengan rotasi IP, optimasi header, fingerprinting browser, dan metode penyelesaian CAPTCHA.

Logo of CapSolver

Anh Tuan

03-Apr-2026

API Penyelesaian CAPTCHA vs Penyelesaian Manual: Biaya & Efisiensi (2026)
API Penyelesaian CAPTCHA vs Penyelesaian Manual: Biaya & Efisiensi (2026)

Bandingkan API penyelesaian CAPTCHA vs penyelesaian manual. Pelajari tentang biaya, kecepatan, dan efisiensi. Temukan mengapa API berbasis AI seperti CapSolver adalah pilihan terbaik untuk otomatisasi.

Logo of CapSolver

Adélia Cruz

03-Apr-2026

Penjelasan Waktu Respons API Penyelesaian CAPTCHA: Faktor Kecepatan & Kinerja
Penjelasan Waktu Respons API Penyelesaian CAPTCHA: Faktor Kecepatan dan Kinerja

Pahami waktu respons API penyelesaian CAPTCHA, dampaknya terhadap otomatisasi, dan faktor kunci yang memengaruhi kecepatan. Pelajari cara mengoptimalkan kinerja dan memanfaatkan solusi efisien seperti CapSolver untuk penyelesaian CAPTCHA yang cepat.

The other captcha
Logo of CapSolver

Emma Foster

03-Apr-2026

Apa Itu API Pemecah CAPTCHA? Bagaimana Cara Kerjanya dan Kapan Menggunakannya
Apa Itu API Pemecah CAPTCHA? Bagaimana Cara Kerjanya dan Kapan Menggunakannya

Pelajari apa itu API penyelesaian CAPTCHA, bagaimana cara kerjanya, dan kapan menggunakannya untuk otomatisasi. Temukan manfaat penyelesaian CAPTCHA berbasis AI untuk scraping web.

The other captcha
Logo of CapSolver

Sora Fujimoto

02-Apr-2026