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

Qt 使用QNetworkRequest和QNetworkAccessManager检索页面时,浏览器和代码的结果不匹配,qt,web-crawler,qnetworkaccessmanager,Qt,Web Crawler,Qnetworkaccessmanager,我在写一个简单的蜘蛛网。 其思想是使用QNetworkAccessManager、QNetworkReply和QNetworkRequest以编程方式获取页面,一切正常 我遇到的问题是(对于某些页面),我通过编程或使用浏览器“手动”访问页面,获得不同/不匹配的结果。 我总是得到正确的HTML页面,但在我看来,它们就像某种“蜘蛛保护”的答案。 我所指的页面不是POST页面,我所做的测试是使用非常简单的url页面,有时使用参数(例如www.sample.com/index.php?param=som

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

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

伪代码如下:

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(sender());
如果(rep->error()==QNetworkReply::NoError)
{
//从QNetworkReply此处读取数据
QByteArray bytes=rep->readAll();
QString stringa(字节);

qDebug()有三种主要的方法可以防止WebSpider:

  • Web浏览器标识-使用消息标题网站看到了浏览器和Web爬虫之间的差异。您写道您使用了原始标题-您确定提供了与浏览器相同的标题和值吗
  • 会话数据/coockies-与以前的会话数据/coockies密切相关。登录表单表明该网站希望获得一些浏览器通常会发送的信息
  • Javascript代码将实际html数据打印到web文档中。您是通过在web浏览器中检查网站的源代码(查看->源代码)来检查是否得到相同的html代码,还是通过Firebug之类的工具来检查html布局
  • Javascript重定向-浏览器正在下载使用Javascript将您重定向到包含实际内容的网站的网站
就前两个选项而言,您应该使用一些tcp/ip嗅探器来检查浏览器发送的数据是否与程序发送的数据相等。如果相等,则意味着您可能遇到了某种javascript障碍。如果是这样,您可以尝试使用一些支持javascript的浏览引擎,如。我不知道它是否正在执行当它没有连接到任何浏览器时,它是javascript——也许需要一个隐藏的视图


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

有3种主要的方法来防止WebSpider:

  • Web浏览器标识-使用消息标题网站看到了浏览器和Web爬虫之间的差异。您写道您使用了原始标题-您确定提供了与浏览器相同的标题和值吗
  • 会话数据/coockies-与以前的会话数据/coockies密切相关。登录表单表明该网站希望获得一些浏览器通常会发送的信息
  • Javascript代码将实际html数据打印到web文档中。您是通过在web浏览器中检查网站的源代码(查看->源代码)来检查是否得到相同的html代码,还是通过Firebug之类的工具来检查html布局
  • Javascript重定向-浏览器正在下载使用Javascript将您重定向到包含实际内容的网站的网站
就前两个选项而言,您应该使用一些tcp/ip嗅探器来检查浏览器发送的数据是否与程序发送的数据相等。如果相等,则意味着您可能遇到了某种javascript障碍。如果是这样,您可以尝试使用一些支持javascript的浏览引擎,如。我不知道它是否正在执行当它没有连接到任何浏览器时,它是javascript——也许需要一个隐藏的视图

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

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;
    }
}