44

Web スクレイピングに適した C++ ライブラリを探しています。
それC/C++ でなければならないので、C++ が言及されていないHTML スクレイピングのオプションやその他の SO の質問/回答に私を誘導しないでください。

4

4 に答える 4

54
  • htmlファイルをダウンロードするためのlibcurl
  • 有効なxmlに変換するlibtidy
  • xmlを解析/ナビゲートするためのlibxml
于 2009-05-07T14:12:41.260 に答える
4

Qt5.6.2 をお勧めします。この強力なライブラリが提供してくれます。

  1. QNetworkAccessManager、QNetworkReply、QNetworkProxy などの高レベルで直感的な非同期ネットワーク API
  2. QRegularExpression のような強力な正規表現クラス
  3. QtWebEngine のような適切な Web エンジン
  4. QWidgets のような堅牢で成熟した GUI
  5. ほとんどの Qt5 API は適切に設計されており、シグナルとスロットにより、非同期コードの記述もはるかに簡単になります。
  6. 優れたユニコードのサポート
  7. 機能豊富なファイル システム ライブラリ。ファイルを保存するための標準パスの作成、削除、名前変更、または検索は、Qt5 では簡単です。
  8. QNetworkAccessManager の非同期 API により、一度に多くのダウンロード要求を簡単に生成できます
  9. 主要なデスクトップ プラットフォーム、Windows、Mac OS、Linux にまたがり、一度コンパイルすればどこでも、1 つのコード ベースのみで記述できます。
  10. Windows と mac に簡単にデプロイできます (linux?たぶん linuxdeployqt で多くの問題を解決できます)
  11. Windows、Mac、Linux に簡単にインストール
  12. 等々

私はすでに Qt5 で画像スクレーパー アプリを作成しました。このアプリは、Google、Bing、Yahoo で検索されたほぼすべての画像をスクレイピングできます。

詳細については、私の github プロジェクトをご覧ください。Qt5 でデータをスクレイピングする方法についての概要をブログに書き留めました (スタック オーバーフローで投稿するには長すぎます)。

于 2017-05-31T08:38:03.267 に答える
0
// download winhttpclient.h
// --------------------------------
#include <winhttp\WinHttpClient.h>
using namespace std;
typedef unsigned char byte;
#define foreach         BOOST_FOREACH
#define reverse_foreach BOOST_REVERSE_FOREACH

bool substrexvealue(const std::wstring& html,const std::string& tg1,const std::string& tg2,std::string& value, long& next) {
    long p1,p2;
    std::wstring wtmp;
    std::wstring wtg1(tg1.begin(),tg1.end());
    std::wstring wtg2(tg2.begin(),tg2.end());

    p1=html.find(wtg1,next);
    if(p1!=std::wstring::npos) {
        p2=html.find(wtg2,next);
        if(p2!=std::wstring::npos) {
            p1+=wtg1.size();
            wtmp=html.substr(p1,p2-p1-1);
            value=std::string(wtmp.begin(),wtmp.end());
            boost::trim(value);
            next=p1+1;
        }
    }
    return p1!=std::wstring::npos;
}
bool extractvalue(const std::wstring& html,const std::string& tag,std::string& value, long& next) {
    long p1,p2,p3;
    std::wstring wtmp;
    std::wstring wtag(tag.begin(),tag.end());

    p1=html.find(wtag,next);
    if(p1!=std::wstring::npos) {
        p2=html.find(L">",p1+wtag.size()-1);
        p3=html.find(L"<",p2+1);
        wtmp=html.substr(p2+1,p3-p2-1);
        value=std::string(wtmp.begin(),wtmp.end());
        boost::trim(value);
        next=p1+1;
    }
    return p1!=std::wstring::npos;
}
bool GetHTML(const std::string& url,std::wstring& header,std::wstring& hmtl) {
    std::wstring wurl = std::wstring(url.begin(),url.end());
    bool ret=false;
    try {
        WinHttpClient client(wurl.c_str());
        std::string url_protocol=url.substr(0,5);
        std::transform(url_protocol.begin(), url_protocol.end(), url_protocol.begin(), (int (*)(int))std::toupper);
        if(url_protocol=="HTTPS")    client.SetRequireValidSslCertificates(false);
        client.SetUserAgent(L"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0");
        if(client.SendHttpRequest()) {
            header = client.GetResponseHeader();
            hmtl = client.GetResponseContent();
            ret=true;
        }
    }catch(...) {
        header=L"Error";
        hmtl=L"";
    }
    return ret;
}
int main() {
    std::string url = "http://www.google.fr";
    std::wstring header,html;
    GetHTML(url,header,html));
}
于 2014-10-17T16:12:18.707 に答える