c++ screen-scraping

Opciones para web scraping-solo versión C++



screen-scraping (4)

Estoy buscando una buena biblioteca de C ++ para raspado web.
Tiene que ser C / C ++ y nada más, así que, por favor, no me dirija a Opciones para raspado de HTML u otras preguntas / respuestas de SO donde C ++ ni siquiera se menciona.


Recomiendo Qt5.6.2, esta potente biblioteca nos ofrece

  1. API de alto nivel, intuitiva y asíncrona como QNetworkAccessManager, QNetworkReply, QNetworkProxy, etc.
  2. Potente clase de expresiones regulares como QRegularExpression
  3. Motor web decente como QtWebEngine
  4. Gui robusto y maduro como QWidgets
  5. La mayoría de los api Qt5 están bien diseñados, la señal y la ranura hacen que la escritura de códigos asíncronos sea mucho más fácil también
  6. Gran soporte de Unicode
  7. Biblioteca de sistema de archivos rico en características. Ya sea que crear, eliminar, renombrar o encontrar la ruta estándar para guardar archivos sea pan comido en Qt5
  8. La API asíncrona de QNetworkAccessManager facilita la generación de muchas solicitudes de descarga a la vez
  9. Cruce las principales plataformas de escritorio, Windows, Mac OS y Linux, escriba una vez compilado en cualquier lugar, solo un código base.
  10. Fácil de implementar en Windows y Mac (¿linux? Quizás linuxdeployqt puede ahorrarnos muchos problemas)
  11. Fácil de instalar en windows, mac y linux.
  12. Y así

Ya escribí una aplicación de raspador de imágenes de Qt5, esta aplicación puede raspar casi todas las imágenes buscadas por Google, Bing y Yahoo.

Para saber más detalles al respecto, visite mi proyecto github . Escribí una descripción general de alto nivel sobre cómo raspar los datos por Qt5 en mis blogs (es demasiado largo para publicar en el desbordamiento de pila).


Utilice myhtml C / C ++ parser here ; Muerto simple, muy rápido. No hay dependencias excepto C99. Y tiene selectores de CSS incorporados (ejemplo here )


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


  • libcurl para descargar el archivo html
  • libtidy para convertir a xml válido
  • libxml para analizar / navegar el xml