2

私は単純な Web スパイダーを書いています。アイデアは、QNetworkAccessManager、QNetworkReply、および QNetworkRequest を使用してプログラムでページを取得することであり、すべて正常に動作します。

私が遭遇する問題は、(一部のページでは) プログラムによって、またはブラウザーで「手動で」ページにアクセスすることによって、異なる/一致しない結果が得られることです。私は常に構文的に正しい HTML ページを取得しますが、それらはある種の「スパイダー保護」の回答のように見えます。私が参照しているページは POST ページではありません。私が行っているテストは、非常に単純な URL ページを使用しており、パラメーター (例: www.sample.com/index.php?param=something) を使用する場合もあれば、プレーン ページを使用する場合もあります。 .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<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

Webspider から保護する主な方法は 3 つあります。

  • Web ブラウザーの識別 - メッセージ ヘッダーを使用して、Web サイトはブラウザーと Web クローラーの違いを認識しています。生のヘッダーを使用したと書いていますが、ブラウザーと同じヘッダーと値を提供していると確信していますか?
  • セッション データ/クッキー - 以前のものと密接に関連しています。ログインフォームは、ブラウザが通常送信する情報をウェブサイトが取得することを期待していることを示唆しています。
  • 実際の html データを Web ドキュメントに出力する Javascript コード。Web ブラウザで Web サイトのソースをチェックして同じ HTML コードが得られるかどうかをチェックしていますか (view->source)、または Firebug のようなツールで HTML レイアウトをチェックしていますか?
  • Javascript リダイレクト - ブラウザは、実際のコンテンツを含む Web サイトにリダイレクトするために JavaScript を使用している Web サイトをダウンロードしています。

最初の 2 つのオプションに関する限り、スマート スニフのような tcp/ip スニファを使用して、ブラウザから送信されたデータがプログラムから送信されたデータと等しいかどうかを確認する必要があります。等しい場合は、おそらく何らかの JavaScript バリアにぶつかっていることを意味します。その場合は、QWebPageなどの JavaScript 対応のブラウジング エンジンを使用してみてください。ただし、 QWebViewに接続していないときにjavascriptを実行しているかどうかはわかりません-おそらく非表示のビューが必要になるかもしれません。

ブラウザをリモート サービスに偽装する必要がある場合は、通常、単純に Firefox-plugin (javascript を使用) を記述します。通常、上記の問題のいずれかを排除します;)

于 2012-09-05T23:47:37.273 に答える