使用QNetworkRequest和QNetworkAccessManager检索页面时,浏览器和代码的结果不匹配

时间:2012-09-05 18:07:26

标签: qt web-crawler qnetworkaccessmanager

我正在写一个简单的网络蜘蛛。 我的想法是使用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()插槽中,我正在从网络中打印数据,有时我通过手动访问URL获得浏览器中简单的“查看源”操作的不匹配结果。

有时我会收到一个自定义的“未找到”页面,有时会出现一些带有登录表单或其他意外内容的奇怪页面。 也许它是某种蜘蛛保护?有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

保护webspiders有三种主要方法:

  • Web浏览器识别 - 使用邮件标题,网站看到了浏览器和Web爬虫之间的区别。您写道您使用了原始标题 - 您确定提供了与浏览器相同的标题和值吗?
  • 会话数据/ coockies - 与以前的数据密切相关。登录表单表明网站希望获得浏览器通常会发送的一些信息。
  • Javascript代码将实际的html数据打印到web文档中。您是否通过在Web浏览器中查看网站的来源(view-&gt; source)来检查您是否获得相同的html cody,或者您是否通过某些工具(如Firebug)检查html布局?
  • Javascript重定向 - 浏览器正在下载使用javascript重定向到具有实际内容的网站的网站。

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

如果我发现自己处于需要模拟浏览器某些远程服务的情况,我通常只需编写Firefox-plugin(使用javascript);通常可以消除上述任何问题;)