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;
}



你可能感兴趣的:(爬虫,qt,网络爬虫)