本来是想做一个爬取路由器ip数据的小爬虫,但奈何获取不来数据,百度了之后说是路由器网页是动态网页,无法爬取,个人对这方面不是很了解。
这边的demo爬取的数据是D站个人信息页面的数据
虽然还不知道有啥具体作用,先记下笔记吧
需要的头文件:
QNetworkAccessManager 网络操作类
QNetworkReply 接收数据的类
QNetworkRequest 存放请求信息的类
QNetworkCookie Cookie类
代码很简单,拿到cookie信息,在request中设置headers,将cookie保存进请求中,通过manager的get函数获取数据
运行界面
下面是代码
头文件
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
//vs2017编译器使用中文有bug,需要在头文件与cpp加上下面这段代码,变更编码
#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif
namespace Ui {
class MainWidget;
}
class MainWidget : public QWidget
{
Q_OBJECT
public:
explicit MainWidget(QWidget *parent = 0);
~MainWidget();
private slots:
void getMyDiliUserInfo();
private:
Ui::MainWidget *ui;
};
#endif // MAINWIDGET_H
cpp文件
#include "mainwidget.h"
#include "ui_mainwidget.h"
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkCookie>
#include <QEventLoop>
#include <QMessageBox>
#include <QFile>
#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif
MainWidget::MainWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MainWidget)
{
ui->setupUi(this);
setWindowTitle("Demo");
connect(ui->pushButton, &QPushButton::clicked, this, &MainWidget::getMyDiliUserInfo);
}
MainWidget::~MainWidget()
{
delete ui;
}
void MainWidget::getMyDiliUserInfo()
{
QEventLoop loop;
QNetworkAccessManager manager;
QNetworkRequest request;
QString url = "http://usr.005.tv/";
//此处是登录之后的cookie信息,关于如何获取cookie,百度,此处就不给出cookie了
QString cookie = "";
//此处是浏览器伪装,此处信息为我的浏览器信息
QString userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36";
QByteArray cookieByte = cookie.toUtf8();
QList<QNetworkCookie> list;
list.push_back(QNetworkCookie(cookieByte));
QVariant var;
var.setValue(list);
request.setUrl(QUrl(url));
//设置Headers的信息,上下文类型,浏览器信息,以及cookie
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
request.setHeader(QNetworkRequest::UserAgentHeader, userAgent);
request.setHeader(QNetworkRequest::CookieHeader, var);
QNetworkReply * reply = manager.get(request);
connect(&manager, &QNetworkAccessManager::finished, &loop, &QEventLoop::quit);
loop.exec();
QFile file("F:/解压/data.txt");
file.open(QIODevice::ReadWrite | QIODevice::Text);
QTextStream out(&file);
out << reply->readAll() << endl;
file.close();
QMessageBox::information(this, "Info", "获取完毕");
reply->deleteLater();
}