Qt实现简易爬虫

最近在准备复试的过程中要查询学校导师的信息,一个一个看,然后分析,有点费事,所以想爬虫爬去老师的所有信息,然后用以前写的分析工具(云标签的那个)进行分析。

本项目由两部分组成,
1、提取相关的网页html信息。
2、利用正则表达式提取有用信息

这两部分都比较简单,就不详述了。

直接上代码:

#include "spider.h"
#include "ui_spider.h"

#include <QURL>
#include <QNetworkReply>
#include <QFile>
#include <QRegExp>
#include <QDebug>

Spider::Spider(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Spider)
{
    ui->setupUi(this);

    manager = new QNetworkAccessManager(this);
    connect(manager,&QNetworkAccessManager::finished,this,&Spider::ReplyFinishedSlot);

}

Spider::~Spider()
{
    delete ui;
}

//利用正则表达式获取有用信息
void Spider::GetUsefulData()
{
    if(ori_data.isEmpty() == false)
    {
        QRegExp re_beg(tr("计算机科学与工程学院"));           //开始匹配标志
        QRegExp re_end(tr("信息与软件工程学院"));            //结束匹配标志

        int index_beg = ori_data.indexOf(re_beg,0);         //开始匹配位置
        int index_end = ori_data.indexOf(re_end,index_beg);     //结束匹配位置

        QRegularExpression re("<a href='TutorDetails.aspx.*id=(\\d{4}).*\\s.*;(.*)</a>");   //正则表达式:匹配模式
        //QRegularExpression re("<a href='TutorDetails.aspx\?id=(\\d{4}).*\\s.*;(.*)</a>");

        QRegularExpressionMatch match;

        while(index_beg<index_end-500)      //去除最后一个元素
        {
            match = re.match(ori_data,index_beg);

            if(match.hasMatch())
            {
                QString name = match.captured(2);       //匹配第二个元素
                QString html = match.captured(1);       //匹配第一个元素

                QString show = "Name:"+name+" html:"+html+"\n";

                ui->textBrowser->append(show);
                index_beg = match.capturedEnd();        //记录目前匹配的位置
            }
        }
    }
}


//网络信息接受完毕
void Spider::ReplyFinishedSlot(QNetworkReply *reply)
{
    ori_data = reply->readAll();            //读取网页的Html信息
    //写入到文件中
//    QFile out_file("test.html");
//    if(out_file.open(QIODevice::WriteOnly))
//    {
//        QTextStream out(&out_file);
//        out<<ori_data;
//    }

    //从源码中获取所需信息(利用正则表达式)
   GetUsefulData();

    reply->deleteLater();
}

void Spider::on_OK_pushButton_clicked()
{
    QString url_str = ui->URL_lineEdit->text();

    if(!url_str.isEmpty())
    {
         QUrl url(url_str);

         manager->get(QNetworkRequest(url));        //提交网络get请求,这里是 直接下载html源码
    }

}

这里有个小问题:在正则表达式的时候,如何匹配一个问号(?),因为在正则中?有特殊含义(代表了懒惰匹配)。按理应该加回车 '?'来进行匹配,这个我在在线正则测试中是可以的,但不知为甚在Qt中就不行了?

还有,最终还没把项目完成,复试就开始了,哎,最后还是一个一个 手动分析的。o(╯□╰)。

项目的源码在这儿

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值