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提供一个示例,获取最近的热门电影和评分推荐合适的电影:
#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 删除。