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实现简易爬虫