C/C++ | Qt 实现爬虫功能,爬取CSDN博客文章
話不多說,先看程序運(yùn)行截圖:
注意:
?本人沒有看過爬蟲相關(guān)的書籍,第一次寫這種程序,這個(gè)程序是半屌子的,原理很簡(jiǎn)單,沒有學(xué)習(xí)過爬蟲的朋友,也可以寫。
程序思路如下:
1.下載要爬網(wǎng)站的頁(yè)面。
2.用正則表達(dá)式去掉空格,使得程序處理得快。
3.因?yàn)镃SDN博客文章前面的鏈接都一樣,所以我們只要提取尾部文章編號(hào)。
(如:http://blog.csdn.net/qq78442761/article/details/xxxxxxxx)
4.掃描整個(gè)文件,得到文章標(biāo)題。
5.保存為csv格式文件
源碼下載如下鏈接:(還在審核,不知道能不能下載)
http://download.csdn.net/download/qq78442761/10245494
關(guān)于界面,在此不再說明。
來說下下載網(wǎng)頁(yè)(此處只有偽代碼,源碼請(qǐng)從上面的鏈接下載):
void Widget::on_id_getWebCode_pushButton_clicked() {const QString URLSTR=ui->id_url_lineEdit->text();const QString FILE_NAME=ui->id_SaveFileName_lineEdit->text();QUrl url(URLSTR);QEventLoop loop;QNetworkAccessManager manager;//發(fā)出請(qǐng)求QNetworkReply *reply=manager.get(QNetworkRequest(url));//請(qǐng)求結(jié)束并下載完成后,退出子事件循環(huán)connect(reply,SIGNAL(finished()),&loop,SLOT(quit()),Qt::UniqueConnection);//開啟子事件循環(huán)loop.exec();//將讀取到的信息寫入文件sourceCode=reply->readAll();QFile file(FILE_NAME);file.open(QIODevice::WriteOnly);QTextStream out(&file);out<<sourceCode<<endl;if(file.size()>10){QMessageBox::information(this,tr("提示"),tr("網(wǎng)站數(shù)據(jù)獲取成功!"),QMessageBox::Ok);hasSourceFile=true;}else{QMessageBox::information(this,tr("提示"),tr("網(wǎng)站數(shù)據(jù)獲取失敗!"),QMessageBox::Ok);hasSourceFile=false;}file.close();if(file.size()<10){file.remove();} }
下面就得到了txt文件(這文件就是網(wǎng)站瀏覽器讀取到的源碼)
接下來用正則表達(dá)式去空格:
QString divisionSource=sourceCode;if(!urlLack.isEmpty()&&!titleLack.isEmpty()){divisionSource.remove(QRegExp("\\s"));關(guān)于如何尋址指定字符串,本程序提供了2個(gè)方法,一個(gè)是把QString轉(zhuǎn)成char型,進(jìn)行查找,代碼如下:
int urlNumtemp=0; //為了添加webURLAndTitle[128][2]這個(gè)for(int i=0;i<strlen(divisionSourceCodeChar);i++){if(divisionSourceCodeChar[i]==divisionURL[0]){for(int k=1;k<strlen(divisionURL);k++){if(divisionSourceCodeChar[i+k] != divisionURL[k]){break;}if(strlen(divisionURL)-1==k){QString temp="";for(int a=1;a<=8;a++){QChar c=divisionSourceCodeChar[i+k+a];temp=temp.append(c);}//qDebug()<<temp;if(!temp.isEmpty()){webURLAndTitle[urlNumtemp][0]=ui->id_URL_division_lineEdit->text()+temp;qDebug()<<webURLAndTitle[urlNumtemp][0];urlNumtemp++;}}}}}第二個(gè)是用QString里面的mid函數(shù)(估計(jì)效率很低)進(jìn)行查找:
//下面是提取置頂titleint urlNum=0; //為了添加webURLAndTitle[128][2]這個(gè)for(int i=0;i<divisionSource.length();i++){if(divisionSource.mid(i,1)==topTitleLack.mid(0,1)){for(int k=1;k<topTitleLack.length();k++){if(divisionSource.mid(i+k,1) != topTitleLack.mid(k,1)){break;}if(topTitleLack.length()-1==k){QString temp="";int a=1;while(divisionSource.mid(i+k+a,1)!="<"){temp=temp.append(divisionSource.mid(i+k+a,1));a++;}QString temp_append="置頂:";temp_append=temp_append.append(temp);webURLAndTitle[urlNum][1]=temp_append;qDebug()<<webURLAndTitle[urlNum][1];urlNum++;}}}}//下面是提取titlefor(int i=0;i<divisionSource.length();i++){if(divisionSource.mid(i,1)==titleLack.mid(0,1)){for(int k=1;k<titleLack.length();k++){if(divisionSource.mid(i+k,1) != titleLack.mid(k,1)){break;}if(titleLack.length()-1==k){QString temp="";int a=1;while(divisionSource.mid(i+k+a,1)!="<"){temp=temp.append(divisionSource.mid(i+k+a,1));a++;}if(!temp.isEmpty()){webURLAndTitle[urlNum][1]=temp;qDebug()<<webURLAndTitle[urlNum][1];urlNum++;}}}}}webNum=urlNum;saveURLandTilte();
最后是保存為CSV文件
void Widget::saveURLandTilte() {QFile file("URL&Title.csv");file.open(QIODevice::WriteOnly);QTextStream out(&file);for(int i=0;i<webNum;i++){out<<webURLAndTitle[i][0]+";"+webURLAndTitle[i][1]<<endl;} }
感謝大家閱讀。
總結(jié)
以上是生活随笔為你收集整理的C/C++ | Qt 实现爬虫功能,爬取CSDN博客文章的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 声明静态类,为什么你不能在Ja
- 下一篇: WEB安全基础-SQL注入基础