前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++在数据分析和网络爬虫的应用

C++在数据分析和网络爬虫的应用

原创
作者头像
jackcode
发布2023-06-20 16:18:41
3990
发布2023-06-20 16:18:41
举报
文章被收录于专栏:爬虫资料
亿牛云代理
亿牛云代理

C++是一种功能强大的编程语言,提供高性能、高效性和灵活性,适用于各种应用程序。其中,数据分析是C++的一个重要领域,涉及大量数据的收集、处理和解释。C++可以有效处理使用HTTP、FTP、JSON、XML等各种协议和格式的网络通信和数据采集任务。

此外,C++还可用于构建网络爬虫程序,自动检索和分析互联网上的网页内容。为了简化和增强开发过程,可使用爬虫框架和语言库。爬虫框架提供了基本功能和结构,语言库则是可重用代码和函数的集合。在C++中,有许多适用于网络爬虫和数据分析的语言库可供选择,如Boost、Qt和POCO等。其中,Boost是一个集合了各种任务支持的C++库,包括网络、解析和并发等。特别是Boost.Beast库,能够处理HTTP和WebSocket通信,对于网络爬虫而言非常有用。此外,Boost还提供其他库,可以辅助解析HTML、XML、JSON等格式的数据。

马上暑期档就要开始,用c++和Boost.Beast提供一个示例,获取最近的热门电影和评分推荐合适的电影:

代码语言:c++
复制
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>
#include <boost/beast/version.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/connect.hpp>
#include <boost/asio/ssl.hpp>
#include <boost/asio/ssl/stream.hpp>
#include <boost/asio/thread_pool.hpp>

namespace beast = boost::beast;
namespace http = beast::http;
namespace asio = boost::asio;
using tcp = asio::ip::tcp;

void scrapeMovieData(asio::io_context& ioContext, const std::string& host, const std::string& port, const std::string& proxyHost, const std::string& proxyPort, const std::string& proxyUsername, const std::string& proxyPassword)
{
    asio::ssl::context sslContext(asio::ssl::context::tlsv12_client);

    tcp::resolver resolver(ioContext);
    tcp::resolver::query query(proxyHost, proxyPort);
    tcp::resolver::iterator endpointIterator = resolver.resolve(query);

    asio::ssl::stream<tcp::socket> socket(ioContext, sslContext);
    asio::connect(socket.next_layer(), endpointIterator);

    if (!proxyUsername.empty() && !proxyPassword.empty())
    {
        std::string authString = proxyUsername + ":" + proxyPassword;
        std::string encodedAuthString = beast::detail::base64_encode(authString);
        std::string proxyAuthHeader = "Proxy-Authorization: Basic " + encodedAuthString;
        socket.next_layer().write(asio::buffer(proxyAuthHeader + "\r\n"));
    }

    socket.handshake(asio::ssl::stream_base::client);

    http::request<http::string_body> request(http::verb::get, "/", 11);
    request.set(http::field::host, host);
    request.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);

    http::write(socket, request);

    beast::flat_buffer buffer;
    http::response<http::dynamic_body> response;

    http::read(socket, buffer, response);

    std::vector<std::string> movieNames;
    std::vector<std::string> movieRatings;

    std::size_t startPos = 0;
    std::size_t endPos = 0;

    std::string responseBody = boost::beast::buffers_to_string(response.body().data());
    while ((startPos = responseBody.find("<a class=\"\">", endPos)) != std::string::npos)
    {
        startPos += 13;
        endPos = responseBody.find("</a>", startPos);
        std::string movieName = responseBody.substr(startPos, endPos - startPos);

        startPos = responseBody.find("<span class=\"rating_nums\">", endPos) + 25;
        endPos = responseBody.find("</span>", startPos);
        std::string movieRating = responseBody.substr(startPos, endPos - startPos);

        movieNames.push_back(movieName);
        movieRatings.push_back(movieRating);
    }

    std::ofstream outputFile("movie_data.xlsx");
    if (outputFile)
    {
        outputFile << "电影名称\t评分\n";
        for (std::size_t i = 0; i < movieNames.size(); ++i)
        {
            outputFile << movieNames[i] << "\t" << movieRatings[i] << "\n";
        }
        outputFile.close();
        std::cout << "数据采集成功,并保存到'movie_data.xlsx'文件中。" << std::endl;
    }
    else
    {
        std::cout << "无法打开输出文件。" << std::endl;
    }
}

int main()
{
    const std::string host = "movie.douban.com";
    const std::string port = "443";
    //亿牛云 爬虫代理加强版
    //设置代理IP信息,主机、端口、用户名和密码
    const std::string proxyHost = "www.16yun.cn";
    const std::string proxyPort = "8080";
    const std::string proxyUsername = "16YUN";
    const std::string proxyPassword = "16IP";

    asio::io_context ioContext;
    asio::thread_pool threadPool;

    for (int i = 0; i < 10; ++i)
    {
        asio::post(threadPool, [=, &ioContext]() {
            scrapeMovieData(ioContext, host, port, proxyHost, proxyPort, proxyUsername, proxyPassword);
        });
    }

    threadPool.join();

    return 0;
}

执行该代码将采集豆瓣电影TOP10的热门电影名称和评分,并将结果打印并存储到名为movie_data.xlsx的Excel文件中。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档