PHPackages                             ivansabik/dom-hunter - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. ivansabik/dom-hunter

ActiveLibrary[API Development](/categories/api)

ivansabik/dom-hunter
====================

Toolkit that helps in creating custom APIs using cURL HTTP requests and crawling thru the DOM

1.0.0(11y ago)14302[7 issues](https://github.com/ivansabik/dom-hunter/issues)MITHTML

Since Apr 27Pushed 10y ago2 watchersCompare

[ Source](https://github.com/ivansabik/dom-hunter)[ Packagist](https://packagist.org/packages/ivansabik/dom-hunter)[ RSS](/packages/ivansabik-dom-hunter/feed)WikiDiscussions master Synced 2d ago

READMEChangelogDependencies (1)Versions (4)Used By (0)

DOM Hunter
==========

[](#dom-hunter)

Libreria para explorar una respuesta HTML / Document Object Model (DOM) en busca de objetos. Ayuda a realizar descubrimiento de contenido como para hacer webscraping, construir APIs a partir de aplicaciones web existentes. DOM Hunter permite especificar distintas presas que será cazadas en una URL o código HTML destino. La librería contiene un repositorio de características que típicamente querrían encontrarse en una respuesta HTML para construir APIs (fechas, identificadores, palabras clave, etc). DOM Hunter hace uso de la navegación del DOM y expresiones regulares para cazar las presas. Así funciona:

1. El usuario crea una instancia de DOMHunter indicando las opciones adicionales como headers, emular un browser/dispositivo, petición POST/GET, etc.
2. Se agregan los elementos a buscar (las presas) a la instancia de DOMHunter.
3. Se llama el método `hunt()`.
4. La librería hace una petición cURL al objetivo (o se puede settear directamente un string con el HTML) y limpia el DOM, después lo distribuye a objetos para que busquen las presas.
5. Se obtiene un array con los resultados en los índices especificados.

DOM Hunter no es un web scrapper completo porque no puede simular actividad de un usuario como clicks, timeouts, etc. Se limita a buscar todos los nodos Text de la respuesta y usar expresiones regulares para encontrar los elementos aunque cambie la estructura del DOM.

### Esta cambiando constantemente entonces la forma de uso puede variar mucho en el primer release

[](#esta-cambiando-constantemente-entonces-la-forma-de-uso-puede-variar-mucho-en-el-primer-release)

Presas (objetos que encuentra)
------------------------------

[](#presas-objetos-que-encuentra)

- KeyValue
- IdUnico
- NodoDom
- Tabla
- SelectOptions
- Imagen (falta)

### Ejemplo aplicable a Estafeta

[](#ejemplo-aplicable-a-estafeta)

```
$params_peticion = array(
    'idioma' => 'es',
    'dispatch' => 'doRastreoInternet'
    'guias' = '3563581975';
    'tipoGuia' = 'ESTAFETA';
);

$hunter = new DomHunter('http://rastreo3.estafeta.com/RastreoWebInternet/consultaEnvio.do', 1);
$hunter->arrParamsPeticion = $params_peticion;

$presas = array();
$presas[] = array('numero_guia', new KeyValue('numero de guia'));
$presas[] = array('codigo_rastreo', new KeyValue('digo de rastreo'));
$presas[] = array('origen', new KeyValue('origen'));
$presas[] = array('destino', new KeyValue('destino', TRUE, TRUE));
$presas[] = array('cp_destino', new IdUnico(5, 'num'));
$presas[] = array('servicio', new KeyValue('entrega garantizada', FALSE));
$presas[] = array('estatus', new NodoDom(array('find' => '.respuestasazul'), 'plaintext', 1));
$presas[] = array('fecha_recoleccion', new KeyValue('fecha de recoleccion'));
$presas[] = array('fecha_programada', new KeyValue('de entrega', TRUE, TRUE));
$presas[] = array('fecha_entrega', new KeyValue('Fecha y hora de entrega'));
$presas[] = array('tipo_envio', new KeyValue('tipo de envio'));
$presas[] = array('peso', new KeyValue('Peso kg'));
$presas[] = array('peso_vol', new KeyValue('Peso volumétrico kg'));
$presas[] = array('recibio', new KeyValue('recibi'));
$presas[] = array('dimensiones', new KeyValue('Dimensiones cm'));
$columnas = array('fecha', 'lugar_movimiento', 'comentarios');
$presas[] = array('historial', new Tabla(array('ocurrencia' => -1), $columnas, 3));
$hunter->arrPresas = $presas;

$resultados = $hunter->hunt(); # Arreglo con los resultados, puede ir directísimo a Mongodb
```

### Ejemplo Correos de México

[](#ejemplo-correos-de-méxico)

### Ejemplo Tránsito DF (Infracciones)

[](#ejemplo-tránsito-df-infracciones)

```
$hunter = new DomHunter('http://www.finanzas.df.gob.mx/sma/detallePlaca.php?placa=912TER');

$presas = array();
$presas[] = array('folio', new IdUnico(11, 'num'));
$presas[] = array('situacion', new KeyValue('pagada', FALSE));
$presas[] = array('motivo', new KeyValue('Motivo'));
$presas[] = array('fundamento', new KeyValue('Fundamento'));
$presas[] = array('sancion', new KeyValue('as de salario m', FALSE));
$hunter->arrPresas = $presas;
$hunted = $hunter->hunt();
```

### Ejemplo AICM

[](#ejemplo-aicm)

```
$hunter = new DomHunter('http://www.aicm.com.mx/en/flights?da=a&in=n');

$columnas = array('origin', 'airline', 'flight', 'time', 'status', 'gate', 'terminal');
$presas[] = array('llegadas', new Tabla(array('ocurrencia' => 1), $columnas));

$hunter->arrPresas = $presas;
$resultados = $hunter->hunt();
```

### Ejemplo Obligaciones IFAI (Contratos)

[](#ejemplo-obligaciones-ifai-contratos)

```
$hunter = new DomHunter('http://portaltransparencia.gob.mx/pot/contrataciones/consultarContrato.do?method=consultaContrato&id.idContrato=130767&_idDependencia=12220');

$presas = array();
$presas[] = array('sector_presupuestal', new KeyValue('SECTOR PRESUPUESTAL'));
$presas[] = array('siglas', new KeyValue('SIGLAS'));
$presas[] = array('fecha_actualizacion', new KeyValue('Última fecha de actualizaci'));
$presas[] = array('numero_contrato', new KeyValue('mero de Contrato'));
$presas[] = array('unidad_administrativa', new KeyValue('Unidad administrativa que celebr'));
$presas[] = array('procedimiento_contratacion', new KeyValue('Procedimiento de contrataci'));
$presas[] = array('denominacion_asignado', new KeyValue('n social de la persona moral a que se asig'));
$presas[] = array('fecha_contrato', new KeyValue('Fecha de celebraci'));
$presas[] = array('objeto_contrato', new KeyValue('Objeto de contrato'));
$presas[] = array('monto_contrato', new KeyValue('Monto del contrato'));
$presas[] = array('moneda', new KeyValue('Tipo de Moneda'));
$presas[] = array('fecha_inicio', new KeyValue('Fecha de inicio del contrato'));
$presas[] = array('fecha_fin', new KeyValue('Fecha de terminaci'));
$presas[] = array('documento', new KeyValue('Documento del Contrato'));

$hunter->arrPresas = $presas;
$hunted = $hunter->hunt();
```

### Ejemplo ADN Político

[](#ejemplo-adn-político)

Pruebas
-------

[](#pruebas)

Tanto para hacer las peticiones como para parsear los resultados, Dom Hunter basa sus pruebas en las siguientes apps:

- Estafeta
- Correos de México
- Tránsito del DF
- Aeropuerto del DF
- Portal Obligaciones Transparencia del IFAI
- ADN Político

En los archivos `doc/output[NOMBRE_SERVICIO].md` están los headers HTTP completos de las peticiones para cuando se tenga que emular otro dispositivo, enviar cookies y otras truculencias headeriles.

TODO: [http://rastreo2.estafeta.com/ShipmentPickUpWeb/actions/pickUpOrder.do?method=doGetPickUpOrder&amp;forward=toPickUpInfo&amp;idioma=es&amp;pickUpId=8000000](http://rastreo2.estafeta.com/ShipmentPickUpWeb/actions/pickUpOrder.do?method=doGetPickUpOrder&forward=toPickUpInfo&idioma=es&pickUpId=8000000)

###  Health Score

26

—

LowBetter than 43% of packages

Maintenance0

Infrequent updates — may be unmaintained

Popularity15

Limited adoption so far

Community11

Small or concentrated contributor base

Maturity65

Established project with proven stability

 Bus Factor1

Top contributor holds 94.6% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

4368d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/a458856567486660c945ac5c38a14f0279ab3a6ddf7ee09dabc54afe617a9375?d=identicon)[ivansabik](/maintainers/ivansabik)

---

Top Contributors

[![ivansabik](https://avatars.githubusercontent.com/u/815440?v=4)](https://github.com/ivansabik "ivansabik (35 commits)")[![unRob](https://avatars.githubusercontent.com/u/123365?v=4)](https://github.com/unRob "unRob (2 commits)")

### Embed Badge

![Health badge](/badges/ivansabik-dom-hunter/health.svg)

```
[![Health](https://phpackages.com/badges/ivansabik-dom-hunter/health.svg)](https://phpackages.com/packages/ivansabik-dom-hunter)
```

###  Alternatives

[twilio/sdk

A PHP wrapper for Twilio's API

1.6k92.9M272](/packages/twilio-sdk)[knplabs/github-api

GitHub API v3 client

2.2k15.8M187](/packages/knplabs-github-api)[facebook/php-business-sdk

PHP SDK for Facebook Business

90121.9M34](/packages/facebook-php-business-sdk)[meilisearch/meilisearch-php

PHP wrapper for the Meilisearch API

73813.7M114](/packages/meilisearch-meilisearch-php)[google/common-protos

Google API Common Protos for PHP

173103.7M50](/packages/google-common-protos)[hubspot/api-client

Hubspot API client

23414.2M16](/packages/hubspot-api-client)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
