欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt实现简易爬虫

程序员文章站 2022-06-05 18:46:13
...

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

本项目由两部分组成,
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(╯□╰)。

项目的源码请搜: Qt实现简易爬虫

相关标签: Qt 简易爬虫