{"id":46156432,"url":"https://github.com/phpcfdi/sat-pys-scraper","last_synced_at":"2026-03-02T10:02:30.646Z","repository":{"id":212402240,"uuid":"731371069","full_name":"phpcfdi/sat-pys-scraper","owner":"phpcfdi","description":"Herramienta para obtener y generar un listado de las clasificaciones del catálogo de productos y servicios del SAT","archived":false,"fork":false,"pushed_at":"2025-11-13T19:20:58.000Z","size":128,"stargazers_count":6,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-11-13T20:08:17.451Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/phpcfdi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-12-13T23:50:53.000Z","updated_at":"2025-11-13T19:19:43.000Z","dependencies_parsed_at":"2024-10-20T15:38:32.932Z","dependency_job_id":null,"html_url":"https://github.com/phpcfdi/sat-pys-scraper","commit_stats":null,"previous_names":["phpcfdi/sat-pys-scraper"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/phpcfdi/sat-pys-scraper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phpcfdi%2Fsat-pys-scraper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phpcfdi%2Fsat-pys-scraper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phpcfdi%2Fsat-pys-scraper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phpcfdi%2Fsat-pys-scraper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/phpcfdi","download_url":"https://codeload.github.com/phpcfdi/sat-pys-scraper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phpcfdi%2Fsat-pys-scraper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29998079,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-02T09:59:02.300Z","status":"ssl_error","status_checked_at":"2026-03-02T09:59:02.001Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-03-02T10:02:28.068Z","updated_at":"2026-03-02T10:02:30.521Z","avatar_url":"https://github.com/phpcfdi.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# phpcfdi/sat-pys-scraper\n\n[![Source Code][badge-source]][source]\n[![PHP Version][badge-php-version]][php-version]\n[![Latest Version][badge-release]][release]\n[![Software License][badge-license]][license]\n[![Build Status][badge-build]][build]\n[![Reliability][badge-reliability]][reliability]\n[![Maintainability][badge-maintainability]][maintainability]\n[![Code Coverage][badge-coverage]][coverage]\n[![Violations][badge-violations]][violations]\n[![Total Downloads][badge-downloads]][downloads]\n[![Docker Downloads][badge-docker]][docker]\n\n\u003e Herramienta para obtener y generar un listado de las clasificaciones del catálogo de productos y servicios del SAT\n\n:us: The documentation of this project is in Spanish, as this is the natural language for the intended audience.\n\nEs posible que, lo único que buscas es el **Listado de clasificaciones de productos y servicios del SAT**, \nsi es ese el caso, es mejor consumir el recurso [phpcfdi/resources-pys](https://github.com/phpcfdi/resources-pys), \nen donde el listado es actualizado automáticamente.\n\n## Acerca de phpcfdi/sat-pys-scraper\n\nEl SAT en el sitio de internet \u003chttp://pys.sat.gob.mx/PyS/catPyS.aspx\u003e tiene publicada una clasificación de productos y servicios. \nEsta clasificación no pertenece oficialmente a los catálogos y no se encuentra publicada en ningún lugar.\n\nEsta herramienta hace el *scrap* del sitio mencionado para obtener los 4 niveles de clasificación: Tipo, Segmento, Familia y Clase. \nIgualmente, la estructura se puede exportar como XML o como JSON.\n\n## Instalación usando composer\n\nA diferencia de otras librerías o componentes, este proyecto es una herramienta, por lo que probablemente nunca tengas que \ninstalar el proyecto como una dependencia. Sin embargo, se puede hacer para que realices la parte de obtener las \nclasificaciones del sitio del SAT, pero tú mismo te encargues de procesar la estructura y usarla para tus propios \npropósitos, como por ejemplo, almacenar en una base de datos.\n\n```shell\ncomposer require phpcfdi/sat-pys-scraper\n```\n\n## Ejecución usando Docker\n\nEste proyecto está integrado a Docker Hub [`phpcfdi/sat-pys-scraper`][docker] por lo que puedes ejecutarlo\ndesde la línea de comandos:\n\n```shell\n# obtener la imagen de docker\ndocker pull phpcfdi/sat-pys-scraper\n\n# ejecución de la herramienta\ndocker docker run -it --rm --user=\"$(id -u):$(id -g)\" sat-pys-scraper --help\n```\n\nEste proyecto provee un archivo `Dockerfile` para construir una imagen con todas sus dependencias.\n\nPara más información y ejemplos consulte el archivo [`README.Docker.md`](Docker.README.md).\n\n### Ayuda de `sat-pys-scraper` (script)\n\n```text\nsat-pys-scraper - Crea un archivo con la clasificación de productos y servicios del SAT.\n\nSintaxis:\n    sat-pys-scraper help|-h|--help\n    sat-pys-scraper [--quiet|-q] [--json|-j JSON_FILE] [--xml|-x XML_FILE]\n\nArgumentos:\n    --xml|-x XML_FILE\n        Establece el nombre de archivo, o \"-\" para la salida estándar, donde se envían\n        los datos generados en formato XML.\n    --json|-j JSON_FILE\n        Establece el nombre de archivo, o \"-\" para la salida estándar, donde se envían\n        los datos generados en formato JSON.\n    --sort|-s SORT\n        Establece el orden de elementos, default: key, se puede usar \"key\" o \"name\".\n    --quiet|-q\n        Modo de operación silencioso.\n\nNotas:\n    Debe especificar al menos un argumento \"--xml\" o \"--json\", o ambos.\n    No se puede especificar \"-\" como salida de \"--xml\" y \"--json\" al mismo tiempo.\n\nAcerca de:\n    Este script pertenece al proyecto https://github.com/phpcfdi/sat-pys-scraper\n    y mantiene la autoría y licencia de todo el proyecto.\n```\n\n## Uso de la herramienta\n\nSi usar el código de la herramienta, entonces es importante entender que la tarea trata de dos pasos:\n\n1. Obtener del sitio del SAT el listado de tipos, segmentos, familias y clases.\n2. Exportar el listado a un formato específico.\n\nPara generar el listado de tipos, segmentos, familias y clases se usa el objeto `Generator`, que a su vez usa un \nobjeto `Scraper` para realizar la descarga de información, que a su vez utiliza un objeto `Client` de `GuzzleHttp`.\n\nEn el siguiente ejemplo se muestra cómo generar la estructura e iterar sobre sus elementos.\n\n- Al ejecutar `Generator::generate()` se devuelve un objeto de tipo `Types`.\n- Se recorre la estructura con `foreach`.\n- Se puede exportar usando `XmlExporter::export()`.\n\n```php\n\u003c?php\nuse GuzzleHttp\\Client;\nuse PhpCfdi\\SatPysScraper\\Generator;\nuse PhpCfdi\\SatPysScraper\\Scraper;\nuse PhpCfdi\\SatPysScraper\\XmlExporter;\n\n$scraper = new Scraper(new Client());\n$generator = new Generator($scraper);\n$types = $generator-\u003egenerate();\n$types-\u003esortByKey();\n\nforeach ($types as $type) {\n    printf(\"Tipo: %s - %s\\n\", $type-\u003ekey, $type-\u003ename);\n    foreach ($type as $segment) {\n        printf(\"  Segmento: %s - %s\\n\", $segment-\u003ekey, $segment-\u003ename);\n        foreach ($segment as $family) {\n            printf(\"    Familia: %s - %s\\n\", $family-\u003ekey, $family-\u003ename);\n            foreach ($family as $class) {\n                printf(\"      Clase: %s - %s\\n\", $class-\u003ekey, $class-\u003ename);\n            }\n        }\n    }\n}\n\n$exporter = new XmlExporter();\n$exporter-\u003eexport('output.xml', $types);\n```\n\n### Tipos de datos\n\nUn objeto `Types` es una colección iterable de objetos de tipo `Type`.\nUn objeto `Type` contiene las propiedades `key` y `name`, y además es una colección iterable de objetos de tipo `Segment`.\nUn objeto `Segment` contiene las propiedades `key` y `name`, y además es una colección iterable de objetos de tipo `Family`.\nUn objeto `Family` contiene las propiedades `key` y `name`, y además es una colección iterable de objetos de tipo `Classification`.\nUn objeto `Classification` solamente contiene las propiedades `key` y `name`.\n\nTodos los objetos de datos implementan `JsonSerializable`, por lo que puedes usar esta característica para exportar a formato JSON.\n\n### Excepciones\n\nLa clase `Scraper` y -por consecuencia- también la clase `Generator` generan excepciones.\nEn el caso de una excepción de tipo HTTP se tira una excepción `HttpException`.\nEn el caso de una excepción HTTP y tenga un código de error del servicio remoto se tira una excepción `HttpServerException`.\n\nLa jerarquía de excepciones es:\n\n```text\n- PysException (interface)\n    - HttpException (class)\n        - HttpServerException (class)\n```\n\n## Soporte\n\nPuedes obtener soporte abriendo un ticket en Github.\n\nAdicionalmente, esta librería pertenece a la comunidad [PhpCfdi](https://www.phpcfdi.com),\nasí que puedes usar los canales oficiales de comunicación para obtener ayuda de la comunidad.\n\n## Compatibilidad\n\nEsta librería se mantendrá compatible con al menos la versión con\n[soporte activo de PHP](https://www.php.net/supported-versions.php) más reciente.\n\nTambién utilizamos [Versionado Semántico 2.0.0](docs/SEMVER.md) por lo que puedes usar esta librería\nsin temor a romper tu aplicación.\n\n| Versión | PHP           | Nota                              |\n|---------|---------------|-----------------------------------|\n| 1.0.0   | 8.2, 8.3      | 2023-12-13 Fuera de mantenimiento |\n| 2.0.0   | 8.2, 8.3      | 2024-03-07 Fuera de mantenimiento |\n| 3.0.0   | 8.2, 8.3      | 2024-03-07 Fuera de mantenimiento |\n| 4.0.0   | 8.2, 8.3, 8.4 | 2024-10-17 Fuera de mantenimiento |\n| 5.0.0   | 8.3, 8.4      | 2025-11-13                        |\n\n## Contribuciones\n\nLas contribuciones con bienvenidas. Por favor lee [CONTRIBUTING][] para más detalles\ny recuerda revisar el archivo de tareas pendientes [TODO][] y el archivo [CHANGELOG][].\n\n## Copyright and License\n\nThe `phpcfdi/sat-pys-scraper` tool is copyright © [PhpCfdi](https://www.phpcfdi.com/)\nand licensed for use under the MIT License (MIT). Please see [LICENSE][] for more information.\n\n[contributing]: https://github.com/phpcfdi/sat-pys-scraper/blob/main/CONTRIBUTING.md\n[changelog]: https://github.com/phpcfdi/sat-pys-scraper/blob/main/docs/CHANGELOG.md\n[todo]: https://github.com/phpcfdi/sat-pys-scraper/blob/main/docs/TODO.md\n\n[source]: https://github.com/phpcfdi/sat-pys-scraper\n[php-version]: https://packagist.org/packages/phpcfdi/sat-pys-scraper\n[release]: https://github.com/phpcfdi/sat-pys-scraper/releases\n[license]: https://github.com/phpcfdi/sat-pys-scraper/blob/main/LICENSE\n[build]: https://github.com/phpcfdi/sat-pys-scraper/actions/workflows/build.yml?query=branch:main\n[reliability]:https://sonarcloud.io/component_measures?id=phpcfdi_sat-pys-scraper\u0026metric=Reliability\n[maintainability]: https://sonarcloud.io/component_measures?id=phpcfdi_sat-pys-scraper\u0026metric=Maintainability\n[coverage]: https://sonarcloud.io/component_measures?id=phpcfdi_sat-pys-scraper\u0026metric=Coverage\n[violations]: https://sonarcloud.io/project/issues?id=phpcfdi_sat-pys-scraper\u0026resolved=false\n[downloads]: https://packagist.org/packages/phpcfdi/sat-pys-scraper\n[docker]: https://hub.docker.com/r/phpcfdi/sat-pys-scraper\n\n[badge-source]: https://img.shields.io/badge/source-phpcfdi/sat--pys--scraper-blue?logo=github\n[badge-php-version]: https://img.shields.io/packagist/dependency-v/phpcfdi/sat-pys-scraper/php?logo=php\n[badge-release]: https://img.shields.io/github/release/phpcfdi/sat-pys-scraper?logo=git\n[badge-license]: https://img.shields.io/github/license/phpcfdi/sat-pys-scraper?logo=open-source-initiative\n[badge-build]: https://img.shields.io/github/actions/workflow/status/phpcfdi/sat-pys-scraper/build.yml?branch=main\u0026logo=github-actions\n[badge-reliability]: https://sonarcloud.io/api/project_badges/measure?project=phpcfdi_sat-pys-scraper\u0026metric=reliability_rating\n[badge-maintainability]: https://sonarcloud.io/api/project_badges/measure?project=phpcfdi_sat-pys-scraper\u0026metric=sqale_rating\n[badge-coverage]: https://img.shields.io/sonar/coverage/phpcfdi_sat-pys-scraper/main?logo=sonarqubecloud\u0026server=https%3A%2F%2Fsonarcloud.io\n[badge-violations]: https://img.shields.io/sonar/violations/phpcfdi_sat-pys-scraper/main?format=long\u0026logo=sonarqubecloud\u0026server=https%3A%2F%2Fsonarcloud.io\n[badge-downloads]: https://img.shields.io/packagist/dt/phpcfdi/sat-pys-scraper?logo=packagist\n[badge-docker]: https://img.shields.io/docker/pulls/phpcfdi/sat-pys-scraper?logo=docker\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphpcfdi%2Fsat-pys-scraper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphpcfdi%2Fsat-pys-scraper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphpcfdi%2Fsat-pys-scraper/lists"}