Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/30: Рейтинг темы: голосов - 30, средняя оценка - 4.57
vantyz
54 / 54 / 2
Регистрация: 04.03.2012
Сообщений: 495
1

Сохранение страниц сайтов в формате html

28.03.2012, 19:59. Просмотров 5537. Ответов 61
Метки нет (Все метки)

привет,ребят кто может помочь написать такую штуку,у нас есть файлик url.txt там адреса сайтов, скрипт ходит по адресам сайтов указанных в url.txt и сохраняет страницы этих сайтов в формате html.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2012, 19:59
Ответы с готовыми решениями:

Скачивание страниц и сохранение частей в файл
Привет всем. Мне нужно примерно понять, как написать программу, которая будет: 1. Открывать...

Конструктор сайтов (продающихся страниц)
Приветствую всех. интересует вопрос по созданию конструктора лендингов. а именно, 1. на чем...

Сбор данных со страниц сайтов
Доброго времени суток! решил реализовать такую феньку: есть n-ное кол-во чужих сайтов. на этих...

У 90% сайтов осталось по 10 страниц в индексе
Здравствуйте! У меня есть несколько сайтов (12), это сайты конкретных клиентов, т.е. полный уник...

CGI. Как получить данные из html формы и отослать данные клиенту в html формате?
Господа помогите с cgi. Никогда этого не делал под VB, а сейчас очень надо. Как получить данные из...

61
igorrr37
2035 / 1600 / 799
Регистрация: 21.12.2010
Сообщений: 2,751
Записей в блоге: 10
28.03.2012, 20:52 2
Лучший ответ Сообщение было отмечено как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include <iostream>
#include <string>
#include <fstream>
#include <windows.h>
#include <boost/regex.hpp>
#include <boost/asio.hpp>
#include <boost/scope_exit.hpp>
typedef boost::asio::ip::tcp tcp;
 
class HttpDownloader
{
public:
    HttpDownloader() : sock(io), resolver(io), reqStream(&buf), respStream(&buf){}
    int Download(const std::string& uri_, const std::string& pathToSave = "")
    {
        uri = uri_;
        BOOST_SCOPE_EXIT((&sock)(&err)(&buf))
        {
            if(sock.shutdown(tcp::socket::shutdown_both, err))
            {
                std::cerr << "sock_shutdown() failed: " << err.message() << std::endl;
            }
            sock.close();
            buf.consume(buf.size());
            std::cout << "resources released\n";
        } BOOST_SCOPE_EXIT_END;
        while(true)
        {
            if(ParseUri())
            {
                std::cerr << "ParseUri() failed\n";
                return __LINE__;
            }
            tcp::resolver::query q(url, "http");
            tcp::resolver::iterator it = resolver.resolve(q, err), itEnd;
            if (err)
            {
                std::cerr << "resolve() failed:\n" << err.message() << "\n";
                return __LINE__;
            }
            err = boost::asio::error::host_not_found;
            while (err && it != itEnd)
            {
                sock.close();
                sock.connect(*it++, err);
            }
            if (err)
            {
                std::cerr << "connect() failed:\n" << err.message() << "\n";
                return __LINE__;
            }
            reqStream << "GET " << urn << " HTTP/1.0\r\n"
                    << "Host: " << url << "\r\n"
                    << "Connection: close\r\n\r\n";
            boost::asio::write(sock, buf);
            boost::asio::read_until(sock, buf, boost::regex("(?:\r\n){2,}"));
            std::string headers, tmp;
            while(std::getline(respStream, tmp) && tmp!="\r")
            {
                headers += (tmp + '\n');
            }
            std::cout << headers << "\n";
            if (!boost::regex_search(headers, res, boost::regex("HTTP/\\d\\.\\d +\\d{3}.*\r")))
            {
                std::cerr << "\nUnexpected starting line" << std::endl;
                return __LINE__;
            }
            if(boost::regex_search(headers, res, boost::regex("Location: ([^ \r]+)")))
            {
                uri = res[1];
                std::cout << "Trying use new uri:\n" << uri << "\n\n";
                buf.consume(buf.size());
            }
            else break;
        }
        if(!boost::regex_search(urn, res, boost::regex("/([^\\Q/:<>\"\\|?*\\E]*)[^/]*$")))
        {
            std::cerr << "urn parsing failed\n";
            return __LINE__;
        }
        std::string filePath = (pathToSave.empty() ? res[1] : pathToSave);
        if(filePath.find('.') == std::string::npos) filePath += "_.html";
        std::cout << "filePath= " << filePath << "\n";
        std::ofstream ofs(filePath, std::ios::binary);
        if (!ofs) {std::cerr << "Can't create file\n"; return __LINE__;}
        if(buf.size()) ofs << &buf;
        while (boost::asio::read(sock, buf, boost::asio::transfer_at_least(1), err))
        {
            ofs << &buf;
        }
        ofs.close();
        if (err != boost::asio::error::eof)
        {
            std::cerr << "read() failed\n" << err.message() << "\n";
            return __LINE__;
        }
        return 0;
    }
private:
    int ParseUri()
    {
        if (!boost::regex_match(uri, res, boost::regex("(?:[url]http://)?([/url][^/]+)(.*)" ))) return 1;
        url = res[1];
        if ((urn = res[2]).empty()) urn = "/";
        return 0;
    }
    std::string uri, url, urn;
    boost::smatch res;
    boost::asio::io_service io;
    tcp::socket sock;
    tcp::resolver resolver;
    boost::system::error_code err;
    boost::asio::streambuf buf;
    std::ostream reqStream;
    std::istream respStream;
};
 
int main(){
    SetConsoleOutputCP(1251);
    try
    {
        std::ifstream ifs("1.txt");
        if(ifs)
        {
            HttpDownloader d;
            std::string sUri;
            while(std::getline(ifs, sUri))
            {
                d.Download(sUri);
            }
        }
        else std::cerr << "Can't open file\n";
        ifs.close();
    }
    catch (const std::exception& e)
    {
        std::cerr << "Exception:\n" << e.what() << std::endl;
    }
    return 0;
}
9
Миниатюры
Сохранение страниц сайтов в формате html  
Dima249
10 / 10 / 1
Регистрация: 02.10.2011
Сообщений: 69
28.03.2012, 21:00 3
igorrr37, я поинтересовался решил попробовать как программа ваша работает и у меня ошибка с boost/regex.hpp не удается открыть пишет
1
vantyz
54 / 54 / 2
Регистрация: 04.03.2012
Сообщений: 495
28.03.2012, 21:32  [ТС] 4
igorrr37 а откуда взялся какой-то boost/regex.hpp ,а можете пожалуйста прокомментировать ваш код ,мне будет понятнее для обучения,по вашему примеру.Огромное спасибо.

Добавлено через 3 минуты
а что такое boost/regix.hpp я разобрался.Как гласит википедия это-собрание библиотек, расширяющих функциональность C++. А теперь можете, пожалуйста ,прокомментировать код,чтобы было понятно где ,и что к чему.

Добавлено через 2 минуты
А кто нибудь может здесь скинуть файлы boost используемые в примере,а то качать 90 метров с офиц сайта многовато.
0
28.03.2012, 21:32
Avazart
Нарушитель
Эксперт С++
7902 / 5727 / 564
Регистрация: 10.12.2010
Сообщений: 26,215
Записей в блоге: 17
28.03.2012, 22:06 5
Это огромная библиотека с множеством подбиблиотек в том числе с регулярными выражениями.
Так что лучше качать.

Кстати какую IDE используете?
1
igorrr37
2035 / 1600 / 799
Регистрация: 21.12.2010
Сообщений: 2,751
Записей в блоге: 10
28.03.2012, 22:10 6
есть архив и на 45 мб
http://sourceforge.net/projects/boos..._0.7z/download
2
vantyz
54 / 54 / 2
Регистрация: 04.03.2012
Сообщений: 495
29.03.2012, 18:20  [ТС] 7
О вот это уже хорошо,ну так igorrr37 можете плиз прокомментировать код.

Добавлено через 9 часов 43 минуты
C++
1
std::ifstream ifs("1.txt");
А вот это что за строчка ,откуда берутся юрл?

Добавлено через 4 часа 45 минут
igorrr37,и что делать с этим boost, как его установить то?

Добавлено через 5 часов 24 минуты
у меня win 7

Добавлено через 5 минут
а то запускаю вот этот код у меня пишет


the NTVDM CPU has encoring an illegal instruction.cs:0581
ip:0103 op:63 6c 75 64 65 Chose 'close' to terminate the application


Во

Добавлено через 1 минуту
Ну как кто-нибудь знает ?
0
Avazart
Нарушитель
Эксперт С++
7902 / 5727 / 564
Регистрация: 10.12.2010
Сообщений: 26,215
Записей в блоге: 17
29.03.2012, 18:29 8
C++
1
std::ifstream ifs("1.txt");
А вот это что за строчка ,откуда берутся юрл?
Повидимому с этой строки тобиш с файла 1.txt
igorrr37,и что делать с этим boost, как его установить то?
http://www.cyberforum.ru/cpp-beginners/thread298459.html
1
vantyz
54 / 54 / 2
Регистрация: 04.03.2012
Сообщений: 495
29.03.2012, 18:31  [ТС] 9
Avazart
а вот эта ошибка из за неустановленного буста


the NTVDM CPU has encoring an illegal instruction.cs:0581
ip:0103 op:63 6c 75 64 65 Chose 'close' to terminate the application
0
Avazart
Нарушитель
Эксперт С++
7902 / 5727 / 564
Регистрация: 10.12.2010
Сообщений: 26,215
Записей в блоге: 17
29.03.2012, 18:42 10
Понятия не имею, а какая у вас IDE ?
1
vantyz
54 / 54 / 2
Регистрация: 04.03.2012
Сообщений: 495
29.03.2012, 18:50  [ТС] 11
Спасибо всем за помощь все ок

Добавлено через 4 минуты
у меня C++Builder,хотя не знаю что такое IDE
0
Avazart
Нарушитель
Эксперт С++
7902 / 5727 / 564
Регистрация: 10.12.2010
Сообщений: 26,215
Записей в блоге: 17
29.03.2012, 18:59 12
Builder-е не все бустовские библиотеки работают.
У меня RAD Studio 2009 (Builder2009, он уже идет с boost, но старой версией) на нем regex работает, а asio не работает выдает ошибки.
Тем не менее сохранять стрраници можно было бы через компонент HTTP, могу скинуть пример,
Парсить можно было того же regex.
1
vantyz
54 / 54 / 2
Регистрация: 04.03.2012
Сообщений: 495
29.03.2012, 19:01  [ТС] 13
Avazart скинь плиз,а то мучатся с этим бустом ,блин
0
Avazart
Нарушитель
Эксперт С++
7902 / 5727 / 564
Регистрация: 10.12.2010
Сообщений: 26,215
Записей в блоге: 17
29.03.2012, 19:06 14
Ну тут только загрузка файла адресу, выборку придется самому делать.
1
Вложения
Тип файла: rar Загрузка файла по НТТР.rar (885.6 Кб, 32 просмотров)
Avazart
Нарушитель
Эксперт С++
7902 / 5727 / 564
Регистрация: 10.12.2010
Сообщений: 26,215
Записей в блоге: 17
29.03.2012, 19:08 15
http://mimicria.ru/2011/05/04/c-builder-regular-expressions/
1
vantyz
54 / 54 / 2
Регистрация: 04.03.2012
Сообщений: 495
29.03.2012, 19:08  [ТС] 16
Avazart а что еще за выборка?
0
Avazart
Нарушитель
Эксперт С++
7902 / 5727 / 564
Регистрация: 10.12.2010
Сообщений: 26,215
Записей в блоге: 17
29.03.2012, 19:10 17
Ну адреса надо как я понимаю находить и выбирать и другого html-я?
Как они записаны в url.txt?
1
vantyz
54 / 54 / 2
Регистрация: 04.03.2012
Сообщений: 495
29.03.2012, 19:13  [ТС] 18
Ну короче нужно так программа ходит по сайтам указанным в файле URL.TXT далее программа по этим сайтам прошлась и каждую страничку этого сайта сохранила
0
Avazart
Нарушитель
Эксперт С++
7902 / 5727 / 564
Регистрация: 10.12.2010
Сообщений: 26,215
Записей в блоге: 17
29.03.2012, 19:15 19
Каждая строчка файла URL.TXT это новый адрес?
1
vantyz
54 / 54 / 2
Регистрация: 04.03.2012
Сообщений: 495
29.03.2012, 19:17  [ТС] 20
да это новый адрес ,а можете написать код без всяких дополнений просто как exe файл
0
29.03.2012, 19:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2012, 19:17

Возврат сайтов и страниц после вылетов
Люди всем привет открывая данную тему прошу всем отписывать у кого появились сайты после вылетов из...

Изменение страниц сторонних сайтов на лету
Если не в тот раздел пишу, сори! Веб программированием занимаюсь не давно, так что не судите...

кол-во страниц и сайтов как влияют на PR
Беру таблицу http://xap.ru/google-pr.php Анализирую сайт, пример утрированный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru