首页 > 编程语言 >qt/c++ 学习笔记之网页照片爬虫

qt/c++ 学习笔记之网页照片爬虫

时间:2024-12-29 23:26:22浏览次数:7  
标签:Widget qt int 爬虫 c++ url ui include view

*注意:本爬虫使用的qt版本为5.14.2,使用的是qtwebkit类是自己配置了qtwebkit和对应qt版本的openssl,其中qtwebkit类在qt5.15和qt6版本已经删除,需要自己私下配置qtwebkit和对应qt版本的openssl

头文件

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtWebKitWidgets/QWebView>
#include<QWebSettings>
#include<QWebElementCollection>
#include <QtWebKit/qwebsettings.h>

#include <QWebFrame>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
   QWebView *view; //建立qwebview 类来读取url


public slots:
    void on_pushButton_clicked();
    void onProgress(int progress);//加载进度显示
    void onl oadFinished(bool ok);//判断是否加载完成
private:
    //下载图片函数
QImage loadimg(const QString &url);

    Ui::Widget *ui;
};
#endif // WIDGET_H

cpp文件

#include "widget.h"
#include "ui_widget.h"
#include <QWebView>
#include<QWebSettings>
#include<QWebElementCollection>
#include <QWebFrame>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QFileInfo>
#include<windows.h>
#include<stdio.h>
#include <string.h>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    view =new QWebView(this);
     ui->lay->addWidget(view);
qDebug() << "OpenSSL支持情况:" << QSslSocket::supportsSsl();
qDebug()<<"QSslSocket="<<QSslSocket::sslLibraryBuildVersionString();


QWebSettings *sett=view->settings();
//设置程序不显示图片和js
sett->setAttribute(QWebSettings::AutoLoadImages,false);
sett->setAttribute(QWebSettings::JavaEnabled,false);

connect(view,SIGNAL(loadProgress(int)),this,SLOT(onProgress(int)));
connect(view,SIGNAL(loadFinished(bool)),this,SLOT(onLoadFinished(bool)));

}

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


void Widget::on_pushButton_clicked()
{
QUrl url=ui->lineEdit->text();
view->load(url);
}

void Widget::onProgress(int progress)
{
    //进度显示
    QString title=QString::number(progress)+"%";
    this->setWindowTitle(title);

}

void Widget::onLoadFinished(bool ok)
{
qDebug()<<"finish"<<ok;
//取网页的的照片标签
QWebElementCollection element=view->page()->mainFrame()->findAllElements("body> div.container.container-default > main > section > ul > li > article > a > img");

//循环遍历当前网页的照片标签并保存默认目录
for(int i=0;i<element.count();++i)
{
const QWebElement &ele=element.at(i);
QString url=ele.attribute("src");
qDebug()<<url;
QImage image=loadimg(url);

QFileInfo info(url);
QString fileName=info.fileName();
image.save(fileName);
qDebug()<<"保存的图片名称  "<<fileName;
}


qDebug()<<"断点1";
//通过谷歌浏览器可以得到网页下一页的标签为a.next,
QString test="#tuchong-com > div.container.container-default > main > section > div > div > div > a.next";
element = view->page()->mainFrame()->findAllElements(test);
qDebug()<<"断点2";
//只取10页的照片
if(element.count()>=10)
{

    qDebug()<<"没有了";
    return;
}
Sleep(8000);

const QWebElement &ele=element.at(0);


![请添加图片描述](https://i-blog.csdnimg.cn/direct/d985708f000948ef90bd65dc3d3e7e11.png)

//当前网页的网站显示为https://landscape.tuchong.com/?page=,  通过谷歌浏览器可以知道href标签的值为?page=,这里是页数
QString urlnext="https://landscape.tuchong.com/"+ele.attribute("href");
qDebug()<<urlnext;
QUrl nexturl=urlnext;
//加载新网页
view->load(nexturl);
}

QImage Widget::loadimg(const QString &url)
{
    QNetworkAccessManager mgr;
 QNetworkReply *rep=mgr.get(QNetworkRequest (QUrl(url)));
 QEventLoop loop;
 connect(rep,SIGNAL(finished()),&loop,SLOT(quit()));
 //卡住等待结束(quit)
 loop.exec();

 QByteArray date=rep->readAll();

 QImage image =QImage::fromData(date);

 return image;

}

在这里插入图片描述
在这里插入图片描述

main.cpp

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

在这里插入图片描述
在这里插入图片描述

标签:Widget,qt,int,爬虫,c++,url,ui,include,view
From: https://blog.csdn.net/weixin_41447544/article/details/144811945

相关文章

  • C++关键字
    C++关键字static类和结构体外的static被static修饰后只在内部发生链接,其作用域只在其所在的文件中。类和结构体内的staticstructEntity{ staticintx,y; 静态成员变量 staticvoidPrint() { std::cout<<x<<","<<y<<std::endl; }};intEntity::x; //......
  • QT基础篇(鼠标事件)
    QT事件(鼠标篇)前言一、事件二、使用步骤1.查找事件2.事件的处理总结前言本文讲解众多事件中的其中一个,鼠标事件。并以此为例子学习其他事件。本文只是简单讲解,如需详细请查看别人的博客一、事件在Qt中使用⼀个对象来表示⼀个事件。所有的Qt事件均继承于抽象类QEv......
  • 上班摸鱼,我在领导眼皮子底下研究淘宝、亚马逊的反爬虫机制【完整源码】
    事情是这样的下午两点,闷热的会议室空调稳稳的坐在那里好像睡着了领导的嘴在幻灯片刺眼亮光的映照下非常斗志昂扬的一张一合我敏锐的察觉到领导突然扬起的声调若有所思的对着他深深的点了点头然后,摸出了我的开发工具。。。亚马逊是全球最大的购物平台很多商品信息......
  • C++标准库
        【欢迎关注编码小哥,学习更多实用的编程方法和技巧】    C++标准库是C++语言的重要组成部分,它为程序员提供了一系列的功能强大的工具和组件,帮助他们更高效地进行软件开发。标准库不仅包括基本的输入输出功能,还涵盖了数据结构、算法、内存管理、日期和时间处......
  • c++《射击小游戏》
    #include<easyx.h>#include<time.h>#include<conio.h>classBullet;classTank;classE_Bullet;classBoss;booldead=false;boolwined=false;structpos//坐标类{inta;intb;};classE_Bullet//敌人打出的子弹{public:clock_td;in......
  • QT写的动态正弦曲线图显示并打印
    创建一个显示正弦曲线的 QChartView,并通过定时器不断更新图表数据,模拟动态数据。此外,还包含了一个在特定时间自动将图表导出为PDF文件的功能。代码分析和注释#include<QApplication>#include<QMainWindow>#include<QChartView>#include<QLineSeries>#include<QV......
  • 【C++动态规划】1105. 填充书架|2104
    本文涉及知识点下载及打开打包代码的方法兼述单元测试C++动态规划LeetCode1105.填充书架给定一个数组books,其中books[i]=[thicknessi,heighti]表示第i本书的厚度和高度。你也会得到一个整数shelfWidth。按顺序将这些书摆放到总宽度为shelfWidth的书架上......
  • while循环——c++新手必学第四课
    在学第二课时,我们讲过for循环加上if判断就能循环判断,相当于while。所以,不言而喻,while循环的功能就是循环判断。文章目录一、while循环是什么?二、使用示例1.基本用法总结一、while循环是什么?while循环就是循环判断,也就是if加for的快捷方式。二、使用示例1.......
  • C++ 电子学会二级2024年12月部分考题答案
    1、逆行描述:网上有个段子说:妻子在家听广播,听到某高速路上有一辆车在逆行,想到丈夫在那条高速上行驶,就打电话对丈夫说:“老公啊,你走的那条高速上有一辆车在逆行,你小心点。”她丈夫说:“何止啊!我看好几百辆车都在逆行!”现在我们查了一下高速公路上拍到的好几百辆车的时速,发现有......
  • C++经典面试题50道!!!(秋招必备)
    往期回顾:【QT入门】Qt槽函数五种常用写法介绍-CSDN博客【QT入门】QListWidget各种常见用法详解之列表模式-CSDN博客【QT入门】Qt自定义控件与样式设计之QPushButton常用qss_qpushbuttonqss-CSDN博客50道资源完整版:https://download.csdn.net/download/LF__plus/902......