Recientemente, yo estaba buscando una forma de extraer fácilmente datos de sitios web. De hecho, como todos sabemos, raspar manualmente la web puede convertirse en una tarea tediosa y que requiere mucho tiempo. Mientras buscaba en línea soluciones más inteligentes para evitar estos inconvenientes, me encontré con Octoparse. Octoparse es un servicio de web scraping que te permite extraer datos de varios sitios web sin necesidad de código. Como consecuencia, cualquiera puede usar esta herramienta sin código. Además, proporciona API oficiales para ejecutar tareas de raspado previamente definidas bajo demanda y guardar los datos extraídos en CSV, TXT, Excel, HTML o en bases de datos. De esta manera, puedes tener los beneficios de una herramienta sin código y una herramienta manual avanzada. Veamos cómo usar Octoparse para crear una tarea de scraping, ejecutarla desde una secuencia de comandos de Python y guardar los datos extraídos en un documento de Google Sheets.
Qué es Octoparse
“Octoparse es una herramienta de extracción de datos extremadamente poderosa que ha optimizado y llevado nuestros esfuerzos de extracción de datos al siguiente nivel ” — Sitio web oficial de Octoparse Octoparse es un robusto rastreador de sitios web destinado a extraer todo tipo de datos que necesita de la web. Ofrece un gran conjunto de funciones, que incluyen detección automática, plantillas de tareas y un modo avanzado. El primero se basa en un algoritmo de detección automática diseñado para raspar automáticamente las páginas que contienen elementos anidados en una lista o tabla. La segunda es una forma sencilla de extraer datos en función de una serie de plantillas prediseñadas que cualquier persona puede emplear sin esfuerzo. Mientras que el tercero es un modo flexible y potente diseñado para aquellos que requieren necesidades más personalizadas. En cada caso, Octoparse implica una interfaz de apuntar y hacer clic fácil de usar diseñada para guiarte a lo largo del proceso de extracción de datos. Luego, los datos extraídos de varios sitios web se pueden guardar y estructurar fácilmente en muchos formatos. Además, proporciona una función de extracción programada en la nube para extraer datos dinámicos en tiempo real. Luego, también viene con un programa API, que te mostraré cómo usarlo en breve. Por otra parte, aunque la herramienta reproduce la actividad humana para comunicarse con las páginas web y evitar ser detectada durante el scraping, también ofrece servidores proxy IP. Se pueden utilizar en caso de sitios web agresivos para ocultar la IP y evitar el bloqueo de IP. En conclusión, Octoparse satisface la mayoría de las necesidades de scraping de los usuarios, tanto básicas como avanzadas, sin requerir ninguna habilidad de codificación.
Crear una Tarea de Extracción de Datos
Supongamos que queremos extraer datos de la página de Wikipedia de la Lista de países y dependencias por población. Este es un buen ejemplo de una página web cuyos datos se actualizan con frecuencia a lo largo del tiempo. Primero, veremos cómo instalar Octoparse. Luego definiremos una tarea de scraping destinada a extraer datos de la tabla principal de esa página web.
1. Empezando con Octoparse
En primer lugar, debes instalar Octoparse. En este tutorial, usaré Octoparse 8.x, que se puede descargar desde aquí: https://www.octoparse.es/download. Luego, sigue los siguientes pasos:
- Descomprimir el archivo instalador descargado
- Ejecutar el archivo OctoparseSetup.msi
- Seguir las instrucciones de instalación
- Iniciar sesión con tu cuenta de Octoparse
Por favor, ten en cuenta que registrarse es gratis, pero para acceder a la función API, se requiere un plan estándar. Puedes encontrar toda la información sobre los planes que ofrece Octoparse aquí.
Ahora, tienes todo lo necesario para comenzar a aprovechar el poder de Octoparse.
2. Creando la Tarea
Dado que el objetivo es extraer los datos almacenados en una tabla, es muy recomendable seguir esta guía de la documentación oficial sobre cómo lograrlo. Inicia Octoparse, inicia sesión, ingresa la URL deseada en el campo principal y haz clic en el botón Inicio. De esta forma, el sistema utilizará el algoritmo de autodetección, que es perfecto para una página formada por una tabla como: Lista de países y dependencias por población.
Ingresando la URL de entrada
Espera a que se cargue la página y se detecten los datos. Cuando se complete la detección automática, sigue las instrucciones proporcionadas en el panel de Consejos y verifica tus datos en la sección de vista previa. Por último, cambia el nombre de los campos de datos o elimina los que no necesitas.
La tarea final de extracción de datos
Primero, haz clic en el botón Crear flujo de trabajo en el panel de Consejos. En segundo lugar, haz clic en el botón Guardar en la barra superior. Luego, ve a la vista Panel de control y deberías ver la tarea que acabas de definir como en la imagen a continuación:
La vista “Panel de control”
Aquí puedes cambiar el nombre de tus tareas, ejecutarlas localmente o en la nube. ¡Misión cumplida! Ahora estás listo para acceder a los datos extraídos. El tutorial podría terminar ahora, pero si deseas ejecutar esta tarea a través de la API, debes hacer clic en la opción API del menú Más> Ejecuciones en la nube.
Acceder a la opción “API”
Luego, aparecerá otra ventana que presenta tu ID de tarea. Lo necesitarás más tarde, así que recuerda guardarlo en un lugar seguro.
La ventana “ID de tarea”
Ejecución programática de la tarea con Python
Ahora es el momento de profundizar en cómo usar las API de Octoparse para crear un script destinado a ejecutar programáticamente la tarea previamente definida y guardar los datos extraídos en un documento de Google Sheets. Ten en cuenta que, como se indica en la documentación oficial, este último objetivo solo se puede lograr a través de API. En particular, puedes loggrar esto con la siguiente secuencia de comandos de Python:
import sys | |
import requests | |
import os | |
import gspread | |
import pandas as pd | |
def login(base_url, email, password): | |
“””login and get a access token | |
Arguments: | |
base_url {string} — authrization base url(currently same with api) | |
email {[type]} — your email | |
password {[type]} — your password | |
Returns: | |
json — token entity include expiration and refresh token info like: | |
{ | |
“access_token”: “ABCD1234”, # Access permission | |
“token_type”: “bearer”, # Token type | |
“expires_in”: 86399, # Access Token Expiration time (in seconds) | |
“refresh_token”: “refresh_token” # To refresh Access Token | |
} | |
“”” | |
content = ‘username={0}&password={1}&grant_type=password’.format(email, password) | |
token_entity = requests.post(base_url + ‘token’, data=content).json() | |
if ‘access_token’ in token_entity: | |
return token_entity | |
else: | |
os._exit(–2) | |
def get_data_by_offset(base_url, token, task_id, offset=0, size=10): | |
“””offset, size and task ID are all required in the request. | |
Offset should default to 0, and size∈[1,1000] for making the initial request. | |
The offset returned (could be any value greater than 0) should be used for making the next request. | |
Arguments: | |
base_url {string} — base url of the api | |
token {string} — token string from a valid token entity | |
task_id {string} — task id of a task from our platform | |
Keyword Arguments: | |
offset {int} — an offset from last data request, should remains 0 if is the first request (default: {0}) | |
size {int} — data row size for the request (default: {10}) | |
Returns: | |
json — task dataList and relevant information: | |
{ | |
“data”: { | |
“offset”: 4, | |
“total”: 100000, | |
“restTotal”: 99996, | |
“dataList”: [ | |
{ | |
“state”: “Texas”, | |
“city”: “Plano” | |
}, | |
{ | |
“state”: “Texas”, | |
“city”: “Houston” | |
}, | |
… | |
] | |
}, | |
“error”: “success”, | |
“error_Description”: “Action Success” | |
} | |
“”” | |
url = ‘api/allData/getDataOfTaskByOffset?taskId=%s&offset=%s&size=%s’ % (task_id, offset, size) | |
task_data_result = requests.get(base_url + url, headers={‘Authorization’: ‘bearer ‘ + token}).json() | |
return task_data_result | |
def run_countries_task(base_url, token_entity): | |
“””Running the countries task | |
Arguments: | |
base_url {string} — API base url | |
token_entity {json} — token entity after logged in | |
“”” | |
# retrieving an access token after the login | |
token = token_entity[‘access_token’] | |
# your task id | |
task_id = “ded69c74-f6d5-b64e-4d2e-c8036a8ec3a8” | |
# running the task and retrieving data | |
data = get_data_by_offset(base_url, token, task_id, offset=0, size=1000) | |
# retrieving the extracted data in JSON format | |
json_extracted_data = data[‘data’][‘dataList’] | |
# converting the JSON string to CSV | |
df = pd.DataFrame(json_extracted_data) | |
csv_extracted_data = df.to_csv(header=True).encode(‘utf-8’) | |
# check how to get “credentials”: | |
# https://gspread.readthedocs.io/en/latest/oauth2.html#for-bots-using-service-account | |
# credentials = … your credentials | |
gc = gspread.service_account_from_dict(credentials) | |
# spreadsheet_id = … -> your spreadsheet_id | |
# importing CSV data into your Google Sheet document identified | |
# by spreadsheet_id | |
gc.import_csv(spreadsheet_id, csv_extracted_data) | |
if __name__ == ‘__main__’: | |
# the email you used to subscribe to Octoparse | |
email = “test@email.com” | |
# your password | |
password = “password” | |
octoparse_base_url = ‘http://advancedapi.octoparse.com/’ | |
token_entity = login(octoparse_base_url, email, password) | |
run_countries_task(octoparse_base_url, token_entity) |
Primero, se realiza el inicio de sesión, luego se llama a la API Get Data By Offset para iniciar la tarea deseada y recuperar los datos extraídos en formato JSON. Estos datos se convierten a formato CSV y finalmente se importan a un documento de Google Sheets utilizando la biblioteca gspread. Después de ejecutar el script, podrás ver los datos extraídos por la tarea Octoparse guardados en el documento de Google Sheets seleccionado de la siguiente manera:
El documento de Google Sheets rellenado con datos
¡Y ahí lo tienes! Objetivo logrado con solo unas pocas líneas de código.
Conclusión
En este artículo, analizamos cómo usar Octoparse, una poderosa herramienta de extracción de datos, para crear fácilmente una tarea de raspado. Luego, vimos cómo una tarea de este tipo se puede integrar en un script de Python para ejecutarse mediante programación y guardar los datos extraídos en un documento de Google Sheets. Como se muestra, esto es posible gracias al programa API oficial de Octoparse, que convierte a Octoparse en una herramienta sin código pero muy avanzada. ¡Gracias por leer! Espero que este artículo te haya resultado útil. No dudes en comunicarte conmigo con cualquier pregunta, comentario o sugerencia.
Autor: Antonello Zanini
Artículo Original: Web Scraping Made Simple with Octoparse