Este fin de semana, iba a descargar las ROMs y CHDs actualizados para MAME. Llevaba sin actualizarlo unos 3 años, y ya tocaba. Los tiempos han cambiado, y ahora las descargas son mucho más sencillas gracias al esfuerzo del Internet Archive, pero siguen siendo enormes. Hablamos de 500 Gb. comprimidos en ZIP, 60 Gb. para las ROM, y 440 Gb. para los CHD, es decir, al menos 50 horas de transferencia ininterrumpida.
Desde los tiempos de Opera 12, que incluso soportaba descargas por Bittorrent, los navegadores se han simplificado tanto, que lo máximo que permiten, es parar la descarga, y volverla a continuar cuando nos interese. Pero solamente, mientras el navegador esté abierto, ya que si lo cerramos, se perderá todo el progreso. Esto ocurre en Chrome, y el resto de navegadores basados en Webkit como Opera o Vivaldi y otros.
Tampoco nos permiten limitar el ancho de banda que queremos utilizar de nuestra conexión, de manera que no se sature al ocuparla entera, y podamos trabajar normalmente mientras descargamos en segundo plano. Por supuesto, hay extensiones que permiten continuar nuestros downloads aunque cerremos el navegador, sin embargo, resulta extraño que sea una función que no venga de serie.
Probé también con Shareaza, y descubrí que no soportaba el protocolo HTTPS. También revisé algunos gestores de descargas portables, y me encontré con que la mayoría de ellos reservaban el espacio para el archivo completo al inicial la descarga. Aunque a priori puede parecer ventajoso, escribir el archivo completo al principio, porque ayuda a reducir la fragmentación, no suele tener sentido, ya que lo que descargamos, suelen ser archivos temporales que eliminaremos una vez descomprimidos o instalados, así que nos da igual que estén fragmentados. El inconveniente de reservar el espacio, es que tendremos al disco duro trabajando a tope durante más de una hora, y en ese tiempo, nuestro equipo será inusable, al estar ocupadas las transferencias con tanto trasiego.
Es decir, que necesitaba, lo que creo que la mayoría de usuarios necesitamos:
1) Poder parar las descargas, y continuarlas más adelante, incluso habiendo apagado el ordenador.
2) Poder limitar el ancho de banda que usarían los archivos para descargarse.
3) No escribir el archivo completo al principio.
Entonces me acordé de WGET, la clásica herramienta de UNIX y Linux, dedicada precisamente a las descargas. Lo más complicado, y no lo fue mucho, fue conseguirla, ya que por ejemplo el proyecto GNU for Windows, lleva años sin actualizar los binarios. Por fortuna, encontré a Jernej Simončič, que incluso ofrece ejecutables para Win64, y enlazados con las últimas versiones de OpenSSL. Como además, es una herramienta por linea de comandos, el consumo de recursos es mínimo.
Así que nada tan fácil, como ejecutar una orden parecida a esta:
wget –continue –limit-rate 1500k https://ia801508.us.archive.org/25/items/MAME_0.185_ROMs_merged/MAME_0.185_ROMs_merged.zip
Donde el modificador continue indica que queremos que las descargas se puedan reanudar (resume), y –limit-rate limita el ancho de banda usado a 1200 Kb. por segundo. Al final de este artículo, encontrarás de todas formas la referencia de wget completa.
GNU Wget 1.19.1, a non-interactive network retriever. Usage: wget [OPTION]... [URL]... Mandatory arguments to long options are mandatory for short options too. Startup: -V, --version display the version of Wget and exit -h, --help print this help -b, --background go to background after startup -e, --execute=COMMAND execute a `.wgetrc'-style command Logging and input file: -o, --output-file=FILE log messages to FILE -a, --append-output=FILE append messages to FILE -d, --debug print lots of debugging information -q, --quiet quiet (no output) -v, --verbose be verbose (this is the default) -nv, --no-verbose turn off verboseness, without being quiet --report-speed=TYPE output bandwidth as TYPE. TYPE can be bits -i, --input-file=FILE download URLs found in local or external FILE --input-metalink=FILE download files covered in local Metalink FILE -F, --force-html treat input file as HTML -B, --base=URL resolves HTML input-file links (-i -F) relative to URL --config=FILE specify config file to use --no-config do not read any config file --rejected-log=FILE log reasons for URL rejection to FILE Download: -t, --tries=NUMBER set number of retries to NUMBER (0 unlimits) --retry-connrefused retry even if connection is refused -O, --output-document=FILE write documents to FILE -nc, --no-clobber skip downloads that would download to existing files (overwriting them) -c, --continue resume getting a partially-downloaded file --start-pos=OFFSET start downloading from zero-based position OFFSET --progress=TYPE select progress gauge type --show-progress display the progress bar in any verbosity mode -N, --timestamping don't re-retrieve files unless newer than local --no-if-modified-since don't use conditional if-modified-since get requests in timestamping mode --no-use-server-timestamps don't set the local file's timestamp by the one on the server -S, --server-response print server response --spider don't download anything -T, --timeout=SECONDS set all timeout values to SECONDS --dns-timeout=SECS set the DNS lookup timeout to SECS --connect-timeout=SECS set the connect timeout to SECS --read-timeout=SECS set the read timeout to SECS -w, --wait=SECONDS wait SECONDS between retrievals --waitretry=SECONDS wait 1..SECONDS between retries of a retrieval --random-wait wait from 0.5*WAIT...1.5*WAIT secs between retrievals --no-proxy explicitly turn off proxy -Q, --quota=NUMBER set retrieval quota to NUMBER --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local host --limit-rate=RATE limit download rate to RATE --no-dns-cache disable caching DNS lookups --restrict-file-names=OS restrict chars in file names to ones OS allows --ignore-case ignore case when matching files/directories -4, --inet4-only connect only to IPv4 addresses -6, --inet6-only connect only to IPv6 addresses --prefer-family=FAMILY connect first to addresses of specified family, one of IPv6, IPv4, or none --user=USER set both ftp and http user to USER --password=PASS set both ftp and http password to PASS --ask-password prompt for passwords --use-askpass=COMMAND specify credential handler for requesting username and password. If no COMMAND is specified the WGET_ASKPASS or the SSH_ASKPASS environment variable is used. --no-iri turn off IRI support --local-encoding=ENC use ENC as the local encoding for IRIs --remote-encoding=ENC use ENC as the default remote encoding --unlink remove file before clobber --keep-badhash keep files with checksum mismatch (append .badhash) --metalink-index=NUMBER Metalink application/metalink4+xml metaurl ordinal NUMBER --metalink-over-http use Metalink metadata from HTTP response headers --preferred-location preferred location for Metalink resources Directories: -nd, --no-directories don't create directories -x, --force-directories force creation of directories -nH, --no-host-directories don't create host directories --protocol-directories use protocol name in directories -P, --directory-prefix=PREFIX save files to PREFIX/.. --cut-dirs=NUMBER ignore NUMBER remote directory components HTTP options: --http-user=USER set http user to USER --http-password=PASS set http password to PASS --no-cache disallow server-cached data --default-page=NAME change the default page name (normally this is 'index.html'.) -E, --adjust-extension save HTML/CSS documents with proper extensions --ignore-length ignore 'Content-Length' header field --header=STRING insert STRING among the headers --max-redirect maximum redirections allowed per page --proxy-user=USER set USER as proxy username --proxy-password=PASS set PASS as proxy password --referer=URL include 'Referer: URL' header in HTTP request --save-headers save the HTTP headers to file -U, --user-agent=AGENT identify as AGENT instead of Wget/VERSION --no-http-keep-alive disable HTTP keep-alive (persistent connections) --no-cookies don't use cookies --load-cookies=FILE load cookies from FILE before session --save-cookies=FILE save cookies to FILE after session --keep-session-cookies load and save session (non-permanent) cookies --post-data=STRING use the POST method; send STRING as the data --post-file=FILE use the POST method; send contents of FILE --method=HTTPMethod use method "HTTPMethod" in the request --body-data=STRING send STRING as data. --method MUST be set --body-file=FILE send contents of FILE. --method MUST be set --content-disposition honor the Content-Disposition header when choosing local file names (EXPERIMENTAL) --content-on-error output the received content on server errors --auth-no-challenge send Basic HTTP authentication information without first waiting for the server's challenge HTTPS (SSL/TLS) options: --secure-protocol=PR choose secure protocol, one of auto, SSLv2, SSLv3, TLSv1 and PFS --https-only only follow secure HTTPS links --no-check-certificate don't validate the server's certificate --certificate=FILE client certificate file --certificate-type=TYPE client certificate type, PEM or DER --private-key=FILE private key file --private-key-type=TYPE private key type, PEM or DER --ca-certificate=FILE file with the bundle of CAs --ca-directory=DIR directory where hash list of CAs is stored --crl-file=FILE file with bundle of CRLs --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number of base64 encoded sha256 hashes preceded by 'sha256//' and separated by ';', to verify peer against --random-file=FILE file with random data for seeding the SSL PRNG HSTS options: --no-hsts disable HSTS --hsts-file path of HSTS database (will override default) FTP options: --ftp-user=USER set ftp user to USER --ftp-password=PASS set ftp password to PASS --no-remove-listing don't remove '.listing' files --no-glob turn off FTP file name globbing --no-passive-ftp disable the "passive" transfer mode --preserve-permissions preserve remote file permissions --retr-symlinks when recursing, get linked-to files (not dir) FTPS options: --ftps-implicit use implicit FTPS (default port is 990) --ftps-resume-ssl resume the SSL/TLS session started in the control connection when opening a data connection --ftps-clear-data-connection cipher the control channel only; all the data will be in plaintext --ftps-fallback-to-ftp fall back to FTP if FTPS is not supported in the target server WARC options: --warc-file=FILENAME save request/response data to a .warc.gz file --warc-header=STRING insert STRING into the warcinfo record --warc-max-size=NUMBER set maximum size of WARC files to NUMBER --warc-cdx write CDX index files --warc-dedup=FILENAME do not store records listed in this CDX file --no-warc-compression do not compress WARC files with GZIP --no-warc-digests do not calculate SHA1 digests --no-warc-keep-log do not store the log file in a WARC record --warc-tempdir=DIRECTORY location for temporary files created by the WARC writer Recursive download: -r, --recursive specify recursive download -l, --level=NUMBER maximum recursion depth (inf or 0 for infinite) --delete-after delete files locally after downloading them -k, --convert-links make links in downloaded HTML or CSS point to local files --convert-file-only convert the file part of the URLs only (usually known as the basename) --backups=N before writing file X, rotate up to N backup files -K, --backup-converted before converting file X, back up as X.orig -m, --mirror shortcut for -N -r -l inf --no-remove-listing -p, --page-requisites get all images, etc. needed to display HTML page --strict-comments turn on strict (SGML) handling of HTML comments Recursive accept/reject: -A, --accept=LIST comma-separated list of accepted extensions -R, --reject=LIST comma-separated list of rejected extensions --accept-regex=REGEX regex matching accepted URLs --reject-regex=REGEX regex matching rejected URLs --regex-type=TYPE regex type (posix) -D, --domains=LIST comma-separated list of accepted domains --exclude-domains=LIST comma-separated list of rejected domains --follow-ftp follow FTP links from HTML documents --follow-tags=LIST comma-separated list of followed HTML tags --ignore-tags=LIST comma-separated list of ignored HTML tags -H, --span-hosts go to foreign hosts when recursive -L, --relative follow relative links only -I, --include-directories=LIST list of allowed directories --trust-server-names use the name specified by the redirection URL's last component -X, --exclude-directories=LIST list of excluded directories -np, --no-parent don't ascend to the parent directory Mail bug reports and suggestions to
Actualizado a jueves 20 de julio de 2017. 8:19:
Actualizo con el importante aporte de EdSon, agregando la opción documentada de no comprobar certificados SSL, para evitar posibles errores en la descarga, pero también, la importante opción no documentada de omitir robots.txt:
wget -e robots=off –nocheck-certificate –continue –limit-rate 1500k https://ia801508.us.archive.org/25/items/MAME_0.185_ROMs_merged/MAME_0.185_ROMs_merged.zip
Yo utilizo extensamente wget para un montón de cosas, muchas son «actualizadores» de aplicaciones que he «programado» en cmd (el DOS Shell).
También utilizo los binarios de Jernej Simončič, antes utilizaba los de GnuWin32 (http://gnuwin32.sourceforge.net/) pero están sin actualizar desde hace siglos y no ofrecen versión de 64bits.
una pregunta que seguramente es muy tonta pero denota visiblemente lo poco que utilizo las líneas de comandos: ¿como reanudas la descarga? metiendo el mismo comando? ¿Y dónde te lo guarda?
porque mi ordenador está como está, sino le hacía GUIS como tienen que ser a todos esos sistemas, como hizo el tipo del Qualityebook, o como hizo nuestro amigo Guti con los plugins de los compresores. Y hacer una GUI del Wget debe quedar bonito…
¡ah, que ya la han hecho por mí! Mejor entonces 🙂 http://www.jensroesner.de/wgetgui/
Otra herramienta que utilizo de vez en cuando es curl, aunque normalmente la utilizo como librería de php.
Como la herramienta analizadora de red de Firefox y Chrome te permiten copiar una petición como comando curl, he utilizado dicha herramienta para controlar mejor ciertas peticiones a diversas API. Por mencionar un caso práctico la última vez fue con el acceso a la web de gestión de un router, en primera instancia automatice un reinicio mediante curl, posteriormente analicé bien las peticiones para realizarlas mediante Curl en PHP.
Sí Fernando. Los binarios de Jernej Simončič son magníficos. Yo había usado varios, y o estaban anticuados, o no tenían SSL, o no tenían versión de 64 bits… Han sido un gran descubrimiento.
bianamaran, la descarga la guarda en el mismo archivo. Es decir, cuando lo vuelves a continuar, el lo resigue. No conocía wGetGUI, es curioso, de esos programas en VB que explotan al máximo el lenguaje.
También uso curl, desde PHP. Es muy potente, pero de cómodo tiene poco, porque cuando empiezas a jugar con la los parámetros por POST y esas cosas, es un engorro.
Por eso me cree una clase llamada wget, que me permite controlar curl en PHP de forma sencilla.
https://github.com/alphp/wget
Me gusta esa clase Fernando, pero lo que más me ha gustado es el ContextMenu.js en tu repositorio. Muy chulo.
y que lo digas Guti, el Overriding del context menú está genial, muy currado.
El problema del javascript y de estas cosas que depende de navegadores es el de siempre: la falta total de compatibilidad. Por ejemplo, en Opera le das y te sale el submenú en China (en el otro lado de la página) 😀 Por eso ese tipo de scripts, como el mismo Flash acabó, nunca serán nada. Y una pena porque la potencia de VBScript me encantaba…, pero claro, cuando es algo que solo puedes hacer en determinados navegadores o a costa de meterles flujos de if y más if para ver si el usuario tiene esto o lo otro o usa esto o lo otro, deja de ser práctico. Solo el mantenerlo es un dolor de cabeza, así que pocas páginas web que duren en el tiempo se pueden basar en esas cosas…
Eso no quita que para algo muy puntual y específico sea, obviamente, realmente útil.
Guti no tienes perdón, decirme que lo que más te gusta de mi repositorio sea un fork de otra persona…
El ContextMenu.js lo utilicé para un proyecto del curro, uno de esos para los ratos «libres». Y lo que tengo comprobado es que funciona para Firefox/Chrome/Explorer (11.413-Win10).
De hecho todos los proyectos de webapps los compruebo siempre con el dúo dinámico Firefox/Chrome que en mi opinión, con sus dos motores de renderizado, son la punta de lanza de los estándares.
Si he tenido algún problema con los CSS, pero más que problema era alguna pequeña diferencia que me obliga a cerrar el ojo perfeccionista para cumplir plazos.
Creo que el problema de las aplicaciones web, es que la tecnología avanza tan rápido, que en seguida aparecen características nuevas, cambian las existentes, y otras se abandonan. Una web con 5 años, es casi como una aplicación con 20 años. Y una aplicación con 20 años, es como un coche con 80 años.
Bueno, Fernando, no me di cuenta que fuera un fork, sólo que me gustó como funcionaba. Esto de los navegadores, sigue siendo un infierno. Sólo cambian los nombres desde los 90, antes Netscape e Internet Explorer, y ahora Webkit y Gecko.
Ya me imaginaba Guti, lo decía en plan irónico.
Tienes razón en cuanto a que la velocidad de los cambios en la web es asombrosa, sin embargo creo que desde hace unos años se tiene muy presente en los equipos de Webkit y Gecko el ajustarse lo más posible a los estándares. Hay diferencias, claro, pero el estándar se cumple. Ya no es como hace 20 años.
Creo firmemente que el futuro está en las WebApps, y no por las aplicaciones «ligeras». Serán aplicaciones que aprovecharan jQuery, Bootstrap y otras librerías javascript y CSS a fondo. Las aplicaciones se conciben como algo vivo, con una evolución constante, las versiones desaparecen, el mantenimiento y administración se centralizan… como desarrollador por un lado y administrador de sistemas en otro, veo claramente esas y otras ventajas. No digo que no existan problemas, pero compensan. Si me animo igual escribo largo en mi blog.
Saludos,
– Bueno, la entrada trata de WGET asi que mucho no puedo hacer, es cierto de que yo también utilicé y utilizo esta herramienta para hacer scripts bajo windows, en mi caso para descargarme cosas de google docs, ISSUU, páginas web, etc.
wget -e robots=off –no-check-certificate
– Con -e robots=off deshabilito el «filtro» que tiene por defecto para respetar el robots.txt
– Con –nocheck-certificate para saltarse la validación https.
– Correcto hasta aquí, y sirve perfecto para esto. PERO para lo que veo que necesitan, no es lo «ideal», para lo que pide la entrada del Blog es mejor utilizar un buen gestor de descargas como el horriblemente pesado (java) jDownloader o Internet Download Manager (de pago), este último es lo más ideal.
– Yo tengo los 3, claro está, lo que me importa es su utilidad y la ventaja que ofrecen cada uno para lo que necesito. WGET para scripts, jDownloader para servidores de descarga (mediafire, mega, etc), videos (vimeo, youtube, etc) y algunas cosas que requieren más paciencia, e IDM para descargar todo rápido y embebido al navegador web.
Llevo algunos años pensando sobre lo que dices Fernando. El caso es que con las aplicaciones web, a diferencia de las de escritorio que sólo dependen de nuestro código, en las webs, dependen del servidor web y su sistema operativo, del navegador web, y de nuestro código.
Es decir, hay un esfuerzo en cuanto a mantenimiento de cara a testear y aplicar parches de sistema, que obviamente requieren tiempo. Es un tiempo, que los usuarios no suelen estar dispuestos a pagar, y al final pasa lo que pasa. Se descubre un agujero de seguridad, alguien ataca la aplicación, y llegan disgustos para todos.
Es un tema educativo, igual que sabemos que el coche necesita unas revisiones cada cierto tiempo que cuestan una pasta, con los desarrollos web, es lo mismo.
Yo es que no concibo una aplicación ligera basada en Java, EdSon. Simplemente evito instalarlas. Lo que si es muy interesante es el modificador –no-check-certificate, que aunque estaba explicado en el artículo, hubiera sido conveniente incluirlo en loas ejemplos que puse.
Lo que más me ha gustado es el -e robots=off, una opción que no conocía, y al no incluirla la ayuda, no había encontrado.
Sí, wget es magnífico y más de una vez lo he echado en falta en Windows. No obstante hace no mucho descubrí que wget existe en Windows!!
Si usas PowerShell en vez de cmd.exe y escribes wget, se le reconoce como un alias del comando de PowerShell «Invoke-WebRequest». Yo apenas lo he usado pero por lo que he visto puede sustituir a wget, teniendo en cuenta que sus flags son distintas.
Excelente para un actualizador desde MS-DOS
Oye que raro, desde Chrome no puedo enviar comentarios (y eso que lo tengo actualizado), desde firefox (ultima versión por cierto también) si funciona.
Cada vez que he intentado acostumbrarme a Powershell he desistido Adrián Arroyo. Imagino que requieres a la consola cuando necesitas agilidad, y ahí la curva de aprendizaje es dura. En mi caso además, sigo fiel a Take Command. Pero es un aporte interesante que hayan añadido ese alias. Microsoft últimamente se está Linuxsizando.
Por desgracia Manuel, no hay ningún port de WGET para DOS. No lo he probado, pero imagino que ni siquiera con HX-DOS Extender conseguiría funcionar.
Voy a comprobarlo Manuel. Uso Opera que utiliza el mismo motor, y no tengo problemas.
– Correcto, java es muy pesado, sin embargo jDowloader lo vale, desde los lios que ha tenido Java (vulnerabilidades en exceso XD) algunas aplicaciones de uso general como jDownloader, Geogebra, etc, tienen integrado lo necesario para no requerir Java instalado en el PC haciendolos portables de verdad.
– Con respecto al -e robots=off, está oculto porque forma un «pacto de no agresión» respetar el robots.txt, hay que revisar el código fuente para hallarlo.
– Yo estoy utilizando Chrome y no tengo problemas para enviar mi mensaje XD. Lo malo es que por más que le doy a: «Recibir un email con los siguientes comentarios a esta entrada» no funciona, nunca me avisa.
Con tu permiso EdSon, he actualizado el artículo, agregando el interesantísimo «-e robots=off», además del ya documentado «–nocheck-certificate».
En cuanto al problema con las notificaciones por email de los comentarios, es algo que reportan los usuarios de vez en cuando. He estado haciendo unas pruebas tanto con gmail como con hotmail, y los he recibido sin problemas. ¿No será que llegan a la carpeta de spam?
Por desgracia Manuel, no hay ningún port de WGET para DOS.
————
De manera nativa, pues no, Microsoft y sus carencias de siempre jajaja, pero veo que esta es una utilería que podemos instalar, ¿estoy en lo correcto?.
Otra que podemos instalar (la he probado bajo Reactos (no se si funcione bajo windows 7, supongo que si) y trabaja muy bien es unxutils, que incluye la función wget https://www.reactos.org/forum/viewtopic.php?f=2&t=10972&p=119428#p119428
No Manuel, no es posible instalar WGET sobre MS-DOS. En cambio en ReacOS 0.4.5, si que funciona bien WGET 1.19.
te refieres a MS-DOS puro?, pero si lo corremos desde windows mediante la consola si funcionaría verdad?
Efectivamente Manuel. Desde una consola de Windows funciona sin problemas. Lo de MS-DOS surgió, porque al principio tu planteaste integrarlo en un actualizador MS-DOS.
creo que fue error mio no decir que era desde la consola (a eso me refería).
De ahí vino la confusión Manuel. Es un equívoco muy habitual referirse a la consola de Windows como MS-DOS, pese a que no tienen nada que ver, desde los tiempos de Windows 9x.
Me extraña que nadie haya nombrado todavía Aria2, https://aria2.github.io/
Échale un vistazo y me dices 😉 Yo hace años que no uso wget… 🙂
Genial aporte anr. No la conocía en absoluto. De hecho aria, a mi me sonaba a motor de datos de MySQL más que a una herramienta de descarga. Tiene muy buena pinta. No sólo soporta HTTP y HTTPS como WGET, sino también FTP, SFTP y Torrent. Definitivamente tengo que probarla.
Pruebala, te sorprenderá el tamaño, velocidad, y todas las opcione que trae, no sé ahora mismo si wget hace algo que aria2 no haga, pero sí sé que Aria2 es RAPIDO (multipart, etc…)
Sí anr la he probado, y tengo un futuro post preparado sobre Aria2. Ha sido un gran descubrimiento por tu parte.