tarea_apify_bs4_model
Pricing
Pay per usage
tarea_apify_bs4_model
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Carmen Cruzado
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
20 days ago
Last modified
Categories
Features
Share
mcgee.cat scraper — búsqueda difusa de palabras + tópicos frecuentes
Actor de web scraping en Python que recorre las páginas de mcgee.cat (home, publications, projects y fun), las convierte a texto plano y las analiza de dos formas:
- count_word: cuenta cuántas veces aparecen una o más palabras o frases, con búsqueda aproximada (RapidFuzz), sin distinguir mayúsculas ni acentos, e incluyendo variantes y errores de tipeo.
- top_topics: detecta los tópicos más frecuentes del sitio agrupando oraciones con TF-IDF + KMeans (scikit-learn).
Los parámetros se pasan por input, definido en el input schema. El HTML se descarga con HTTPX2, se procesa con Beautiful Soup y el resultado se guarda en un dataset.
Included features
- Apify SDK for Python: toolkit para construir Actors y scrapers en Python
- Input schema: define y valida los parámetros del actor
- Dataset: almacena el resultado como datos estructurados
- HTTPX2: requests HTTP asíncronos
- Beautiful Soup: extracción de datos de HTML
- RapidFuzz: similitud de cadenas para la búsqueda aproximada
- scikit-learn: TF-IDF, KMeans y silhouette score para los tópicos
Input
| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
url | string | https://www.mcgee.cat/ | URL base del sitio |
full | boolean | false | Incluye también el texto de cada publicación |
words | array | ["Engineer"] | Palabras o frases a buscar |
threshold | integer | 85 | Similitud mínima (0-100). Búsquedas de 3 caracteres o menos son siempre exactas |
scorer | string | ratio | ratio, partial_ratio, token_sort_ratio, token_set_ratio o WRatio |
top_topics | integer | 3 | Cantidad de tópicos a devolver |
n_clusters | integer | 0 | Clusters de KMeans. 0 = automático por silhouette |
n_terms | integer | 5 | Términos clave por tópico |
n_examples | integer | 3 | Oraciones de ejemplo por tópico |
stop_words | string | english | english o none |
extra_stop_words | array | [] | Palabras adicionales a ignorar |
Ejemplo:
{"url": "https://www.mcgee.cat/","words": ["Engineer", "zero knowledge", "privacy"],"threshold": 85,"top_topics": 3}
Output
Una fila en el dataset con tres keys:
{"count_word": {"Engineer": {"count": 4,"sentences": ["I'm a engineer from Ireland...", "💚 Engineer @ Aztec"],"variants": {"engineer": {"count": 2, "score": 100.0},"engineers": {"count": 1, "score": 94.1}}}},"content": {"1": "texto plano de la home","2": "texto plano de publications","3": "texto plano de projects","4": "texto plano de fun"},"top_topics": [{"rank": 1,"size": 6,"share": 0.545,"terms": ["privacy", "solana", "engineer"],"sentences": ["Engineer at Solana Foundation focused on privacy..."]}]}
count_word: por cada búsqueda, el total de apariciones, las oraciones que la contienen y las variantes encontradas con su puntaje.content: texto plano numerado por página, en orden de visita.top_topics: clusters ordenados por cantidad de oraciones (size), con su proporción (share), términos clave y oraciones representativas.
How it works
Actor.get_input()obtiene los parámetros del input.get_soup()descarga cada página conhttpx2.AsyncClienty la carga conBeautifulSoup(response.content, 'lxml').page_text()quita nav, header y footer, y convierte el HTML en texto plano con una línea por bloque. Confull: true,publication_paths()agrega las publicaciones a la lista de páginas.normalize(),tokenize()ysplit_sentences()pasan el texto a minúsculas, le quitan los acentos y lo separan en palabras y oraciones.SentenceIndexindexa los n-gramas de cada oración, para buscar tanto palabras sueltas como frases.fuzzy_count()compara cada búsqueda contra el vocabulario conrapidfuzz.process.extracty armacount_word.find_topics()vectoriza las oraciones conTfidfVectorizer(unigramas y bigramas), las agrupa conKMeans, elige el número de clusters por silhouette, toma los más grandes y los describe contopic_terms(). Así armatop_topics.Actor.push_data({...})guarda el resultado en el dataset.
Resources
- BeautifulSoup Scraper
- Python tutorials in Academy
- Web scraping with Beautiful Soup and Requests
- RapidFuzz documentation
- scikit-learn: text feature extraction (TF-IDF)
- scikit-learn: KMeans clustering
- Integration with Make, GitHub, Zapier, Google Drive, and other apps
- Video guide on getting scraped data using Apify API
Getting started
Para la información completa, ver este artículo. En resumen:
- Build the Actor
- Run the Actor
Para correrlo localmente:
pip install -r requirements.txtapify run --input '{"url":"https://www.mcgee.cat/","words":["Engineer"]}'
El resultado queda en storage/datasets/default/.
Pull the Actor for local development
Si querés desarrollar localmente, podés bajar el actor desde la consola de Apify con Apify CLI:
-
Instalá
apify-cliCon Homebrew
$brew install apify-cliCon NPM
$npm -g install apify-cli -
Bajá el actor con su
<ActorId>, que puede ser:- el nombre único del actor (ej.: "apify/hello-world")
- o su ID (ej.: "E2jjCZBezvAZnX8Rb")
Los dos aparecen al hacer clic en el título del actor, arriba de la página.
Este comando copia el actor al directorio actual:
$apify pull <ActorId>