21xrx.com
2024-12-22 22:53:34 Sunday
登录
文章检索 我的文章 写文章
C++利用Jsoup进行网络数据爬取
2023-07-10 02:54:35 深夜i     --     --
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的繁琐过程。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复