Aquí hay dos ejemplos diferentes utilizando Safari de cómo descargar las imágenes individuales en miniatura de las exploraciones cerebrales en el objetivo URL .
El ejemplo AppleScript código que se muestra a continuación, se probó en Script Editor en MacOS Catalina con Lengua y región ajustes en Preferencias del sistema ajustado a Inglés (EE.UU.) - Primaria y me ha funcionado sin problemas 1 .
- 1 Asume los ajustes necesarios y apropiados en <strong>Preferencias del sistema </strong>> <strong>Seguridad y privacidad </strong>> <strong>Privacidad </strong>se han fijado/abordado según las necesidades.
Método semiautomatizado
- Guarde el archivo ya abierto Safari página web que contiene el imágenes de los escáneres cerebrales como Archivo web .
- Ejecutar el ejemplo AppleScript código que se muestra justo debajo, en Script Editor .
Ejemplo AppleScript código :
property saveToFolder : POSIX path of ¬
(path to downloads folder from user domain)
set thePropertyListFilePath to the POSIX path of ¬
(choose file with prompt ¬
"Select the saved Safari document " & ¬
"of the brain scans..." default location ¬
(path to desktop folder from user domain))
tell application "System Events"
tell property list file thePropertyListFilePath
set theWebSubresourcesCount to the ¬
(count of property list items) of ¬
property list item "WebSubresources"
set n to 0
repeat with i from 0 to theWebSubresourcesCount - 1
set theWebResourceURL to the value of ¬
property list item "WebResourceURL" of ¬
property list item i of ¬
property list item "WebSubresources"
if theWebResourceURL contains "cgi-bin/imageservice" then
set theWebResourceData to the value of ¬
property list item "WebResourceData" of ¬
property list item i of ¬
property list item "WebSubresources"
if n is less than 10 then
set n to "00" & n
set imageName to "Image_" & n
else if n is less than 100 then
set n to "0" & n
set imageName to "Image_" & n
else
set imageName to "Image_" & n
end if
set theFile to saveToFolder & imageName & ".jpg"
my writeToFile(theWebResourceData, theFile, true)
set n to n + 1
end if
end repeat
end tell
end tell
-- ## Handler ##
to writeToFile(theData, theFile, overwriteExistingContent)
try
set theFile to theFile as string
if theFile contains "/" then
set theOpenedFile to ¬
open for access theFile with write permission
else
set theOpenedFile to ¬
open for access file theFile with write permission
end if
if overwriteExistingContent is true then ¬
set eof of theOpenedFile to 0
write theData to theOpenedFile starting at eof
close access theOpenedFile
return true
on error
try
close access file theFile
end try
return false
end try
end writeToFile
Notas:
El ejemplo AppleScript código que se muestra directamente arriba, abrirá un choose file
cuadro de diálogo para que elijas el justo guardado Safari página web que contiene el imágenes de los escáneres cerebrales.
A continuación, extraerá el objetivo imágenes de los escáneres cerebrales de los guardados Safari página web que contiene el imágenes de los escáneres cerebrales, escribiéndolos a la Descargas carpeta , denominados secuencialmente como Imagen_000.jpg a través de la número de imágenes de los escáneres cerebrales en los salvados Archivo web página web.
Este método es muy rápido en comparación con el Método totalmente automatizado que se muestra a continuación y sólo debería tardar unos 10 segundos después de seleccionar el objetivo archivo dependiendo de la velocidad de su CPU es.
Por desgracia, parece que el AppleScript save
comando en Safari está roto y por qué el esto se publica como un método semiautomático. Si la página web de destino se guardara primero mediante programación, también podría ser un método totalmente automatizado.
La razón por la que hay dos métodos es que este fue una idea de última hora, sin embargo, debido a que es mucho más rápido que el método original que publiqué, lo he colocado primero y he mantenido el original ya que siempre es bueno tener más de una forma de realizar la tarea con el objetivo aplicación .
Método totalmente automatizado
(Respuesta original)
El ejemplo AppleScript código crea un nuevo ventana en Safari al objetivo URL espera a que la página termine de cargarse, y luego construye un lista de curl
comandos para ser utilizado en un do shell script
comando para descargar cada imagen, nombrándolas secuencialmente en el Descargas carpeta .
Tenga en cuenta que una vez que inicie el ejemplo AppleScript código debe esperar a que comience a descargar las imágenes antes de hacer cualquier otra cosa en Safari que sólo debería tardar unos segundos, dependiendo de la velocidad de su Internet conexión es.
Una vez que comienza la descarga, espera un tiempo aleatorio, entre 3 y 8 segundos, para descargar la siguiente imagen, ya que no quiere inundar el servidor con peticiones rápidas, ya que puede considerarlo un ataque.
Tal y como está codificado, debería tardar unos 20 minutos en descargar todas las imágenes.
Ejemplo AppleScript código :
property downloadsFolder : POSIX path of (path to downloads folder from user domain)
property theURL : "https://connectivity.brain-map.org/static/referencedata/experiment/thumbnails/100142290?image_type=NEUN&popup=true"
property domainURL : "https://connectivity.brain-map.org"
property curlCMDs : {}
tell application "Safari"
make new document with properties {URL:theURL}
my waitForSafariPageToFinishLoading()
delay 3 -- # In this case, an extra delay is needed even after page finishes loading.
tell document 1
set imageCount to ¬
(do JavaScript ¬
"document.getElementsByClassName('_ish_tnw_cell _ish_tnw_dark').length;") ¬
as integer
repeat with i from 0 to imageCount - 1
set foo to ¬
do JavaScript ¬
"document.getElementsByClassName('_ish_tnw_cell _ish_tnw_dark')['" & i & "'].innerHTML;"
my buildOutCURLcommands(foo, i)
end repeat
end tell
end tell
-- # Download the images of brain scans.
repeat with thisCMD in curlCMDs
do shell script thisCMD
delay (random number from 3 to 8)
end repeat
-- ## Handlers ##
to buildOutCURLcommands(foo, i)
tell current application
set AppleScript's text item delimiters to "\""
set imageURL to text item 6 of foo
set AppleScript's text item delimiters to "&"
set imageURL to text items of imageURL
set AppleScript's text item delimiters to "&"
set imageURL to imageURL as string
set AppleScript's text item delimiters to ""
set curlURL to quoted form of (domainURL & imageURL)
if n is less than 10 then
set i to "00" & i
set imageName to "Image_" & i
else if n is less than 100 then
set i to "0" & i
set imageName to "Image_" & i
else
set imageName to "Image_" & i
end if
copy ¬
"curl " & curlURL & " -o " & downloadsFolder & imageName & ".jpg" to ¬
the end of curlCMDs
end tell
end buildOutCURLcommands
to waitForSafariPageToFinishLoading()
-- # Wait for page to finish loading in Safari.
-- # This works in **macOS Catalina** and
-- # macOS Big Sur and may need adjusting for
-- # other versions of macOS.
tell application "System Events" to repeat until ¬
exists (buttons of groups of toolbar 1 of window 1 of ¬
process "Safari" whose name = "Reload this page")
delay 0.5
end repeat
end waitForSafariPageToFinishLoading
Notas:
Mirando como el código fuente del objetivo URL las imágenes están dispuestas en un tabla y como tal facilita la comprobación de las imágenes URL que se muestra como el valor de src=
en el HTML código de la células de la tabla .
Este script utilice AppleScript's text item delimiters
para analizar el HTML texto devuelto por el segundo do JavaScript ...
comando y, aunque en general el análisis sintáctico HTML debe ser realizado por aplicaciones/utilidades específicamente diseñado para hacerlo, sin embargo, en este caso de uso particular funciona como se pretende y por lo tanto se utiliza para llevar a cabo la tarea en cuestión.
El segundo do JavaScript ...
comando vuelve, por ejemplo:
"<img class=\"_ish_tnw_img\" id=\"_img_0_0\" src=\"/cgi-bin/imageservice?zoom=4&path=/external/connectivity/prod17/0500179232/0500179232.aff&top=61168&left=2176&width=228&height=181\" title=\"Position: 248\" _ish_tnw_index=\"0\" style=\"width: 153px;\">"
El buildOutCURLcommands(foo, i)
manipulador utiliza AppleScript's text item delimiters
para analizar el valor de foo
y hace lo siguiente:
- Obtenga la parte del URL que apunta al objetivo archivo de imagen de la valor de
foo
.
- Lo analiza en base a la
"
en el cadena de HTML texto conseguir la sexta artículo en el lista Por ejemplo: /cgi-bin/imageservice?zoom=4&path=/external/connectivity/prod17/0500179232/0500179232.aff&top=61168&left=2176&width=228&height=181
- Sustituye a
&
con &
por lo que el URL está bien formado.
- Acolcha el valor de
i
con ceros a la izquierda para que tenga tres dígitos para el nombre utilizado para la descarga archivo de imagen .
- Construye el
curl
comando mientras se añade al curlCMDs
lista que será ejecutado por un do shell script
comando .
Después de esta parte de la script ha terminado la descarga comienza y entonces puede hacer lo que quiera con Safari , sólo deja que script Editor seguir ejecutando el script hasta que termine.
Nota: El <em>ejemplo </em><strong>AppleScript </strong><em>código </em>es sólo eso y sin ningún tipo de inclusión <em>tratamiento de errores </em>no contiene ningún otro <em>tratamiento de errores </em>según corresponda. Corresponde al usuario añadir cualquier <em>tratamiento de errores </em>como sea apropiado, necesario o deseado. Eche un vistazo a la <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_control_statements.html#//apple_ref/doc/uid/TP40000983-CH6g-129232" rel="nofollow noreferrer"><strong>intente </strong></a><em>declaración </em>y <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_control_statements.html#//apple_ref/doc/uid/TP40000983-CH6g-129657" rel="nofollow noreferrer"><strong>error </strong></a><em>declaración </em>en el <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html" rel="nofollow noreferrer"><strong>Guía del lenguaje AppleScript </strong></a>. Véase también, <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_error_xmpls.html#//apple_ref/doc/uid/TP40000983-CH221-SW1" rel="nofollow noreferrer"><strong>Trabajar con errores </strong></a>. Además, el uso del <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html#//apple_ref/doc/uid/TP40000983-CH216-SW10" rel="nofollow noreferrer"><strong>retraso </strong></a><em>comando </em>puede ser necesario entre eventos cuando sea apropiado, por ejemplo <code>delay 0.5</code> con el <em>valor </em>de la <em>retraso </em>ajustado apropiadamente.
0 votos
Podrías