在上实例和源码前,说下有个东西:
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;
}