判断Url是否合法有效,并做响应处理(Qt--QWebEngine)

本文介绍了一种在Qt应用程序中处理用户输入URL的方法,通过正则表达式验证URL的有效性,并针对无效输入智能地拼接不同的搜索引擎参数,实现快速搜索。支持包括百度、谷歌、必应和360在内的多种搜索引擎。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考资料:
url regular expression:https://stackoverflow.com/search?q=url+regular+expression
Qt regular expression:https://www.cnblogs.com/hellovenus/p/4984751.html
Describes search engine parameters:https://blog.youkuaiyun.com/jackpk/article/details/5629710?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
// 判断是否合法有效,合法直接载入,不合法则根据当前设置的搜索引擎,做拼接处理,再行载入
void slotUrlLineEditReturnPressed()
{
    QString text = m_urlLineEdit->text();  //locationbar input data
    int pos = 0;

    QRegExp rx;
    //url regular expression
    rx.setPattern("(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]");  
    QRegExpValidator rv;
    rv.setRegExp(rx);
    //Test for a match between the url and the regular expression
    QValidator::State rvState = rv.validate(text, pos);
    if (rvState == QValidator::Acceptable) {
        //fromUserInput()  ==  setUrl()
        m_engineView->setUrl(QUrl::fromUserInput(text));
    } else {  // rvState == QValidator::Intermediate || rvState == QValidator::Invalid
        QString targer_url;
        switch (mApp->DSettings()->CurrentSearchEngine()) {
            case 0:  // Baidu
                targer_url =
                    QString("https://www.baidu.com/baidu?tn=monline_3_dg&ie=utf-8&wd=%1").arg(text);
                m_engineView->setUrl(QUrl(targer_url));
                break;
            case 1:  // Google
                targer_url = QString("https://www.google.com/search?q=%1").arg(text);
                m_engineView->setUrl(QUrl(targer_url));
                break;
            case 2:  // Bing
                targer_url =
                    QString("https://www.bing.com/search?form=MOZLBR&pc=MOZI&q=%1").arg(text);
                m_engineView->setUrl(QUrl(targer_url));
                break;
            case 3:  // 360
                targer_url =
                    QString("https://www.so.com/s?ie=utf-8&src=360chrome_toolbar_search&q=%1")
                        .arg(text);
                m_engineView->setUrl(QUrl(targer_url));
                break;
        }
    }
}
### 使用 QT 实现 1688 网络爬虫或 API 调用 #### 关于 QT 和网络编程的支持 Qt 提供了一套完整的网络模块 `QtNetwork`,可以用来发送 HTTP 请求接收响应。这使得开发者能够轻松实现与外部服务(如阿里巴巴的 1688 平台)交互的功能[^1]。 对于访问 1688 的具体需求,可以通过两种主要方式实现:一是直接调用其公开的 RESTful API 接口;二是模拟浏览器行为抓取页面上的动态内容。下面分别讨论这两种方案的技术细节及其可行性。 --- #### 方案一:通过官方 API 进行数据采集 如果目标是合法合规地获取商品信息,则建议优先考虑使用阿里云开放平台提供的正式文档说明中的接口资源。这些标准化的服务通常会包含更全面的商品属性字段以及结构化的 JSON 数据返回形式,便于后续分析处理。 要完成这样的操作,在 C++ 中可借助库函数发起 GET/POST 类型请求: ```cpp #include <QCoreApplication> #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QUrlQuery> void fetchProductData(const QString &productId){ QNetworkAccessManager *manager = new QNetworkAccessManager(); QUrl url("https://api.1688.com/product"); QUrlQuery query; query.addQueryItem("id", productId); query.addQueryItem("fields","title,price,sales"); url.setQuery(query.query()); QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json;charset=UTF-8"); connect(manager,&QNetworkAccessManager::finished,[=](QNetworkReply* reply){ if(reply->error() == QNetworkReply::NoError){ QByteArray responseData = reply->readAll(); qDebug()<<"Response Data:"<<responseData; }else{ qDebug()<<"Error occurred:"<<reply->errorString(); } manager->deleteLater(); }); manager->get(request); } ``` 注意以上仅为伪代码示意,实际应用前需查阅最新版次API手册确认参数设置准确性[^3]。 --- #### 方案二:无头浏览器模式下的 HTML 解析 当无法获得授权或许可时,另一种常见法就是模仿真实用户的在线活动过程——即所谓的“屏幕刮擦”。这种方法涉及加载整个HTML DOM树之后再提取感兴趣的部分节点值出来。然而需要注意的是,这种方式往往违反网站条款规定,且容易被反爬机制检测到而封禁IP地址。 这里给出一个简化版本的例子展示如何运用 QtWebKit/QWebEngine 来渲染 JavaScript 渲染后的复杂布局效果: ```cpp #include <QApplication> #include <QWebEnginePage> #include <QWebChannel> class WebScraper : public QObject { public slots: void onLoadingFinished(bool ok) { page()->runJavaScript( "document.querySelector('.item-title').innerText;", [](const QVariant& result){ qDebug()<<result.toString(); }); QApplication::quit(); } private: QWebEnginePage* m_page; public: explicit WebScraper(QObject *parent=nullptr):QObject(parent),m_page(new QWebEnginePage(this)){ qRegisterMetaType<QWebEngineHistory>(); connect(m_page,SIGNAL(loadFinished(bool)),this,SLOT(onLoadingFinished(bool))); } ~WebScraper(){ delete m_page; } void load(const QUrl &url){ m_page->load(url); } }; int main(int argc,char **argv){ QApplication app(argc, argv); WebScraper scraper; scraper.load(QUrl("http://www.example.com")); return app.exec(); } #include "main.moc" ``` 此脚本片段展示了基本的工作流程,但为了提高效率和隐蔽程度还需要加入更多高级特性比如代理池管理、User-Agent随机化等等[^2]. --- ### 总结 无论是选择遵循规则调用已公布好的REST APIs还是采取更为激进的手法自行挖掘隐藏的数据源都各有优劣之处。前者虽然受限较多但也因此更加稳定可靠;后者尽管灵活自由却伴随着较高的风险成本。最终决定取决于具体的业务场景和个人偏好等因素综合考量得出结论。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值