Skip to content

Commit 445659f

Browse files
committed
process url
1 parent 0cfa144 commit 445659f

File tree

2 files changed

+30
-32
lines changed

2 files changed

+30
-32
lines changed

Crowler.cpp

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,24 @@ using tcp = net::ip::tcp; // from <boost/asio/ip/tcp.hpp>
2424

2525
Crowler::Crowler() {}
2626

27+
void Crowler::processUrl(std::string url, short depth)
28+
{
29+
// полный процессинг ресурса: получение слов, сохранение а базу данных, получение внутренних ресурсов
30+
std::string html = download(url);
31+
std::vector<std::string> words = getWords(html);
32+
std::vector<std::string> subUrls = getSubUrls(html);
33+
savePresencesToDb(words, url);
34+
35+
// если глубина не 1, обход внутренних ресурсов с уменьшенной на 1 глубиной
36+
// если рекурсивно (или сразу) попали сюда с глубиной 1, дальнейшего обхода не будет
37+
if (depth != 1) {
38+
depth--;
39+
for (auto& subUrl : subUrls) {
40+
processUrl(subUrl, depth);
41+
}
42+
}
43+
}
44+
2745
std::string Crowler::download(std::string url)
2846
{
2947
try
@@ -49,13 +67,6 @@ std::string Crowler::download(std::string url)
4967
tcp::resolver resolver(ioc);
5068
beast::ssl_stream<beast::tcp_stream> stream(ioc, ctx);
5169

52-
// Set SNI Hostname (many hosts need this to handshake successfully)
53-
// if(! SSL_set_tlsext_host_name(stream.native_handle(), host))
54-
// {
55-
// beast::error_code ec{static_cast<int>(::ERR_get_error()), net::error::get_ssl_category()};
56-
// throw beast::system_error{ec};
57-
// }
58-
5970
// Look up the domain name
6071
auto const results = resolver.resolve(host, port);
6172

@@ -83,22 +94,8 @@ std::string Crowler::download(std::string url)
8394
http::read(stream, buffer, res);
8495

8596
std::string const strBody = boost::beast::buffers_to_string(res.body().data());
86-
// std::cout << res << std::endl;
87-
// std::cout << boost::beast::buffers_to_string(res.body().data()) << std::endl;
88-
89-
// Gracefully close the stream
9097
beast::error_code ec;
9198
stream.shutdown(ec);
92-
// if(ec == net::error::eof)
93-
// {
94-
// // Rationale:
95-
// // http://stackoverflow.com/questions/25587403/boost-asio-ssl-async-shutdown-always-finishes-with-an-error
96-
// ec = {};
97-
// }
98-
// if(ec)
99-
// throw beast::system_error{ec};
100-
101-
// If we get here then the connection is closed gracefully
10299
return strBody;
103100
}
104101
catch(std::exception const& e)
@@ -136,7 +133,7 @@ std::vector<std::string> Crowler::getSubUrls(std::string s)
136133
return getDataFromHtml(s, word_regex);
137134
}
138135

139-
std::vector<WordPresence> Crowler::calculatePresences(std::vector<std::string> words, std::string url)
136+
void Crowler::savePresencesToDb(std::vector<std::string> words, std::string url)
140137
{
141138
std::vector<WordPresence> wordsPresence;
142139

@@ -146,11 +143,11 @@ std::vector<WordPresence> Crowler::calculatePresences(std::vector<std::string> w
146143
++map[word];
147144
}
148145

149-
// преобразование map к вектору структур
146+
// преобразование map к структуре и сохранение в базу данных
147+
DbManager dbManager = DbManager();
150148
for (const auto& wordFrequency : map) {
151149
WordPresence presence = WordPresence{wordFrequency.first, url, wordFrequency.second};
152-
wordsPresence.push_back(presence);
150+
dbManager.insertPresence(presence);
153151
}
154152

155-
return wordsPresence;
156153
}

Crowler.h

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,20 @@
88
class Crowler
99
{
1010
private:
11-
// получение данных из HTML
12-
std::vector<std::string> getDataFromHtml(std::string s, std::regex filter);
13-
14-
public:
15-
Crowler();
1611
// скачивание html по url
1712
std::string download(std::string url);
13+
// получение данных из HTML
14+
std::vector<std::string> getDataFromHtml(std::string s, std::regex filter);
1815
// получение слов из скачанного html
1916
std::vector<std::string> getWords(std::string innerHtml);
2017
// получение ссылок из скачанного html
2118
std::vector<std::string> getSubUrls(std::string innerHtml);
22-
// вычисление частот слов
23-
std::vector<WordPresence> calculatePresences(std::vector<std::string> words, std::string url);
19+
// вычисление частот слов и сохранение данных в базу
20+
void savePresencesToDb(std::vector<std::string> words, std::string url);
21+
22+
public:
23+
Crowler();
24+
void processUrl(std::string url, short depth);
2425
};
2526

2627
#endif // CROWLER_H

0 commit comments

Comments
 (0)