21xrx.com
2025-04-03 09:24:22 Thursday
文章检索 我的文章 写文章
C++利用Jsoup进行网络数据爬取
2023-07-10 02:54:35 深夜i     16     0
C++ Jsoup 网络数据 爬取 数据抓取

C++是一种强大而又灵活的编程语言,现在被越来越多的程序员使用。一种使用C++进行网络数据爬取的工具是Jsoup。Jsoup是一个HTML解析器,可以方便地从网络上获取HTML内容,并从中提取特定的信息。

要使用Jsoup,请首先下载由Jsoup提供的jar包,并添加到你的C++项目中。接着,你需要知道你需要从目标网站上爬取哪些数据。一旦确定了目标数据,你就可以开始编写C++代码,使用Jsoup来爬取该数据。

首先,你需要通过C++的网络API获取目标网站的HTML内容。随后,你可以使用Jsoup解析该HTML内容,并从中提取关键信息。熟练掌握Jsoup可以使得这一过程变得十分简单和高效。

例如,我们要从目标网站上爬取新闻标题和正文。首先,我们使用C++的网络API来获取页面HTML内容:

#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
using namespace std;
int main() {
  WSADATA wsaData;
  if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    cerr << "Unable to initialize Winsock." << endl;
    return 1;
  
  const char* hostname = "example.com";
  const char* path = "/news";
  struct addrinfo hints;
  memset(&hints, 0, sizeof hints);
  hints.ai_family = AF_INET;
  hints.ai_socktype = SOCK_STREAM;
  struct addrinfo* result;
  if (getaddrinfo(hostname, "http", &hints, &result) != 0)
    cerr << "Unable to resolve hostname." << endl;
    return 1;
  
  int sock = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
  if (sock == -1) {
    cerr << "Unable to create socket." << endl;
    freeaddrinfo(result);
    return 1;
  }
  if (connect(sock, result->ai_addr, result->ai_addrlen) == -1) {
    cerr << "Unable to connect to server." << endl;
    freeaddrinfo(result);
    closesocket(sock);
    return 1;
  }
  const char* request = "GET /news HTTP/1.1\r\n"
             "Host: example.com\r\n"
             "Connection: close\r\n"
             "\r\n";
  int sent = send(sock, request, strlen(request), 0);
  if (sent == -1) {
    cerr << "Unable to send request." << endl;
    freeaddrinfo(result);
    closesocket(sock);
    return 1;
  }
  char response[4096];
  int n = recv(sock, response, sizeof response, 0);
  if (n == -1) {
    cerr << "Unable to receive response." << endl;
    freeaddrinfo(result);
    closesocket(sock);
    return 1;
  }
  // Now we have the HTML response in the response variable.
  closesocket(sock);
  freeaddrinfo(result);
  WSACleanup();
  return 0;
}

在获取了页面的HTML响应后,我们就可以使用Jsoup来解析该响应。

#include <iostream>
#include <string>
#include "jsoup-1.13.1.jar"
using namespace std;
int main() {
  const char* html = "<html><head><title>News</title></head><body><h1>News Headline</h1><p>News content</p></body></html>";
  try {
    string html_str(html);
    org::jsoup::Jsoup::parse(html_str);
    auto title = org::jsoup::Jsoup::connect("http://example.com/news")->get()->title();
    auto p = org::jsoup::Jsoup::connect("http://example.com/news")
      ->get()
      ->select("p")
      ->first();
    cout << title << endl;
    cout << p->text() << endl;
  } catch (const exception& e) {
    cout << "error: " << e.what() << endl;
  }
  return 0;
}

在上述代码中,我们使用Jsoup将HTML字符串解析成一个Document对象,并使用Document对象的select方法来查找元素。

通过这种方式,我们可以方便地使用C++和Jsoup来从目标网站上爬取数据,并且避免了手动解析HTML的繁琐过程。

  
  

评论区

请求出错了