Qt連續爬取多個網頁

Maiee的 Qt編的糗百小爬蟲一次只能夠抓取糗百熱門的第一頁,第一頁就那麼幾條,一下子就看完了。於是就想更新一下程序,想能不能把它糗百熱門的前十頁都爬下來。

之前的代碼主要是用利用QNetworkAccessManager這個類:

首先連接信號:

connect(mgr,SIGNAL(finished(QNetworkReply*)),this, SLOT(query(QNetworkReply*)));

當點擊按鈕:

mgr->get(QNetworkRequest(QUrl(url)));

url裏面就是糗百熱門第一頁的網址

這是QNetworkAccessManager就開始爬取這一頁的內容了

當爬取完畢後,QNetworkAccessManager會發出finished這個信號,其參數就是網頁內容

我們設置了槽query函數來處理網頁內容:

void Widget::query(QNetworkReply *reply)
{
    QString buffer = reply->readAll();
    QRegExp exp("<div class=\"content\" title=\"(.*)\">(.*)</div>");
    exp.setMinimal(true);
    int pos=0;
    while ((pos = exp.indexIn(buffer,pos)) != -1) {
        content->append(exp.cap(1));
        content->append(exp.cap(2));
        pos += exp.matchedLength();
        //qDebug(QString::number(pos).toAscii());
    }
    //qDebug(QString::number(pos).toAscii());
}

可現在要連續抓取http://www.qiushibaike.com/hot/page/1~http://www.qiushibaike.com/hot/page/10

Maxiee最先想到的是在點擊按鈕的函數裏面加一個循環:

先生成http://www.qiushibaike.com/hot/page/+i 網址

再調用mgr->get(QNetworkRequest(QUrl(url)));

連續調用十次

理論上這樣沒問題,但實際上卻失敗了,原因是:

下載網頁需要一段時間

一個條用沒執行完,以後的都被阻塞了

(感覺是這樣額)

於是,Maxiee就像找一種方法來克服這個問題:

主要思路就是讓一個調用執行完再執行下一個

首先想到的是sleep,在Qt下利用Qtime可以實現延時,訂了5秒,問題是克服了,但是一頓一頓地刷,不給力啊

能不能靈活一點呢?Maxiee想了想,用個Flag就解決了:

void Widget::on_goButton_clicked()
{
    QString uri = ui->addrEdit->text();
    qDebug("下面開始爬");
    int i;
    for(i=1;i<11;i++)
    {
        QString url2(uri);
        url2.append(QString::number(i,10));
        qDebug(url2.toAscii());
        mgr->get(QNetworkRequest(QUrl(url2)));
        while(!flag)
            QCoreApplication::processEvents();
        flag = false;
    }
    ui->contentEdit->setText(*content);

}
void Widget::query(QNetworkReply *reply)
{
    QString buffer = reply->readAll();
    QRegExp exp("<div class=\"content\" title=\"(.*)\">(.*)</div>");
    exp.setMinimal(true);
    int pos=0;
    while ((pos = exp.indexIn(buffer,pos)) != -1) {
        content->append(exp.cap(1));
        content->append(exp.cap(2));
        pos += exp.matchedLength();
        //qDebug(QString::number(pos).toAscii());
    }
    //qDebug(QString::number(pos).toAscii());
    flag = true;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章