Массовая загрузка веб-страниц с использованием Qt - PullRequest
3 голосов
/ 12 октября 2010

Я хочу написать программу, использующую Qt, которая загружает множество веб-страниц HTML, около 5000, с одного сайта каждый день. После загрузки этих страниц мне нужно извлечь некоторые данные с помощью DOM Query, с помощью модуля WebKit, а затем сохранить эти данные в базе данных.

Какой лучший / правильный / эффективный способ сделать это, в частности, этап загрузки и анализа? Как мне обработать такое количество запросов и как создать «менеджер загрузок»?

Ответы [ 2 ]

2 голосов
/ 12 октября 2010

Для загрузки страниц имеет смысл использовать выделенную библиотеку, такую ​​как libcurl

0 голосов
/ 20 марта 2013

на этот вопрос уже ответили, но вот решение, использующее то, что вы просили, и это делало это с QT.

Вы можете сделать (Crawler Website), используя QT (в частности, QNetworkManager, QNetworkRequests, QNetworkReply). Я не уверен точно, является ли это правильным способом решения такой задачи, но я обнаружил, что используя несколько потоков, вы можете максимизировать эффективность и сэкономить время. (Пожалуйста, кто-нибудь скажите мне, если есть другой способ / или подтвердите, если это хорошая практика)

Концепция заключается в том, что список работ ставится в очередь, и работник выполнит работу и после получения информации / html обработает ее и затем перейдет к следующему пункту.

Класс рабочий объект Класс должен принимать URL-адрес, обрабатывать и загружать html-данные URL, а затем обрабатывать информацию при ее получении.

Создание очереди и диспетчера для очереди Я создал QQueue urlList для управления количеством одновременно обрабатываемых элементов и списком задач, которые необходимо выполнить.

    QQueue <String> workQueue; //First create somewhere a 
    int maxWorkers = 10;


    //Then create the workers
    void downloadNewArrivals::createWorkers(QString url){
checkNewArrivalWorker* worker = new checkNewArrivalWorker(url);
workQueue.enqueue(worker);
}

    //Make a function to control the amount of workers, 
    //and process the workers after they are finished

    void downloadNewArrivals::processWorkQueue(){
if (workQueue.isEmpty() && currentWorkers== 0){
    qDebug() << "Work Queue Empty" << endl;
} else if (!workQueue.isEmpty()){
    //Create the maxWorkers and start them in seperate threads
    for (int i = 0; i < currentWorkers && !workQueue.isEmpty(); i++){
        QThread* thread = new QThread;
        checkNewArrivalWorker* worker = workQueue.dequeue();
        worker->moveToThread(thread);
        connect(worker, SIGNAL(error(QString)), this, SLOT(errorString(QString)));
        connect(thread, SIGNAL(started()), worker, SLOT(process()));
        connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
        connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
        connect(thread, SIGNAL(finished()), this, SLOT(reduceThreadCounterAndProcessNext()));
        connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
        thread->start();
        currentWorkers++;
    }
}
}

    //When finished, process the next worker
    void downloadNewArrivals::reduceThreadCounterAndProcessNext(){
currentWorkers--;  //This variable is to control amount of max workers

processWorkQueue();
    }


    //Now the worker
    //The worker class important parts..
    void checkNewArrivalWorker::getPages(QString url){
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkRequest getPageRequest = QNetworkRequest(url); //created on heap 
getPageRequest.setRawHeader( "User-Agent", "Mozilla/5.0 (X11; U; Linux i686 (x86_64); "
                           "en-US; rv:1.9.0.1) Gecko/2008070206 Firefox/3.0.1" );
getPageRequest.setRawHeader( "charset", "utf-8" );
getPageRequest.setRawHeader( "Connection", "keep-alive" );
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyGetPagesFinished(QNetworkReply*)));
connect(manager, SIGNAL(finished(QNetworkReply*)), manager, SLOT(deleteLater()));
manager->get(getPageRequest);
}

    void checkNewArrivalWorker::replyGetPagesFinished(QNetworkReply *reply){
QString data = reply->readAll(); //Here data will hold your html to process as needed...
reply->deleteLater();
emit finished();


}

После того, как вы получите вашу информацию, я только что обработал информацию из QString, но я уверен, что вы сможете разобраться, как использовать DOM-парсер, как только доберетесь до этой стадии.

Надеюсь, этого достаточно, чтобы помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...