Este proyecto extrae información de determinados tipos de locales que estén registrados en google maps filtrando por código postal.
Para conseguirlo, se pueden diferenciar dos etapas en el proceso:
- La primera se encarga de conseguir la URL de búsqueda para cada código postal que se quiera procesar y se registra en una base de datos (fichero formato json o base de datos postgres). Y sólo debe ser ejecutada una única vez para todos los códigos postales para los cuales querramos extraer la información en un futuro. El resultado de su ejecución lo persiste en una base de datos.
- La segunda se encarga de extraer la información de los locales comerciales para cada tipo de local y código postal que se le pase como entrada al programa y para esto usa las urls extraídas en la primera etapa, esto supone un ahorro de tiempo de ejecución y vuelca los resultados en la base de datos.
A continuación se muestra la estructura del proyecto:
.
├── bin
│ ├── clean.sh
│ ├── docker.sh
│ ├── ec2-installation.sh
│ ├── install.sh
│ ├── package.sh
│ └── scrapper.sh
├── Dockerfile
├── gmaps
│ ├── commons
│ │ ├── commons.py
│ │ ├── db
│ │ │ ├── db_ops.py
│ │ │ └── __init__.py
│ │ ├── extractor
│ │ │ ├── extractor.py
│ │ │ └── __init__.py
│ │ ├── __init__.py
│ │ ├── reader
│ │ │ ├── __init__.py
│ │ │ └── reader.py
│ │ └── writer
│ │ ├── __init__.py
│ │ └── writer.py
│ ├── executions
│ │ ├── __init__.py
│ │ └── reader.py
│ ├── gmaps_extractor.py
│ ├── gmaps_url_extractor.py
│ ├── gmaps_zip_extractor.py
│ ├── __init__.py
│ ├── places
│ │ ├── extractor.py
│ │ ├── __init__.py
│ │ └── writer.py
│ ├── results
│ │ ├── extractor.py
│ │ ├── __init__.py
│ │ └── optimized_extractor.py
│ ├── seq_extractor.py
│ ├── url
│ │ ├── extractor.py
│ │ ├── __init__.py
│ │ └── writer.py
│ └── _version.py
├── LICENSE
├── logs
├── Makefile
├── notebooks_test
│ ├── async_load_to_database.ipynb
│ ├── chromedriver
│ ├── init_database.ipynb
│ ├── load_to_database.ipynb
│ ├── Parallelized_execution.ipynb
│ ├── parallel-selenium.ipynb
│ ├── scrap-google-maps-selenium.ipynb
│ ├── ScrapingGMaps-BeautifulSoup+Requests.ipynb
│ ├── ScrapingGMaps-PyQt5.ipynb
│ ├── ScrapingGMaps+Selenium+BeautifulSoup.ipynb
│ ├── screenshot-1585425857.4219124.png
│ ├── screenshot-1585425858.9036229.png
│ ├── screenshot-1585425858.960231.png
│ ├── Untitled1.ipynb
│ └── Untitled.ipynb
├── README.md
├── requirements.txt
├── resources
│ ├── chromedriver
│ ├── chromedriver_mac
│ ├── db_config.json
│ ├── db_ops_config.json
│ ├── url_execution_config.json
│ └── zip_execution_config.json
├── results│
├── scripts
│ ├── launch_local_db.sh
│ ├── launch_process.sh
│ └── utils
│ ├── const.py
│ ├── init_db.py
│ ├── installation_commands.history
│ └── places_executor.py
└── setup.py
- bin: carpeta que contiene scripts de empaquetado del módulo y generación del artefacto docker.
- Dockerfile: dockerfile donde se define los steps para la generación de la imagen docker que es el artefacto a ejecutar.
- gmaps: este directorio contiene el código fuente del programa y toda la lógica. Más adelante se explicará más a detalle
- LICENSE: fichero de licencia.
- Makefile: fichero donde se define las etapas del comando make para generar el distribuible del programa así como también la imagen docker con el módulo instalado.
- notebooks_test: carpeta que contiene jupyter notebooks usados para testear y probar funcionalidades de manera rápida e iteractiva.
- README.md: guía de usabilidad del programa
- requirements.txt: este fichero contiene las librerías y sus versiones de dependencias que necesita el módulo para funcionar y deben instalar previamente antes de la ejecución del programa
- resources: carpeta que contiene ejemplos de ficheros de configuración así como los chromedrivers para ubuntu y mac
- results: carpeta que contiene ejemplos de resultados
- scripts: carpeta de scripts de utilidades
- setup.py: fichero de configuración del módulo python donde se define los submódulos y metainformación del módulo python.
Carpeta que contiene scripts usados para empaquetar, generar el artefacto python y la imagen docker
Script de ejecución del programa. Como requisito es tener el módulo (scrapper, el que genera el proyecto) instalado en para poder usarlo y lanzar el programa.
Script para generar el paquete instalable del módulo. Como requisito tiene que exista un
virtualenv en el directorio que se llame ‘venv’ y en cuyo virtual environment estén instaladas las
dependencias definidas en requirements.txt
. El artefacto instalable de python se quedará alojado en la
carpeta target/scraper-0.1.0.tar.gz
Instala el módulo en el virtualenv venv
usando pip
.
Genera el docker con la versión que se le pase por argumento. La imagen tiene como nombre scrapper:${version} siendo la versión el argumento que se le pasa al script
Limpia la carpeta target para generar una nueva versión de la librería
La estructura del módulo gmaps
sería (se han omitido los ficheros __init__.py
):
gmaps
├── commons
│ ├── commons.py
│ ├── db
│ │ └── db_ops.py
│ ├── extractor
│ │ └── extractor.py
│ ├── reader
│ │ └── reader.py
│ └── writer
│ └── writer.py
├── executions
│ └── reader.py
├── gmaps_extractor.py
├── gmaps_url_extractor.py
├── gmaps_zip_extractor.py
├── places
│ ├── extractor.py
│ └── writer.py
├── results
│ ├── extractor.py
│ └── optimized_extractor.py
├── seq_extractor.py
├── url
│ ├── extractor.py
│ └── writer.py
└── _version.py
En esta carpeta se encuentra el código core del módulo y en el que reside la lógica de la búsqueda de los locales, la
extracción de los comentarios y contenidos de las mismas. Así mismo también se encuentran el programa y funciones
necesarias para poder registrar la información en la base de datos.
El módulo gmaps
está formado por submódulos como:
commons
,executions
,places
,results
,url
y por scripts de ejecución como:
gmaps_extractor.py
,gmaps_url_extractor.py
,gmaps_zip_extractor.py
Este submódulo contiene:
- script con funciones de utilidades:
commons.py
- una utilidad para hacer el registro de tablas en la base de datos:
db_ops.py
- la clase abstracta de extractores:
extractor.py
- la clase abstracta de reader:
reader.py
- la clase abstracta de reader:
writer.py
Las clases abstractas (gmaps/commons/writer/writer.py
y gmaps/commons/reader/reader.py
) definen la interfaz y firma
para luego poder definir una clase que implemente la lógica dependiendo de las necesidades por cada una de las entidades
implicadas en el proceso y estas sigan una estructura común.
En el script gmaps/commons/commons.py
se puede encontrar funcionalidad común para todos los extractores y script de ejecuciones
En el fichero gmaps/commons/db/db_ops.py
se define y se crea el esquema de la base de datos necesario para ejectuar el
programa y para poder registrar la información extraída.
En este submódulo sólo se encuentra la implementación de un reader (gmaps/executions/reader.py
) de ejecuciones que se
encarga de obtener la información de ejecuciones e implementa la clase abstracta definida en el submódulo commons
En este submódulo se encuentran las implementaciones de extractor.py
y writer.py
con la lógica para la extracción
y escritura en la base de datos de la información de los locales comerciales encontrados en el proceso.
En este submódulo se encuentran las implementaciones de extractor.py
con la lógica para la extracción de información
de los locales por código postal y que será necesaria para, posteriormente, usarla en la búsqueda de los locales comerciales.
En este submódulo se encuentran las implementaciones de extractor.py
y writer.py
con la lógica para conseguir la url
de búsqueda por código postal y su escritura en la base de datos.
Este script contiene la lógica de ejecución tanto para extraer las urls de los códigos postales como la extracción de los locales encontrados por códigos postales. Este script sigue una lógica cuyo paralelismo es repetitivo por el cual no se usa y usa clases deprecadas.
Este script es el encargado de extraer las urls de búsqueda por código postal y registrar los resultados en una base de datos que se haya definido en la configuración de ejecución. Este script usa un pool de procesos para agilizar la ejecución y poder hacer la extracción de dichas las urls por códigos postales en paralelo.
Este script es el encargado de extraer la información de los locales comerciales buscándolos por código postal y registrar los resultados en una base de datos que se haya definido en la configuración de ejecución. Este script también usa un pool de procesos para agilizar la ejecución y poder hacer la extracción de la información de los locales comerciales en paralelo.
Para construir el proyecto es requisito tener instalado en el sistema python3 y en el directorio raíz del proyecto crear un entorno virtual con virtualenv:
mkdir venv
virtualenv -p python3 venv
source venv/bin/activate
Una vez creado el entorno virtual (virtualenv) y activado, se procede a ejecutar el proceso de empaquetado del módulo. En este proceso se usa el módulo make de linux que se detalla a continuación.
Para esto se debe ejecutar el siguiente comando desde la raíz del proyecto.
make package
El comando ejecutará el script package.sh
que creará una carpeta target, generará el empaquetado de la librería usando
la librería setuptools de python y ubicará la librería en la
carpeta target. También copiaría el script de ejecución de la librería y el fichero requirements.txt
que contiene las
dependencias de la librería.
Una vez ejecutada la fase package con make, se puede proceder a la instalación de la librería. Esta instalación es la del módulo python en el entorno virtual. El comando de ejecución es:
make install
Consiste en eliminar artefactos generados con make package
. Para esto habría que ejecutar:
make clean
El resultado de esta etapa será la eliminación de la carpeta target y su contenido.
Esta etapa generará una imagen docker con las dependencias y el módulo instalado y listo para ser ejecutado.
make docker version=v1
Generará una imagen docker con tag: scrapper:, en este ejemplo scrapper:v1
Una vez se haya instalado el módulo, se disponibiliza en el path 3 ejecutables. Los ejecutables son de tres tipos:
- creación de la base de datos:
gmaps-db
- extracción de url de búsqueda por código postal:
gmaps-url-scrapper
- extracción de información de locales comerciales por código postal:
gmaps-zip-scrapper
Este programa se encarga de la creación de la base de datos y tablas en caso de no existir y del reseteo de las tablas en caso de considerarse necesario.
Podemos ver la ayuda de este comando ejecutando:
gmaps-db --help
Devolviendo como resultado:
usage: gmaps-db -c <db_operation_config>
optional arguments:
-h, --help show this help message and exit
-c [CONFIG_FILE], --config_file [CONFIG_FILE]
path to configuration file in json format that with
the following schema: { "db_name":"gmaps",
"host":"localhost", "user":"root", "passwd":"1234" }
-o [OPERATION], --operation [OPERATION]
operation to be performed.
supported_ops = ["reset-all", "init", "drop", "reset-results", "reset-executions"]
Como se puede ver, este programa espera como argumento la ubicación de un fichero de configuración en formato json
.
Este fichero tiene que seguir el siguiente esquema:
{
"host": "string",
"db_name": "string",
"user": "string",
"passwd": "string"
}
Donde cada campo se define en la siguienta tabla:
Nombre | Tipo | Descripción | Opciones | Ejemplo |
---|---|---|---|---|
db_name | string | nombre de la base de datos a usar | - | "gmaps" |
host | string | ip o fqnd de la base de datos a la que el programa se conectará para crear la base de datos | - | "localhost" |
user | string | usuario con el que el programa se conectará a la base de datos | - | "postgres" |
passwd | string | contraseña para autenticarse a la base de datos | - | "mysecretpassword" |
Tipo de operation
:
init
: creará la base de datos con el nombre que se le haya establecido en el campodb_name
en el json de configuración y creará las tablas necesarias para las ejecuciones y las que contendrán los resultados.drop
: borrará todas las tablas sin crearlas de nuevo.reset-results
: esta operación borrará todas las tablas y las volverá a crear.reset-executions
: esta operación borrará todas las tablas y las volverá a crear.reset-all
: esta operación borrará todas las tablas y las volverá a crear.
Descripción de cada tabla:
commercial_premise_occupation
: tabla donde se registrarán la información de ocupación para cada local comercial.commercial_premise_comments
: tabla donde se almacenará los comentarios extraídos para cada local comercial.commercial_premise
: tabla donde se almacenará la información general de cada local comercial encontrado.zip_code_info
: tabla auxiliar usada para registrar las urls de búsqueda para cada código postal. Esta tabla es rellenada cuando se ejecutagmaps-url-scrapper
y es leída cuando se ejecutagmaps-zip-scrapper
. La obtención de la url de búsqueda implica hacer iteraciones extra en cada ejecución, por eso se decidió hacerlo sólo una vez (gmaps-url-scrapper
) y almacenar estos resultados para ahorrar estas iteraciones y el tiempo que llevan.execution_info
: tabla auxiliar usada para registrar los códigos postales para los que se va a ejecutar la extracción de la información de los locales comerciales. La ejecución degmaps-zip-scrapper
lee esta tabla y ejecuta la extracción de la información para todo el contenido de la tabla, esto último hay que tenerlo en cuenta si queremos cambiar los códigos postales de una ejecución a otra, en este caso es necesario el borrado de la tabla y la insercción de los códigos postales nuevos.premise_type_info
: tabla para almacenar los tipos de locales. Se le hace referencia desde la tablaexecution_info
Ejemplo de json de configuración para la creación de la base de datos gmaps y las tablas. Contenido en el fichero
$(pwd)/resources/db_ops_config.json
:
{
"host": "localhost",
"db_name": "gmaps",
"user": "postgres",
"passwd": "mysecretpassword"
}
Ejemplo de ejecución de gmaps-db
suponiendo que el fichero de configuración se encuentra en la carpeta resources del
proyecto:
gmaps-db -c $(pwd)/resources/db_ops_config.json -o init
Podemos ver la ayuda de este comando ejecutando:
gmaps-url-scrapper --help
Devolviendo como resultado:
usage: gmaps_url_extractor.py -c <execution_configuration_file>
optional arguments:
-h, --help show this help message and exit
-c [CONFIG_FILE], --config_file [CONFIG_FILE]
path to configuration file in json format that with the following schema
format: { "driver_path": "<path_to_driver>",
"executors": <number_of_executors>, "log_level":
"<log_level>", "log_dir": <path where logs will be
stored>, "input_config": { "type": "<type of input:
[local, file, db]>", "local": { "country": "spain",
"zip_code": 28047 }, "file": { "country": "spain",
"file_path": "<file where zip codes to extract urls
and coordinates is found in json array format [zp1,
zp2..]>" }, "db": { "type": "mysql", "config": {
"host": "<host>", "database": "<database to connect>",
"db_user": "<user>", "db_pass": "<password>" } } },
"output_config": { "type": "<type of output: [file,
db]>", "file": { "results_path": "<path where results
file will be stored" }, "db": { "type": "mysql",
"config": { "host": "<host>", "database": "<database
to connect>", "db_user": "<user>", "db_pass":
"<password>" } } } }
Como se puede ver, este programa espera como argumento la ubicación de un fichero de configuración en formato json
.
Este fichero tiene que seguir el siguiente esquema:
{
"driver_path": "string",
"executors": "integer",
"log_level": "string",
"log_dir": "string",
"input_config": {
"type": "string",
"local": {
"country": "string",
"zip_codes": "array"
},
"file": {
"country": "string",
"file_path": "string"
},
"db": {
"type": "string",
"config": {
"host": "string",
"database": "string",
"db_user": "string",
"db_pass": "string"
}
}
},
"output_config": {
"type": "string",
"file": {
"results_path": "string"
},
"db": {
"type": "string",
"config": {
"host": "string",
"database": "string",
"db_user": "string",
"db_pass": "string"
}
}
}
}
Donde cada campo se define en la siguienta tabla:
Nombre | Tipo | Descripción | Opciones | Ejemplo |
---|---|---|---|---|
driver_path | string | ubicación del driver de chrome que usará selenium para hacer el scraping | - | "/home/gmaps-extractor/resources/chromedriver" |
executors | integer | número de procesos que correrán en paralelo. Número recomendado: cores-2 | - | 5 |
log_level | string | nivel de log | INFO, DEBUG, CRITICAL, ERROR | INFO |
log_dir | string | directorio donde se almacenará el fichero de logs de la ejecución | - | "/home/gmaps-extractor/results" |
input_config | json object | objeto que almacena la configuración para obtener el input de la ejecución | - | json |
{ |
||||
"type": "file", |
||||
"local": { |
||||
"country": "spain", |
||||
"zip_codes": [28047] |
||||
}, |
||||
"file": { |
||||
"country": "spain", |
||||
"file_path": "/home/gmaps-extractor/resources/zip_codes_spain.json" |
||||
} |
||||
} |
||||
input_config.type | string | flag que determina el tipo de soporte de donde se obtendrá los datos de entrada para la ejecución | "local", "file" | "file" |
input_config.local | json object | objeto que almacena la configuración de los datos a ejecutar cuando el valor de input_config.type es "local" |
- | json |
{ |
||||
"country": "spain", |
||||
"zip_codes": [48005] |
||||
} |
||||
input_config.local.country | string | campo que indica el país al que pertenecen los códigos postales para los que se van a extraer las urls de búsqueda. Sólo se tiene en cuenta cuando el valor de input_config.type es "local" |
- | "spain" |
input_config.local.zip_codes | array | lista de códigos postales para los que se van a extraer las urls de búsqueda. Sólo se tiene en cuenta cuando el valor de input_config.type es "local" |
- | [48005, 28007] |
input_config.file | json object | objeto que almacena la configuración de los datos a ejecutar cuando el valor de input_config.type es "file" |
- | json |
{ |
||||
"country": "spain", |
||||
"file_path": "/home/gmaps-extractor/resources/zip_codes_spain.json" |
||||
} |
||||
input_config.file.country | string | campo que indica el país al que pertenecen los códigos postales para los que se van a extraer las urls de búsqueda. Sólo se tiene en cuenta cuando el valor de input_config.type es "file" |
- | "spain" |
input_config.file.file_path | string | campo que indica el path del fichero de formato json cuyo contenido es la lista (json array) de códigos postales para los que se van a extraer las urls de búsqueda. Sólo se tiene en cuenta cuando el valor de input_config.type es "file". Posible contenido del fichero: [28047, 48005...]. |
- | "/home/gmaps-extractor/resources/zip_codes_spain.json" |
output_config | json object | objeto que almacena la configuración de salida de la ejecución | - | json |
{ |
||||
"type": "db", |
||||
"file": { |
||||
"results_path": "/home/gmaps-extractor/results" |
||||
}, |
||||
"db": { |
||||
"type": "mysql", |
||||
"config": { |
||||
"host": "localhost", |
||||
"database": "gmaps", |
||||
"db_user": "postgres", |
||||
"db_pass": "mysecretpassword" |
||||
} |
||||
} |
||||
} |
||||
output_config.type | string | flag que determina el tipo de soporte de donde se almacenarán los datos de la ejecución | "file", "db" | "db" |
output_config.file | json object | objeto que almacena la configuración de salida cuyo soporte serán ficheros en el sistema local de ficheros cuando el valor de input_config.type es "file" |
- | json |
{ |
||||
"results_path": "/home/gmaps-extractor/results" |
||||
} |
||||
output_config.file.results_path | string | directorio donde se almacenará el fichero de resultados de la ejecución | - | "/home/gmaps-extractor/results" |
output_config.db | json object | objeto que almacena la configuración de salida cuyo soporte será una base de datos. Se tiene en cuenta cuando el valor de input_config.type es "db" |
- | json |
{ |
||||
"type": "mysql", |
||||
"config": { |
||||
"host": "localhost", |
||||
"database": "gmaps", |
||||
"db_user": "postgres", |
||||
"db_pass": "mysecretpassword" |
||||
} |
||||
} |
||||
output_config.db.type | string | tipo de base de datos a la que se va a conectar el programa | "postgres" | "postgres" |
output_config.db.config | json object | objecto que contiene la configuración de conexión a la base de datos | - | json |
{ |
||||
"host": "localhost", |
||||
"database": "gmaps", |
||||
"db_user": "postgres", |
||||
"db_pass": "mysecretpassword" |
||||
} |
||||
output_config.db.config.host | string | ip o fqnd de la base de datos a la que el programa se conectará para crear la base de datos | - | "localhost" |
output_config.db.config.database | string | nombre de la base de datos a usar | - | "gmaps" |
output_config.db.config.db_user | string | usuario con el que el programa se conectará a la base de datos | - | "postgres" |
output_config.db.config.db_pass | string | contraseña para autenticarse a la base de datos | - | "mysecretpassword" |
Ejemplo de json de configuración para la extracción de las urls de búsqueda para código postal que esté contenido en la
lista provista a través de un fichero (/home/gmaps-extractor/resources/zip_codes_spain.json
) y volcando los resultados
en una base de datos de postgres cuya configuración está contenido en el fichero $(pwd)/resources/urls_execution_config.json
:
{
"driver_path": "/home/gmaps-extractor/resources/chromedriver",
"executors": 5,
"log_level": "INFO",
"log_dir": "/home/gmaps-extractor/results",
"input_config": {
"type": "file",
"file": {
"country": "spain",
"file_path": "/home/gmaps-extractor/resources/zip_codes_spain.json"
}
},
"output_config": {
"type": "db",
"db": {
"type": "postgres",
"config": {
"host": "localhost",
"database": "gmaps",
"db_user": "postgres",
"db_pass": "mysecretpassword"
}
}
}
}
Ejemplo de ejecución de gmaps-url-scrapper
suponiendo que el fichero de configuración se encuentra en la carpeta resources del
proyecto:
gmaps-url-scrapper -c $(pwd)/resources/urls_execution_config.json
Podemos ver la ayuda de este comando ejecutando:
gmaps-zip-scrapper --help
Devolviendo como resultado:
usage: gmaps_zip_extractor.py -c <execution_configuration_file>
optional arguments:
-h, --help show this help message and exit
-c [CONFIG_FILE], --config_file [CONFIG_FILE]
configuration file in json format with the following
format: { "driver_path": "<path_to_driver>",
"executors": <number_of_executors>, "log_level":
"<log_level>", "log_dir": <path where logs will be
stored>, "input_config": { "type": "file", "local": {
"country": "spain", "zip_codes": [ <zip codes object
info with the following format: {"zip_code":"28047",
"place_type": "Restaurant,Bar"}> ] }, "file": {
"country": "spain", "file_path": "<file where zip
codes to extract urls and coordinates is found in json
array format [zp_obj1, zp_obj2..]> }, "db": { "type":
"mysql", "config": { "host": "<host>", "database":
"<database to connect>", "db_user": "<user>",
"db_pass": "<password>" } } }, "output_config": {
"type": "<type of output: [file, db]>", "file": {
"results_path": "<path where results file will be
stored>" }, "db": { "type": "mysql", "config": {
"host": "<host>", "database": "<database to connect>",
"db_user": "<user>", "db_pass": "<password>" } } } }
Como se puede ver, este programa espera como argumento la ubicación de un fichero de configuración en formato json
.
Este fichero tiene que seguir el siguiente esquema:
{
"driver_path": "string",
"executors": "integer",
"log_level": "string",
"log_dir": "string",
"results_pages": "integer",
"num_reviews": "integer",
"input_config": {
"type": "string",
"local": "array",
"file": {
"country": "string",
"file_path": "string"
},
"db": {
"type": "string",
"config": {
"host": "string",
"database": "string",
"db_user": "string",
"db_pass": "string"
}
}
},
"output_config": {
"type": "string",
"file": {
"results_path": "string"
},
"db": {
"type": "string",
"config": {
"host": "string",
"database": "string",
"db_user": "string",
"db_pass": "string"
}
}
}
}
Donde cada campo se define en la siguienta tabla:
Nombre | Tipo | Descripción | Opciones | Ejemplo |
---|---|---|---|---|
driver_path | string | ubicación del driver de chrome que usará selenium para hacer el scraping | - | /home/gmaps-extractor/resources/chromedriver |
executors | integer | número de procesos que correrán en paralelo | - | 5 |
place_executors | integer | número de procesos que correrán en paralelo para la extracción de cada local | - | 5 |
recovery_executors | integer | número de procesos que correrán en paralelo para la recuperación de posibles locales perdidos | - | 5 |
log_level | string | nivel de log | INFO, DEBUG, CRITICAL, ERROR | INFO |
log_dir | string | directorio donde se almacenará el fichero de logs de la ejecución | - | /home/gmaps-extractor/results |
results_pages | integer | número de páginas de resultados de búsqueda de las que se extraerá la información | - | 10 |
num_reviews | integer | número de comentarios que se extraerán para cada local comercial | - | 30 |
input_config | json object | objeto que almacena la configuración para obtener los datos con los que se quiere realizar la ejecución | - | json |
{ |
||||
"type": "db", |
||||
"local": [ |
||||
{"postal_code":"28010", "types": ["Bar"], "base_url": "https://www.google.com/maps/place/28010+Madrid/@40.4322914,-3.7060659,15z", "country": "Spain"}, |
||||
{"postal_code":"28003", "types": ["Bar"], "base_url": "https://www.google.com/maps/place/28003+Madrid/@40.4426868,-3.7228567,14z", "country": "Spain"}, |
||||
{"postal_code":"48005", "types": ["Bar"], "base_url": "https://www.google.com/maps/place/48005+Bilbao,+Biscay/@43.2598164,-2.9304266,15z", "country": "Spain"} |
||||
], |
||||
"file": { |
||||
"country": "spain", |
||||
"file_path": "/home/gmaps-extractor/resources/zip_codes_places_spain.json" |
||||
}, |
||||
"db": { |
||||
"type": "postgres", |
||||
"config": { |
||||
"host": "localhost", |
||||
"database": "gmaps", |
||||
"db_user": "postgres", |
||||
"db_pass": "mysecretpassword" |
||||
} |
||||
} |
||||
} |
||||
input_config.type | string | flag que determina el tipo de soporte de donde se obtendrá los datos de entrada para la ejecución | "local", "file", "db" | "db" |
input_config.local | json object | json array que cuyos elementos son los datos con los que se realizará la ejecución. Es la manera de pasarle los datos de ejecución a través del fichero de ejecución. Sólo se tiene en cuenta si input_config.type es "local". Cada objeto contenido en este json array tiene que contener las claves de postal_code (código postal), types (tipo de locales comerciales, debe ser un array), base_url (url de búsqueda ya procesada para cada código postal) y country (el país al que pertenece el código postal) |
- | json |
[ |
||||
{"postal_code":"28010", "types": ["Bar"], "base_url": "https://www.google.com/maps/place/28010+Madrid/@40.4322914,-3.7060659,15z", "country": "Spain"}, |
||||
{"postal_code":"28003", "types": ["Bar"], "base_url": "https://www.google.com/maps/place/28003+Madrid/@40.4426868,-3.7228567,14z", "country": "Spain"}, |
||||
{"postal_code":"48005", "types": ["Bar"], "base_url": "https://www.google.com/maps/place/48005+Bilbao,+Biscay/@43.2598164,-2.9304266,15z", "country": "Spain"} |
||||
] |
||||
input_config.file | json object | objeto json que configura el soporte de los datos de entrada cuando input_config.type es "file". El la manera de pasarle los datos de ejecución a través de un fichero almacenado en el sistema de ficheros local. El contenido del fichero tiene que ser un json array como el definido en input_config.local |
- | json |
{ |
||||
"country": "spain", |
||||
"file_path": "/home/gmaps-extractor/resources/zip_codes_places_spain.json" |
||||
}, |
||||
input_config.file.country | string | determina el país al que pertenecen los códigos postales que se van a procesar | - | "spain" |
input_config.file.file_path | string | ubicación en el sistema de ficheros local del archivo que contiene los códigos postales con los que ejecutar. El contenido del fichero tiene que ser un json array como el definido en input_config.local |
- | "/home/gmaps-extractor/resources/zip_codes_places_spain.json"` |
input_config.db | json object | objeto que almacena la configuración para conectarse a la base de datos de donde se obtendrán la información de ejecución buscándolos en la tabla execution_info . Se tiene en cuenta cuando el valor de input_config.type es "db" |
||
{ |
||||
"type": "postgres", |
||||
"config": { |
||||
"host": "localhost", |
||||
"database": "gmaps", |
||||
"db_user": "postgres", |
||||
"db_pass": "mysecretpassword" |
||||
} |
||||
} |
||||
input_config.db.type | string | tipo de base de datos a la que se va a conectar el programa | "postgres" | "postgres" |
input_config.db.config | json object | configuración de conexión a la base de datos de donde se leerán los códigos postales a ejecutar | - | json |
{ |
||||
"host": "localhost", |
||||
"database": "gmaps", |
||||
"db_user": "postgres", |
||||
"db_pass": "mysecretpassword" |
||||
} |
||||
input_config.db.config.host | string | ip o fqnd de la base de datos a la que el programa se conectará para crear la base de datos | - | "localhost" |
input_config.db.config.database | string | nombre de la base de datos a usar | - | "gmaps" |
input_config.db.config.db_user | string | usuario con el que el programa se conectará a la base de datos | - | "postgres" |
input_config.db.config.db_pass | string | contraseña para autenticarse a la base de datos | - | "mysecretpassword" |
output_config | json object | objeto que almacena la configuración del soporte de salida de la ejecución | - | json |
{ |
||||
"type": "db", |
||||
"file": { |
||||
"results_path": "/home/gmaps-extractor/results" |
||||
}, |
||||
"db": { |
||||
"type": "postgres", |
||||
"config": { |
||||
"host": "localhost", |
||||
"database": "gmaps", |
||||
"db_user": "postgres", |
||||
"db_pass": "mysecretpassword" |
||||
} |
||||
} |
||||
} |
||||
output_config.type | string | flag que determina el tipo de soporte de donde se almacenarán los datos de la ejecución | "file", "db" | "db" |
output_config.file | json object | objeto que almacena la configuración de salida cuyo soporte serán ficheros en el sistema local de ficheros cuando el valor de input_config.type es "file" |
- | json |
{ |
||||
"results_path": "/home/gmaps-extractor/results" |
||||
} |
||||
output_config.file.results_path | string | directorio donde se almacenará el fichero de resultados de la ejecución | - | "/home/gmaps-extractor/results" |
output_config.db | json object | objeto que almacena la configuración para conectarse a la base de datos donde se volcarán los resultados. Se tiene en cuenta cuando el valor de output_config.type es "db" |
- | json |
{ |
||||
"type": "postgres", |
||||
"config": { |
||||
"host": "localhost", |
||||
"database": "gmaps", |
||||
"db_user": "postgres", |
||||
"db_pass": "mysecretpassword" |
||||
} |
||||
} |
||||
output_config.db.type | string | tipo de base de datos a la que se va a conectar el programa | "postgres" | "postgres" |
output_config.db.config | json object | objecto que contiene la configuración de conexión a la base de datos | - | json |
{ |
||||
"host": "localhost", |
||||
"database": "gmaps", |
||||
"db_user": "postgres", |
||||
"db_pass": "mysecretpassword" |
||||
} |
||||
output_config.db.config.host | string | ip o fqnd de la base de datos a la que el programa se conectará para crear la base de datos | - | "localhost" |
output_config.db.config.database | string | nombre de la base de datos a usar | - | "gmaps" |
output_config.db.config.db_user | string | usuario con el que el programa se conectará a la base de datos | - | "postgres" |
output_config.db.config.db_pass | string | contraseña para autenticarse a la base de datos | - | "mysecretpassword" |
Ejemplo de json de configuración para la extracción de los 30 últimos comentarios para cada uno de los locales comerciales
contenidos en las 10 páginas de resultado de la búsqueda por códigos postales y tipo de locales obtenidos desde una base
de datos y cuyo resultados (comentarios e información de los locales comerciales) se irán volcando en una base de datos
de postgres. Suponiendo que el siguiente contenido es del fichero $(pwd)/resources/zips_execution_config.json
:
{
"driver_path": "/home/gmaps-extractor/resources/chromedriver",
"executors": 20,
"place_executors": 5,
"recovery_executors": 15,
"log_level": "INFO",
"log_dir": "/home/gmaps-extractor/results",
"results_pages": 10,
"num_reviews": 30,
"input_config": {
"type": "db",
"db": {
"type": "mysql",
"config": {
"host": "localhost",
"database": "gmaps",
"db_user": "postgres",
"db_pass": "mysecretpassword"
}
}
},
"output_config": {
"type": "db",
"db": {
"type": "mysql",
"config": {
"host": "localhost",
"database": "gmaps",
"db_user": "postgres",
"db_pass": "mysecretpassword"
}
}
}
}
Ejemplo de ejecución de gmaps-zip-scrapper
suponiendo que el fichero de configuración se encuentra en la carpeta resources del
proyecto:
gmaps-zip-scrapper -c $(pwd)/resources/zips_execution_config.json
Los resultados de la ejecución de gmaps-zip-scrapper
se verá reflejada en la base da datos habiendo rellenado las tablas:
commercial_premise, commercial_premise_occupation y commercial_premise_occupation. Nótese que los resultados de la
búsqueda de locales comerciales insertados en la tabla commercial_premise se filtran por nombre del local y la
fecha en la que la estamos ejecutando, esto quiere decir que si se lanza una ejecución para un código postal (48005) el día
14/05/2020 a las 11 de la mañana y otra ejecucición el mismo día 14/05/2020 a las 20:30, no se vuelve a extraer información
para los locales que ya estén registrados en la base de datos ya que la fecha (14/05/2020) es la misma. La fecha de ejecución es
inferida automáticamente por el sistema.