Qt5 网页标题、关键词提取工具Findyou

news2025/2/2 15:02:33

Qt5 网页标题、关键词提取工具Findyou

一、程序运行
运行界面
在这里插入图片描述
辅助功能,可用于将扫描器的扫描结果转换为url
在这里插入图片描述

二、所涉及的重要知识点
1、Qt爬取https的网页
来自宇龍_
https://blog.csdn.net/qq_45809384/article/details/122049295?spm=1001.2014.3001.5506

在这里插入图片描述
打包完成后,把这两个dll补充了就可以
在这里插入图片描述
配合下面这段代码使用
在这里插入图片描述

2、对301、302的重定向进行跟踪,加入这一行代码就可以
在这里插入图片描述
项目结构
在这里插入图片描述

源代码
getTitleFromUrl.pro

#-------------------------------------------------
#
# Project created by QtCreator 2022-11-23T22:53:34
#
#-------------------------------------------------

QT       += core gui
QT += network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = getTitleFromUrl
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp \
        mainwindow.cpp \
    robots.cpp \
    form.cpp

HEADERS += \
        mainwindow.h \
    robots.h \
    form.h

FORMS += \
        mainwindow.ui \
    form.ui

DISTFILES +=

RESOURCES += \
    myicon.qrc

form.h

#ifndef FORM_H
#define FORM_H

#include <QWidget>
#include<QIcon>
#include<QDebug>
#include<QStringList>
namespace Ui {
class Form;
}

class Form : public QWidget
{
    Q_OBJECT

public:
    explicit Form(QWidget *parent = 0);
    ~Form();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Form *ui;
};

#endif // FORM_H

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFile>
#include<QIcon>
#include"robots.h"
#include"form.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_start_clicked();

    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

robots.h

#ifndef ROBOTS_H
#define ROBOTS_H

#endif // ROBOTS_H

#include<QCoreApplication>
#include<QRegularExpression>
#include<QRegularExpressionMatch>
#include<QRegularExpressionMatchIterator>
#include<QString>
#include<QDebug>
#include <QCoreApplication>
#include<QtCore>
#include<QNetworkAccessManager>
#include<QUrl>
#include<QNetworkRequest>
#include<QNetworkReply>
#include<QObject>
#include<QTextCodec>

QString Robots(QString url);//爬取页面
QString RegularExpression(QString HTML,QString re,QString fenzu);//正则提取爬到的页面

form.cpp

#include "form.h"
#include "ui_form.h"

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
    this->setWindowIcon(QIcon("://bgjzicon.png"));
}

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

void Form::on_pushButton_clicked()
{
    qDebug()<<ui->textEdit_xieyi->toPlainText();
    QStringList xieyiList=ui->textEdit_xieyi->toPlainText().split("\n");
    xieyiList.removeFirst();
    xieyiList.removeLast();
    QStringList ipList=ui->textEdit_ip->toPlainText().split("\n");
    ipList.removeFirst();
    ipList.removeLast();
    QStringList portList=ui->textEdit_port->toPlainText().split("\n");
    portList.removeFirst();
    portList.removeLast();
    QString url="";

    for(int i=0;i<xieyiList.size();i++)
    {
        url=url+xieyiList[i]+"://"+ipList[i]+":"+portList[i]+"\n";
    }
    ui->textEdit_url->setText(url);

}




main.cpp

#include "mainwindow.h"
#include <QApplication>
#include<QTextCodec>

#include "robots.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowIcon(QIcon("://bgjzicon.png"));
}

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

void MainWindow::on_pushButton_start_clicked()
{

    QString alltitleresult="";
    QString allkeywordresult="以下页面内含有关键词:";
    ui->textEdit_title->setText(alltitleresult);
    ui->textEdit_h1->setText(allkeywordresult);
    int count=0;

    //这一段是用来匹配出每一个url,可以增加一些对输入格式的兼容性...........................................................
    QRegularExpression Re("(?<url>http[s]{0,1}.*?://.*?)fengefu");
    QString urls=ui->textEdit_url->toPlainText();
    qDebug()<<"原始的:"<<urls<<endl;
    //排除url重定向的链接打乱顺序 如 http://xx.xxx.xx.x/login.php?redirect=http://xxx.xx.xx/
    urls.replace("=http","1");
    //去除\r\n
    urls.remove("\n");
    urls.remove("\r");
     urls.remove("\t");

    //这样可以使用fengefu有效分割出每个url,适应不同的输入格式
    urls.replace("http://","fengefuhttp://");
    urls.replace("https://","fengefuhttps://");
    //在末尾加上分隔符这样可以兼容最后一个url,使得最后一个url得到匹配
    urls=urls+"fengefu";
    qDebug()<<urls;
    //....................................................................................................................


       if(ui->lineEdit_keyword->text()!="")//输入了关键字
     {
       qDebug()<<"输入了关键字"<<endl;
       QRegularExpressionMatchIterator Matchs=Re.globalMatch(urls);
       QRegularExpressionMatch match=Matchs.next();
       QString oneUrl=match.captured("url");//提取每一个url
       qDebug()<<"提取到"<<oneUrl<<endl;
       //单独爬取第一个.......................................................................
       QString HTML=Robots(oneUrl);
       QString title_re="(<title.*?>(?<title>.*?)</title>)";
       QString titleresult=RegularExpression(HTML,title_re,"title");

       QString keyword=ui->lineEdit_keyword->text();
       QString keyword_re="(?<keyword>"+keyword+")";
       QString keywordresult=RegularExpression(HTML,keyword_re,"keyword");
       //qDebug()<<"关键词正则"<<keyword_re<<endl;
       if(keywordresult!="keyword标签值:")//匹配到关键词了
       {
           allkeywordresult=oneUrl;
       }

       alltitleresult=alltitleresult+titleresult+"\n";

       ui->textEdit_title->setText(alltitleresult);
       ui->textEdit_h1->setText(allkeywordresult);
       //qDebug()<<"已检查数:"<<++count;

       ui->label_jindu->setText(QString::number(++count));
     //......................................................................................

       while(Matchs.hasNext()==true)
       {
           match=Matchs.next();
           oneUrl=match.captured("url");
           qDebug()<<"提取到"<<oneUrl<<endl;
           QString HTML=Robots(oneUrl);

           QString title_re="(<title.*?>(?<title>.*?)</title>)";

           QString titleresult=RegularExpression(HTML,title_re,"title");

           QString keyword_re="(?<keyword>"+keyword+")";
           QString keywordresult=RegularExpression(HTML,keyword_re,"keyword");

           if(keywordresult!="keyword标签值:")//匹配到关键词了
           {
               allkeywordresult=allkeywordresult+"\n"+oneUrl;
           }

           alltitleresult=alltitleresult+titleresult+"\n";
           ui->textEdit_title->setText(alltitleresult);
           ui->textEdit_h1->setText(allkeywordresult);

           //滚动条置底,方便观察实时结果
            ui->textEdit_title->moveCursor(QTextCursor::End);
            ui->textEdit_h1->moveCursor(QTextCursor::End);
          // qDebug()<<"已检查数:"<<++count;
           ui->label_jindu->setText(QString::number(++count));

       }
     }
       else//未输入关键字,仅匹配title标签
     {
           qDebug()<<"未输入关键字"<<endl;
           QRegularExpressionMatchIterator Matchs=Re.globalMatch(urls);
           QRegularExpressionMatch match=Matchs.next();
           QString oneUrl=match.captured("url");//提取每一个url
           qDebug()<<"提取到1"<<oneUrl<<endl;
           //单独爬取第一个.......................................................................
           QString HTML=Robots(oneUrl);
           QString title_re="(<title.*?>(?<title>.*?)</title>)";
           qDebug()<<"爬到"<<HTML<<endl;
           QString titleresult=RegularExpression(HTML,title_re,"title");
           alltitleresult=alltitleresult+titleresult+"\n";
           ui->textEdit_title->setText(alltitleresult);
           ui->label_jindu->setText(QString::number(++count));
         //......................................................................................

           while(Matchs.hasNext()==true)
           {
               match=Matchs.next();
               oneUrl=match.captured("url");
               qDebug()<<"提取到2"<<oneUrl<<endl;
               QString HTML=Robots(oneUrl);
               QString title_re="(<title.*?>(?<title>.*?)</title>)";
              qDebug()<<"爬到2"<<HTML<<endl;
               QString titleresult=RegularExpression(HTML,title_re,"title");
               qDebug()<<"结果:"<<titleresult<<endl;
               alltitleresult=alltitleresult+titleresult+"\n";
               ui->textEdit_title->setText(alltitleresult);
               //滚动条置底,方便观察实时结果
                ui->textEdit_title->moveCursor(QTextCursor::End);
              // qDebug()<<"已检查数:"<<++count;
               ui->label_jindu->setText(QString::number(++count));

           }
     }
}

void MainWindow::on_pushButton_clicked()
{
    Form *pinjie=new Form;
    pinjie->show();
}

robots.cpp

#include "robots.h"

QString Robots(QString url)//爬取页面
{
    QUrl URL=url;
    QNetworkAccessManager manager;
    QEventLoop Loop;
    QNetworkRequest request=QNetworkRequest(URL);
    //设置请求头,主要是user-agent字段,不然爬不到有些url,比如百度
    request.setRawHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0");
    request.setRawHeader("Accept","*/*");
    request.setRawHeader("Accept-Language","zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");

    //这个对于浏览器提醒的那种不安全,是否继续访问的是可行的。会自动去继续浏览的,估计那个只是浏览器自己的特性,直接代码去访问的话,不涉及那个提示,因为不经过浏览器
    //实验后确定FollowRedirectsAttribute可以实现当状态码为301、302时,会自动根据响应包的Location值进行跳转,可以进行多次跳转
    //多次跳转测试url http://39.129.231.7:85
    //测试url http://39.129.50.68:8000 ,响应包Location: /web/index.html,为相对路径,实验确认可自动跳转
    //测试url http://39.129.48.54:8090 ,响应包Location: http://39.129.48.54:8090/login.php,为完整路径,实验确认可自动跳转
    request.setAttribute(QNetworkRequest::FollowRedirectsAttribute,true);
    //这一段是兼容ssl的,这样才可以进行https请求
    //.......................................................................
    QSslConfiguration config = request.sslConfiguration();
    config.setPeerVerifyMode(QSslSocket::VerifyNone);
    config.setProtocol(QSsl::TlsV1SslV3);
    request.setSslConfiguration(config);
   //........................................................................
    QNetworkReply *reply=manager.get(request);
    QObject::connect(reply,SIGNAL(finished()),&Loop,SLOT(quit()));
    QTimer::singleShot(10000, &Loop, &QEventLoop::quit);//30秒无响应退出消息循环机制,不然有的url直接访问不到,就会直接卡死,不继续访问后面的url
    Loop.exec();
    QString HtmlText=reply->readAll();
    return HtmlText;
}

QString RegularExpression(QString  HTML,QString re,QString fenzu)//正则提取爬到的页面正文
{
    QString TextAfterRe=fenzu+"标签值:";
    QRegularExpression Re(re);
    QRegularExpressionMatchIterator Matchs=Re.globalMatch(HTML);
    QRegularExpressionMatch match=Matchs.next();
    TextAfterRe=TextAfterRe+match.captured(fenzu);//title标签
    TextAfterRe=TextAfterRe;

    while(Matchs.hasNext()==true)
    {
        match=Matchs.next();
        QString temp=match.captured(fenzu);
        TextAfterRe=TextAfterRe+temp;
    }
    return TextAfterRe;
}





本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Foxmail客户端添加163账号和邮件备份163邮箱

文章目录一、Foxmail添加163账号1. 点击图标2. 账号管理3. 新建4. 手动设置5. 填写信息6. 创建二、邮件转移备份2.1. 邮件折叠2.2. 选择目标邮箱2.3. 同步服务端Foxmail客户端添加163账号的具体步骤如下&#xff1a;一、Foxmail添加163账号 1. 点击图标 首先打开Foxmail客户端…

51寻找数组中出现次数超一半的数

51寻找数组中出现次数超一半的数 一看题目就想用hash表&#xff0c;但是要求空间复杂度为1&#xff0c;说明不可以用哈希表去存。一直在原地数组上思考&#xff0c;类似桶排序&#xff0c;可是这取决于数值的大小&#xff0c;最后还是看了题解&#xff0c;学到了。 思想是&…

外汇天眼:一笔赚了12600美元 你羡慕吗?

在外汇投资中&#xff0c;黑平台一直是外汇投资圈的一枚毒瘤&#xff0c;不能顺利出金也是外汇投资面临的最大风险之一。 对于外汇投资者而言&#xff0c;外汇交易平台的选择至关重要。 选择好的外汇交易平台&#xff0c;最重要的是&#xff1a;选择安全可靠的平台&#xff0…

Blackmagic黑魔法摄像机braw视频帧损坏文件修复方法

Blackmagic是全球知名的影视级产品供应商&#xff0c;其高清摄像机是国内外各种剧组的最爱。Blackmagic的新产品目前使用braw格式&#xff0c;其编码采用自定义的raw编码&#xff0c;视频的效果和阿莱不相上下。之前我们已经多次介绍过这种braw文件的修复&#xff0c;近期我们处…

grpc的使用

GRPC学习 本文包括grpc的入门使用和四种实现方式 文章目录一、GRPC 安装和hello world1、什么是GRPC2、安装grpc和代码3、服务端3.1、取出 server3.2、挂载方法3.3、注册服务3.4、创建监听4、客户端二、protobuf语法三、GRPC server 的使用1、普通服务2、流式传入&#xff08;客…

通达信破解接口怎么委托下单?

通达信破解接口主要是利用数学公式建立模型&#xff0c;通过大量数据判断未来价格走势&#xff0c;通过程序选股。虽然选股也比较广泛&#xff0c;但也能覆盖A股市场的四千多只股票&#xff0c;能排除强行涨跌等人为因素&#xff0c;执行的纪律性强。所以对于通达信破解接口对股…

【笔记】git 修改之前的提交记录信息(git commit -m ‘...‘)

文章目录一、修改最后一条提交记录信息二、修改前面某条或某几条提交记录信息一、修改最后一条提交记录信息 git commit --amend进入vi编辑器后&#xff1a; 按i下方出现’- - 插入 - -‘的提示时&#xff0c;便可编辑提交记录信息按ESC&#xff0c;输入:wq保存退出&#xff0…

ICG衍生物ICG-Sulfo-OSu的产品描述及保存建议

中文名称 ICG-Sulfo-OSu 英文名字 ICG-Sulfo-OSu 凯新生物描述: &#xff08;ICG&#xff09;是一种用于医学诊断的菁染料它用于测定心输出量、肝功能和肝血流&#xff0c;以及眼科血管造影它的峰值光谱吸收接近800 nm这些红外频率穿透视网膜层&#xff0c;使ICG血管造影能够比…

【STA】(2)概念

目录 1.CMOS逻辑设计 1.1 基本MOS结构 1.2 COMS逻辑门 1.3 标准单元 2.CMOS单元建模 3.电平翻转波形 4.传播延迟 5.波形的转换率 6.信号之间的偏移 7. 时序弧和单调性 8.最小和最大时序路径 9.时钟域 10.工作条件 1.CMOS逻辑设计 1.1 基本MOS结构 MOS(Metal Oxide…

2022年Python笔试选择题及答案(秋招)

2022年Python笔试选择题及答案&#xff08;秋招&#xff09; &#x1f3e0;个人主页&#xff1a;编程ID &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是编程ID&#xff0c;一个想要与大家共同进步的程序员儿 &#x1f9d1;如果各位哥哥姐姐在准备面试&#xff0c;找…

【Redis-11】Redis事务实现原理

Redis通过MULTI、EXEC、WATCH等命令来实现事务的功能&#xff0c;事务提供了一种将多个命令请求打包&#xff0c;然后一次性&#xff0c;顺序性的执行多个命令的机制。在事务执行期间&#xff0c;服务器不会中断事务去执行其他客户端的命令&#xff0c;他会讲事务中所有命令执行…

谈主成分分析/因子分析中的特征值“矩阵近似”

主成分分析和因子分析是数据降维的常用手段&#xff0c;其中以特征值为载体&#xff0c;在不断降维“近似”原本的协方差矩阵。 CSDN中一些文章在介绍这个问题或者叫“特征值分解”时&#xff0c;讲得都比较学术化&#xff0c;今天用一个小例子&#xff0c;还是面向新人&#…

Redis高可用之哨兵机制实现细节

Redis高可用之哨兵机制实现细节 本文来自我的 technotes [1] Redis篇&#xff0c;欢迎你常来逛逛。 正文 在上一篇的文章《Redis高可用全景一览》中&#xff0c;我们学习了 Redis 的高可用性。高可用性有两方面含义&#xff1a;一是服务少中断&#xff0c;二是数据少丢失。主…

【树莓派不吃灰】兄弟连篇⑥ Linux系统进程管理

目录1、进程查看1.1 ps1.2 top1.3 pstree2、终止进程2.1 kill2.2 killall2.3 pkill3、工作管理4、系统资源查看4.1 vmstat 监控系统资源4.2 dmesg 开机内核检测信息4.3 free 查看内存使用4.4 查看cpu信息4.5 uptime4.6 uname4.7 判断当前系统位数4.8 查询当前linux发行版本4.9 …

Windows及Kail安装配置

apache在kali环境搭建 Kali虚拟机中是包含有Apache的&#xff0c;在/etc目录下ls即可显示出来&#xff0c; 所以这里只需要进行配置就可以了。 图1.1 Apache2目录 打开Apache服务&#xff0c;开启后可以使用status命令查看服务状态。 /etc/init.d/apache2 start /etc/init.d…

【5】控制语句

指针 Go中不用“->”运算符&#xff0c;用的是 “.” 选择符“&”&#xff1a;取地址符“*”&#xff1a;访问目标对象符默认值为&#xff1a;nil (不是NULL)、- -:作为语句&#xff0c;只可以自己放一行&#xff0c;而且放在右边&#xff08;不是表达式&#xff09; …

一款强大的API接口文档管理工具(Smart-Doc + Torna)

【本文由龙飞同学供稿】 在团队协作开发项目的时候&#xff0c;接口文档承担着向其他开发人员说明接口相关信息的重要任务&#xff0c;因此&#xff0c;一份清晰而又相近的接口文档至关重要。 但是&#xff0c;写接口文档的痛苦想必各位开发人员都体验过&#xff0c;明明写接…

在职读研有意义么?来社科院与杜兰大学金融管理硕士项目探寻答案

在职场当我们遇到变化&#xff0c;尤其是发展上有瓶颈期的时候&#xff0c;我们会寻找向内突破&#xff0c;通过提升自己的核心竞争力来应对&#xff0c;通过再学习来增加自身的优势。那么在职读研有意义吗&#xff1f;我们来社科院与杜兰大学金融管理硕士项目来探寻。 一、读在…

Postman接口测试之Mock快速入门

一、Mock简介 1.Mock定义 Mock是一种比较特殊的测试技巧&#xff0c;可以在没有依赖项的情况下进行接口或单元测试。通常情况下&#xff0c;Mock与其他方法的区别是&#xff0c;用于模拟代码依赖对象&#xff0c;并允许设置对应的期望值。简单一点来讲&#xff0c;就是Mock创建…

【专业数据】八.2020~2022年北京交通大学【人工智能】专业复试线/分数线差/计划招生数/复试数/录取数/复试比例/录取率

文章目录 1.专业介绍2.2020-2022年国家线/复试线/分数线差2.1.数据总览2.2.数据指标2.2.1.复试分数线2.2.2.分数线差3.2020-2022年计划招生数/复试数/录取数/复试比例/录取率3.1.数据总览3.2.数据指标3.2.1.复试比例3.2.2.录取率4.参考资料欢迎订阅本专栏:《北交计算机复试经验…