Qt学习笔记-web图片爬取器(webKit)Qt5.6以下的版本才有

在上实例和源码前,说下有个东西:
css探测器:
如下图:
这里写图片描述
拷贝的代码如下:
body > div.wrap > div:nth-child(5) > div:nth-child(1) > div.tupian > p:nth-child(3) > img
这里去掉:就是那一组图片(所有子元素),如下代码:
body > div.wrap > div > div > div.tupian > p> img
这里写图片描述

这种方式就,程序运行后,进入指定的网页,构造指定的css探测器,就可以爬图片了!
本文章例子为:
http://www.qqjay.com/html/old8/211225.html

程序运行截图如下:
这里写图片描述

此时就有下载的文件了:
这里写图片描述

程序代码如下:
widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QImage>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_btnLoad_clicked();
    void onProgress(int progress);
    void onLoadFinished(bool ok);

private:
    QImage downLoadImage(const QString &url);

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

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.cpp

e <QEventLoop>
#include <QUrl>
#include <QNetworkAccessManager>
#include <QWebElementCollection>
#include <QNetworkRequest>
#include <QFileInfo>
#include <QNetworkReply>
#include <QByteArray>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //webView的设置
    QWebSettings *settings=ui->webView->settings();
    settings->setAttribute(QWebSettings::AutoLoadImages,false);
    settings->setAttribute(QWebSettings::JavascriptEnabled,false);

    connect(ui->webView,SIGNAL(loadProgress(int)),this,SLOT(onProgress(int)));
    connect(ui->webView,SIGNAL(loadFinished(bool)),this,SLOT(onLoadFinished(bool)));
}

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

void Widget::on_btnLoad_clicked()
{
    ui->webView->load(QUrl(ui->lineEdit->text()));
}

void Widget::onProgress(int progress)
{
    QString title=QString::number(progress)+"%";
    this->setWindowTitle(title);
}

void Widget::onLoadFinished(bool ok)
{
    qDebug()<<"load finished,"<<ok;
    QWebElementCollection elements=ui->webView->page()->mainFrame()->findAllElements("body > div.wrap > div > div > div.tupian > p > img");

    for(int i=0;i<elements.count();i++){
        const QWebElement &ele=elements.at(i);
        QString url=ele.attribute("src");

        QImage image=downLoadImage(ele.attribute("src"));
        QFileInfo info(url);
        QString fileName=info.fileName();

        image.save(fileName);
    }
}

QImage Widget::downLoadImage(const QString &url)
{
    QNetworkAccessManager mgr;
    QNetworkRequest request;
    request.setUrl(QUrl(url));
    QNetworkReply *reply=mgr.get(request);

    QEventLoop loop;
    connect(reply,SIGNAL(finished()),&loop,SLOT(quit()));

    loop.exec();    //停止事件循环,不往下执行,等待quit   //等待下载完成,我草,我以前都是用计时器。

    QByteArray data=reply->readAll();
    QImage image=QImage::fromData(data);
    return image;
}

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/81124746