#include "widget.h"
#include "ui_widget.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>
#include <QUrl>
#include <QNetworkReply>
#include <QNetworkAccessManager>
#include <QFuture>
#include <QtConcurrent>
#include <QMessageBox>
#define debug qDebug()<<
QStringList Widget::failList;
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::getHttpData(const QString & urlString)
{
QUrl url = QUrl::fromUserInput(urlString.toUtf8());
if(!url.isValid())
{
failList << urlString;
return;
}
QNetworkRequest request;
request.setUrl(url);
QNetworkAccessManager manager;
QNetworkReply * reply_ = manager.get(request);
connect(reply_, QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),[&](QNetworkReply::NetworkError code)
{
switch(static_cast<int>(code))
{
case QNetworkReply::ConnectionRefusedError:
debug "远程服务器拒绝连接(服务器不接受请求)";
break;
case QNetworkReply::HostNotFoundError:
debug "找不到远程主机名(无效的主机名)";
break;
case QNetworkReply::TimeoutError:
debug "与远程服务器的连接超时";
break;
default:
break;
}
});
QEventLoop eventLoop2;
connect(reply_, &QNetworkReply::finished, &eventLoop2, &QEventLoop::quit);
eventLoop2.exec(QEventLoop::ExcludeUserInputEvents);
QByteArray data = reply_->readAll();
if(data.isEmpty())
{
failList << urlString;
return;
}
QRegExp exp("[^/]+\.(png|jpg)$");
exp.setMinimal(false);
int pos = 0;
QString fileName;
while ((pos = exp.indexIn(urlString , pos)) != -1)
{
pos += exp.matchedLength();
fileName = exp.cap(0);
}
QPixmap pixmap;
pixmap.loadFromData(data);
pixmap.save("pic/" + fileName);
}
void Widget::on_pushButton_clicked()
{
QString dataInfo = ui->textEdit->toPlainText().trimmed();
QJsonDocument jsonDocument = QJsonDocument::fromJson(dataInfo.toUtf8().data());
QJsonArray array = jsonDocument.object()["data"].toObject()["items"].toArray();
std::for_each(array.begin(),array.end(),[this](const QJsonValue & value)
{
urlList << value.toObject()["picUrl"].toString();
});
if(!urlList.isEmpty())
{
debug "图片数量:" << urlList.size();
failList.clear();
QFuture<void> f = QtConcurrent::map(urlList,&Widget::getHttpData);
f.waitForFinished();
QMessageBox::information(this,"提示","全部下载完成");
if(!failList.isEmpty())
{
debug "以下图片下载失败:"<<endl<<failList;
}
}
else
{
debug "没有图片";
}
}
qt爬虫下载图片.zip
需积分: 0 89 浏览量
更新于2021-02-10
收藏 6KB ZIP 举报
:“qt爬虫下载图片.zip”是一个与使用Qt框架构建网络爬虫并实现图片下载相关的压缩包文件。Qt是一个跨平台的应用程序开发框架,广泛应用于C++编程,尤其适用于图形用户界面和网络编程。
:描述中提到的文章链接指向了CSDN上的一篇博客,作者kenfan1647详细介绍了如何利用Qt来编写一个爬虫程序,以下载网页上的图片。在该博客中,作者可能涵盖了以下内容:
1. **Qt网络模块**:Qt提供了一个强大的网络模块,使得开发者能够轻松处理HTTP、FTP等网络协议,用于爬虫数据的抓取。
2. **QNetworkAccessManager**:这是Qt网络模块的核心类,用于发起网络请求和管理网络连接。在爬虫中,通常会用它来发送HTTP GET或POST请求,获取网页内容。
3. **QNetworkReply**:当QNetworkAccessManager发起的请求完成时,会返回一个QNetworkReply对象,包含了服务器的响应信息,如状态码、头部信息和响应体(网页源代码)。
4. **HTML解析**:在获取到网页源代码后,需要解析HTML以提取图片URL。可以使用Qt的QDomDocument或第三方库如QtWebKit或QtWebEngine来解析HTML。
5. **QNetworkRequest**:使用图片URL创建QNetworkRequest对象,然后再次通过QNetworkAccessManager发起新的请求,以下载图片。
6. **图片保存**:接收到图片数据后,可以将其保存到本地文件系统。Qt提供了QFile类进行文件操作,可以将接收到的数据写入文件,完成图片下载。
7. **多线程**:为了提高爬虫效率,可能会涉及到多线程技术。Qt的QThread类可以帮助我们实现异步下载,同时处理多个图片请求,避免阻塞主线程。
8. **异常处理**:在编写爬虫过程中,需要考虑网络错误、编码问题等异常情况,使用try-catch结构或者其他方式处理可能出现的问题。
:“qt”和“爬虫”标签表明这个压缩包内容是关于使用Qt进行网络爬虫的实践案例或代码示例。
【压缩包子文件的文件名称列表】:只有一个名为"untitled18"的文件,这可能是作者提供的源代码文件,包含了实现上述功能的Qt程序。具体代码中可能包括了定义网络请求、解析HTML、下载图片等功能的类和函数。
"qt爬虫下载图片.zip"是一个介绍如何使用Qt进行网络爬虫并下载图片的实践教程。通过学习这个压缩包中的内容,开发者可以了解到如何结合Qt的网络功能和HTML解析来构建一个基本的图片爬虫,进一步提升自己的网络编程和爬虫技术能力。
友善啊,朋友
- 粉丝: 2787
- 资源: 30
最新资源
- 电影购票系统-Java Web项目
- SPD-Conv-main.zip
- 使用Python和Pygame库创建新年烟花动画效果
- chapter9.zip
- 安居客Python爬虫代码.zip
- 企业可持续发展性数据集,ESG数据集,公司可持续发展性数据(可用于多种企业可持续性研究场景)
- 车辆轨迹自适应预瞄跟踪控制和自适应p反馈联合控制,自适应预苗模型和基于模糊p控制均在simulink中搭建 个人觉得跟踪效果相比模糊pid效果好很多,轨迹跟踪过程,转角控制平滑自然,车速在36到72
- 数据分析-49-客户细分-K-Means聚类分析
- TIA PORTAL V18 UPD5更新包(2024.10最新)-链接地址.txt
- 使用Python和Pygame实现圣诞节动画效果
- 自动驾驶不同工况避障模型(perscan、simulink、carsim联仿),能够避开预设的(静态)障碍物
- 100个情侣头像,唯美手绘情侣头像
- 国际象棋检测10-YOLO(v5至v9)、COCO、CreateML、Paligemma数据集合集.rar
- 2024~2025(1)Oracle数据库技术A卷-22软单、软嵌.doc
- 睡眠健康与生活方式数据集,睡眠和生活习惯关联分析(睡眠影响因素)
- 浪漫节日代码 - 爱心代码、圣诞树代码