Ответы пользователя по тегу Компьютерные сети
  • Интересна ли платформа для разработки сайтов на C++?

    Лично мне был бы интересен подобный проект, если open source то мог бы поучаствовать даже.
    Однако, некоторые моменты вызывают сомнения.
    1. Зачем FastCGI? Это лично мое IMHO, но он уродлив и отжил свое. Может лучше писать свой сервер(на базе libuv или boost asio, например). Если от FastCGI избавляться не хотите, то советую посмотреть на решение програмистов из yandex'а Fastcgi-Daemon. Чем ваше будет лучше?
    2. DTL как формат или вы python будете встраивать? Просто это странно, зачем проседать в производительности здесь, когда существуют плюсовые шаблонизаторы, Mustashe как пример
    3. В скриптовых контроллерах как-то не особо смысл вижу.
    У меня была идея реализовать что-то подобное nodejs express на плюсах со слоеной архитектурой и асинхронными обвязками для сокетов, БД и т.д.
    Для сопутствующих файлов использовать qrc из Qt, тогда деплоиться это будет как одна монолитная so'шка.
    Правда пока это так и осталось на уровне идеи...
    Ответ написан
    2 комментария
  • Как распарсить сайт с помощью QNetworkAccessManager?

    Ну с этой частью у вас все верно. Если попробовать сделать это curl'ом получим ровно тоже самое.
    @home-tower:~$ curl -i http://google.com
    HTTP/1.1 302 Found
    Cache-Control: private
    Content-Type: text/html; charset=UTF-8
    Location: http://www.google.ru/?gfe_rd=cr&ei=EPmeVPyRK6Or8wf5-IDABA
    Content-Length: 258
    Date: Sat, 27 Dec 2014 18:23:12 GMT
    Server: GFE/2.0
    Alternate-Protocol: 80:quic,p=0.002
    
    <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
    <TITLE>302 Moved</TITLE></HEAD><BODY>
    <H1>302 Moved</H1>
    The document has moved
    <A HREF="http://www.google.ru/?gfe_rd=cr&amp;ei=EPmeVPyRK6Or8wf5-IDABA">here</A>.
    </BODY></HTML>

    Если вместо google.com поставить url который не возвращает редирект, то получите нужный html.
    Дальше будет интересней, потому что этот html нужно парсить. У меня была такая задача не так давно.
    Проблемма в том что в Qt нет легкого html парсера(не монструозного QtWebkit я имею ввиду). Есть парсеры для Xml, но они ломаются на многих страницах. Поэтому я использовал Gumbo - это реализация html парсера от гугла. Я для своего проекта оборачивал его, чтобы было более Qt'шно. Что получилось можно найти на github. Обратите внимание на тесты. Они как примеры использования, вместо документации.
    Надеюсь это поможет

    UPD по шагам:
    1. в QtCreator создаем Subdirs Project
    2. New subproject и выбираем тип приложения который вам нужен Qt Console Application например
    3. В консоли переходим в папку с проектом и пишем
    bumbaram@home-tower:~/Projects/htmlparsing$ git init
    bumbaram@home-tower:~/Projects/htmlparsing$ git submodule add https://github.com/lagner/QGumboParser.git lib
    	Cloning into 'QGumboParser'...
    	remote: Counting objects: 96, done.
    	remote: Total 96 (delta 0), reused 0 (delta 0)
    	Unpacking objects: 100% (96/96), done.
    	Checking connectivity... done.
    
    bumbaram@home-tower:~/Projects/htmlparsing$ git submodule update --init --recursive

    4. Идем в IDE, в корневом pro файле добавляем: SUBDIRS += lib/QGumboParser
    5. Для приложения делаем Add Library -> Internal Library. Там все нужно уже будет выбрано. Плюс, в pro файл нужно добавить CONFIG += c++11
    7. Открываем main.cpp и пишем:
    #include <QCoreApplication>
    #include <QDebug>
    #include <QNetworkAccessManager>
    #include <QNetworkRequest>
    #include <QNetworkReply>
    #include <qgumbodocument.h>
    #include <qgumbonode.h>
    
    
    void requestFinished(QNetworkReply*);
    void parseHtml(QString html);
    
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        QNetworkAccessManager nm;
        QObject::connect(&nm, &QNetworkAccessManager::finished, requestFinished);
    
        nm.get(QNetworkRequest(QStringLiteral("http://toster.ru/q/168437")));
    
        return a.exec();
    }
    
    
    void requestFinished(QNetworkReply* rep) {
        if (rep->error() == QNetworkReply::NoError) {
            QByteArray rawdata = rep->readAll();
            QString html = QString::fromUtf8(rawdata);
    
            parseHtml(html);
    
        } else {
            qDebug() << "request failed: " << rep->errorString();
        }
    
        rep->deleteLater();
        QCoreApplication::quit();
    }
    
    
    void parseHtml(QString html) {
        try {
            QGumboDocument doc = QGumboDocument::parse(html);
            QGumboNode root = doc.rootNode();
    
            auto nodes = root.getElementsByTagName(HtmlTag::TITLE);
            for (auto& node: nodes) {
                qDebug() << "title: " << node.innerText();
            }
    
        } catch (...) {
            qCritical() << "smth wrong";
        }
    }

    Все должно работать.
    Ответ написан
    3 комментария