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