【问题标题】:Unmatching results from browser and code while retrieving a page with QNetworkRequest and QNetworkAccessManager使用 QNetworkRequest 和 QNetworkAccessManager 检索页面时来自浏览器和代码的结果不匹配
【发布时间】:2012-09-05 18:07:26
【问题描述】:

我正在编写一个简单的网络蜘蛛。 想法是使用 QNetworkAccessManager、QNetworkReply 和 QNetworkRequest 以编程方式获取页面,一切正常。

我遇到的问题是(对于某些页面)我以编程方式或通过使用浏览器“手动”访问页面得到不同/不匹配的结果。 我总是得到语法正确的 HTML 页面,但在我看来它们就像某种“蜘蛛保护”的答案。 我指的页面不是 POST 页面,我正在做的测试是非常简单的 url 页面,有时带有参数(例如 www.sample.com/index.php?param=something),有时甚至是普通页面.html 网址。

伪代码如下:

QNetworkRequest req;
req.setUrl(QUrl(myurl));
req.setRawHeader(*I did try this one with no success*);
QNetworkAccessManager man;
QNetworkReply rep = man->get(req);
//finish and error slots connection code here

。 . .

void replyFinished()
{
    QNetworkReply* rep = qobject_cast<QNetworkReply *>(sender());
    if (rep->error() == QNetworkReply::NoError)
    {
        // read data from QNetworkReply here
        QByteArray bytes = rep->readAll();
        QString stringa(bytes); 
        qDebug() << stringa;
    }
}

在finish() 槽中,我正在打印来自networkreply 的数据,有时我会从浏览器中通过手动访问url 获得的简单“查看源代码”操作得到不匹配的结果。

有时我会得到一个自定义的“未找到”页面,有时是一些带有登录表单或其他意外内容的更奇怪的页面。 也许这是某种蜘蛛保护?谁能帮忙?

【问题讨论】:

    标签: qt web-crawler qnetworkaccessmanager


    【解决方案1】:

    有 3 种主要方法可以防止网络蜘蛛:

    • Web 浏览器识别 - 使用消息头,网站可以看到浏览器和 Web 爬虫之间的区别。您写道您使用了原始标头 - 您确定您提供的标头和值与您的浏览器相同吗?
    • 会话数据/cookies - 与以前的密切相关。登录表单表明该网站希望获得一些浏览器通常会发送的信息。
    • Javascript 代码将实际的 html 数据打印到 Web 文档中。您是通过在 Web 浏览器中检查网站的源代码(查看-> 源代码)来检查是否获得相同的 html 代码,还是通过 Firebug 等工具检查 html 布局?
    • Javascript 重定向 - 浏览器正在下载使用 javascript 将您重定向到包含实际内容的网站的网站。

    就前两个选项而言 - 您应该使用一些 tcp/ip 嗅探器(例如 Smart sniff)来检查浏览器发送的数据是否与您的程序发送的数据相同。如果相等,则意味着您可能遇到了某种 javascript-barrier。如果是这样,您可能会尝试使用一些支持 javascript 的浏览引擎,例如 QWebPage。我不知道它在没有连接到任何QWebView 时是否正在执行它的javascript - 也许可能需要隐藏视图。

    如果我发现自己需要模拟浏览器访问某个远程服务,我通常会简单地编写 Firefox-plugin(使用 javascript);这通常可以消除上述任何问题;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多