web-dev-qa-db-ja.com

Webスクレイピングのオプション-C ++バージョンのみ

Webスクレイピング用の優れたC++ライブラリを探しています。
それは(する必要がある C/C++であり、何もないであるので、 HTMLスクレイピングのオプション または他の=に誘導しないでくださいSO C++についても言及されていない質問/回答。

34
Piotr Dobrogost
  • libcurlhtmlファイルをダウンロードします
  • libtidy有効なxmlに変換する
  • libxmlは、XMLを解析/ナビゲートします
42
Kyle Simek

Myhtml C/C++パーサーを使用 here ;非常にシンプル、非常に速い。 C99以外の依存関係はありません。また、CSSセレクターが組み込まれています(例 here

2
Halcyon

Qt5.6.2をお勧めします。この強力なライブラリは、

  1. QNetworkAccessManager、QNetworkReply、QNetworkProxyなどの高レベルで直感的な非同期ネットワークAPI
  2. QRegularExpressionのような強力な正規表現クラス
  3. QtWebEngineのようなまともなWebエンジン
  4. QWidgetsのような堅牢で成熟したGUI
  5. ほとんどのQt5 APIは適切に設計されており、シグナルとスロットにより非同期コードの記述もはるかに簡単になります
  6. 優れたUnicodeサポート
  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で検索されたほとんどすべての画像を削ることができます。

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

2
StereoMatching
// 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));
}
2
DanielB