2

我正在写一个简单的网络蜘蛛。想法是使用 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 获得的简单“查看源代码”操作中得到不匹配的结果。

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

4

1 回答 1

0

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

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

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

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

于 2012-09-05T23:47:37.273 回答