Парсер (скрапер) сайта
Пишу парсер на c++, который должен собирать расписание занятий. По туториалу на ютубе что-то более-менее рабочее написал, но автор видео использовал некое api (в моём коде это выглядело как std::string url = "ip-api.com"
, а также менялся параметр в req: req(http::verb::get, "/json/", 11)
), и, насколько я понял, при подстановке туда адреса моего сайта, код должен был возвращать json для нужного мне адреса. В результате же я получаю ошибку 301 Moved permanently. Хотелось бы понять, как решить эту проблему и что вообще должно возвращаться в моём случае, желательно с доп. теорией для лучшего понимания. Использование библиотеки boost обязательно.
#include <iostream>
#include <string>
#include <boost/beast.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/connect.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/property_tree/ptree.hpp>
namespace asio = boost::asio;
namespace beast = boost::beast;
namespace http = boost::beast::http;
class client{
public:
std::string getResponse(std::string ip){
std::string url = "lks.bmstu.ru";
beast::error_code ec;
asio::io_context io;
asio::ip::tcp::resolver resolver(io);
asio::ip::tcp::socket socket(io);
asio::connect(socket, resolver.resolve(url, "80"));
http::request<http::string_body> req(http::verb::get, "/schedule/83537f44-b8ff-11ed-a3ad-272ac9bbc1e7/", 11);
req.set(http::field::host, url);
req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
http::write(socket, req, ec);
std::string response;
{
beast::flat_buffer buffer;
http::response<http::dynamic_body> res;
http::read(socket, buffer, res);
response = beast::buffers_to_string(res.body().data());
}
socket.shutdown(asio::ip::tcp::socket::shutdown_both, ec);
return response;
}
};
std::string getField(std::string json, std::string field){
std::stringstream ss(json);
boost::property_tree::ptree root;
boost::property_tree::read_json(ss, root);
if (root.empty()){
return "Error";
}
return root.get<std::string>(field);
}
int main() {
client client;
std::string res = client.getResponse("lks.bmstu.ru");
std::cout << res;
return 0;
}