您的位置:首页 > 编程语言 > C语言/C++

C/C++ | Qt 实现爬虫功能,爬取CSDN博客文章

2018-02-08 12:57 726 查看
话不多说,先看程序运行截图:



注意:

 本人没有看过爬虫相关的书籍,第一次写这种程序,这个程序是半屌子的,原理很简单,没有学习过爬虫的朋友,也可以写。
程序思路如下:
1.下载要爬网站的页面。
2.用正则表达式去掉空格,使得程序处理得快。
3.因为CSDN博客文章前面的链接都一样,所以我们只要提取尾部文章编号。
(如:http://blog.csdn.net/qq78442761/article/details/xxxxxxxx)
4.扫描整个文件,得到文章标题。
5.保存为csv格式文件

源码下载如下链接:(还在审核,不知道能不能下载)
http://download.csdn.net/download/qq78442761/10245494

关于界面,在此不再说明。
来说下下载网页(此处只有伪代码,源码请从上面的链接下载):
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;

//发出请求
QNetworkReply *reply=manager.get(QNetworkRequest(url));

//请求结束并下载完成后,退出子事件循环
connect(reply,SIGNAL(finished()),&loop,SLOT(quit()),Qt::UniqueConnection);

//开启子事件循环
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("网站数据获取成功!"),QMessageBox::Ok);
hasSourceFile=true;
}
else{
QMessageBox::information(this,tr("提示"),tr("网站数据获取失败!"),QMessageBox::Ok);
hasSourceFile=false;
}
file.close();
if(file.size()<10){
file.remove();
}
}

下面就得到了txt文件(这文件就是网站浏览器读取到的源码)
接下来用正则表达式去空格:
QString divisionSource=sourceCode;
if(!urlLack.isEmpty()&&!titleLack.isEmpty()){
divisionSource.remove(QRegExp("\\s"));

关于如何寻址指定字符串,本程序提供了2个方法,一个是把QString转成char型,进行查找,代码如下:
int urlNumtemp=0; //为了添加webURLAndTitle[128][2]这个
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++;
}
}
}
}
}


第二个是用QString里面的mid函数(估计效率很低)进行查找:
//下面是提取置顶title
int urlNum=0; //为了添加webURLAndTitle[128][2]这个
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++;
}
}
}
}

//下面是提取title
for(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;
}
}
感谢大家阅读。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Qt C/C 爬虫
相关文章推荐