Está bien, voy a tratar de apuntar en la dirección correcta. Conceptualmente, un webcrawler es bastante simple. Gira en torno a una estructura de datos de cola FIFO que almacena URL pendientes. C++ tiene una estructura de cola incorporada en la biblioteca estándar, std::queue
, que puede usar para almacenar las URL como cadenas.
El algoritmo básico es bastante sencillo:
- Comience con una URL base que se seleccionar y colocarlo en la parte superior de la cola
- Pop el URL en la parte superior de la cola y descargarlo
- analizar el archivo HTML descargado y extraer todos los enlaces
- Insertar cada enlace se extrae en la cola
- Goto paso 2, o detener una vez que llegue algún límite especificado
Ahora, me dijeron que un webcrawler es conceptualmente simple, pero su aplicación no es tan simple. Como puede ver en el algoritmo anterior, necesitará: una biblioteca de redes HTTP que le permita descargar URL, y, un buen analizador de HTML que le permitirá extraer enlaces. Usted mencionó que podría usar wget
para descargar páginas. Eso simplifica un poco las cosas, pero aún necesita analizar los documentos HTML descargados. El análisis correcto de HTML es una tarea no trivial. Una simple búsqueda de cadenas para <a href=
solo funcionará a veces. Sin embargo, si esto es solo un programa de juguete que está utilizando para familiarizarse con C++, una simple búsqueda de cadenas puede ser suficiente para sus propósitos. De lo contrario, debe usar una biblioteca de análisis HTML seria.
También hay otras consideraciones que debe tener en cuenta al escribir un webcrawler, como cortesía. La gente se enojará y posiblemente bloqueará su IP si intenta descargar demasiadas páginas, demasiado rápido, del mismo host. Por lo tanto, es posible que deba implementar algún tipo de política en la que su webcrawler espere un breve período de tiempo antes de descargar cada sitio. También necesita algún mecanismo para evitar volver a descargar la misma URL, obedecer el robots exclusion protocol, evitar las trampas de rastreo, etc ... Todos estos detalles se suman para hacer que la implementación real de un webcrawler robusto no sea tan simple.
Dicho esto, estoy de acuerdo con larsmans en los comentarios. Un webcrawler no es la mejor manera de aprender C++. Además, C++ no es el mejor lenguaje para escribir un webcrawler. El acceso de bajo nivel y bajo rendimiento que obtienes en C++ es inútil cuando escribes un programa como un webcrawler, que pasa la mayor parte del tiempo esperando que las URL se resuelvan y descargar. Un lenguaje de scripting de alto nivel como Python o algo se adapta mejor a esta tarea, en mi opinión.
Primero aprenda C++ correctamente, luego intente hacer algo tan complicado como un rastreador. –
Hmm ... ¿Incluso un simple rastreador? No es tan complicado como Larbin. Creo que, mientras hago crawler, me ayudará a aprender muchas cosas en C++. Adivina, mi pensamiento es incorrecto – popurity09
considera usar https://github.com/Microsoft/cpprestsdk – Sergei