Fabulosa foto glamour


11

ingrese la descripción de la imagen aquí

Encontré esta imagen en la web hoy. Siendo un programador perezoso, no quiero abrir Google y escribir un par de caracteres. Demasiado trabajo! Esta es una tarea tan importante que debería automatizarse.

Desafío

Todos saben que la primera imagen en un resultado de búsqueda de Google es siempre la mejor. Por lo tanto, debe presentarse al usuario.

Debe escribir un programa o función que tome una cadena como parámetro y muestre la primera imagen que encuentre en Google cuando busque ese nombre + las palabras glamour shotdetrás de él.

Consultas de búsqueda de Google

Para buscar imágenes en Google, la url debe contener el parámetro de consulta tbm=ischy q=query, con queryel nombre que desea buscar.
Una cadena de consulta válida para mi nombre Basseríawww.google.com/search?tbm=isch&q=Bas

Entrada

Su programa o función toma un solo parámetro de entrada, que es el nombre que desea buscar en google. Esta cadena constará de los personajes [a-z], [A-Z], [0-9]y (espacio). Esta cadena puede estar separada por espacios, para buscar una cadena separada por espacios en Google, uno debe reemplazar los espacios con +. Por ejemplo, esta es una consulta válida:
www.google.com/search?tbm=isch&q=Bassdrop+Cumberwubwubwub+glamour+shot

Salida

La imagen puede dibujarse en la pantalla o guardarse en un archivo (en cualquier formato).
Si el primer resultado de búsqueda en google es un archivo gif, puede mostrar el gif o mostrar cualquier marco de ese gif.

Casos de prueba

Ejecute este fragmento para ver los resultados esperados.

Este es el , ¡el código más corto en bytes gana!


¿Qué caracteres se deben admitir en la entrada? ¿Debemos preocuparnos por la codificación de URL?
Martin Ender

@ Martin Ender [a-z0-9], editó mi publicación. Las URL se verán como los ejemplos que proporcioné, no se necesita codificación, solo espacio para+
Bassdrop Cumberwubwubwub

Supongo A-Zque también puede aparecer, a juzgar por tu ejemplo.
Martin Ender el

@ MartinEnder Sí, no distingue entre mayúsculas y minúsculas. Olvidé mencionar
Bassdrop Cumberwubwubwub

2
Hay un sorprendente número de personas posando con armas cuando juegas: D
Beta Decay

Respuestas:


8

PowerShell v4 +, 160 bytes

param($a)iwr (((iwr "google.com/search?tbm=isch&q=$($a-replace' ','+')+glamour+shot").links|?{$_.innerhtml-like"*$a*"})[0].innerhtml-split'"')[3] -outf "$a.jpg"

Toma la entrada $acomo una cadena. Hace un Invoke-WebRequest( iwr) a la ubicación apropiada de Google, usando el bloque de secuencia de comandos de la cadena interna para -replaceespacios con +la cadena de entrada. Tomamos el .linksde eso, donde .innerhtmles -likenuestra cadena de entrada. Eso produce los enlaces con la descripción en miniatura adecuada. Tome la primera [0]uno de ellos, tomar su .innerhtml y -spliten las citas. El cuarto [3]elemento es el texto dentro de la img src="porción, por lo que hacemos otro iwrsobre eso, especificando -outfque $a.jpgel archivo esté en la carpeta local. Dado que estas son solo las miniaturas generadas por Google, se garantiza que serán jpg.


1
puede cambiar a cabo google.comcon el google.nlde -1 bytes
Taylor de Scott

4

Excel VBA + , 465332 bytes

NOTA: utiliza referencias a

  • Biblioteca de objetos HTML de Microsoft
  • Controles de internet de Microsoft
  • Microsoft Scripting Runtime

Golfizado:

SubRutina completa que toma la entrada n(abreviatura de nombre) del tipo esperado Variant/Stringy genera el primer resultado de búsqueda de imágenes de Google para la consulta de ese nombre y glamour shoten una ventana de Internet Explorer.

Sub g(n)
Set i=New InternetExplorer
l="google.nl/search?tbm=isch&q="&Replace(n," ","+")&"+glamour+shot"
For y=0To 2
i.navigate l
While i.readyState<4
DoEvents
Wend
j=0
Do Until InStr(1,l,IIf(y,"yp","res"))
j=j+1
Set x=i.document.getElementsByTagName(IIf(y,"img","a"))(j)
If y Then l=x.src Else l=x.href
Loop
Next
i.visible=1
End Sub

-2 bytes para eliminar espacios en blanco en If InStr(1, a.href, "imgres") Then

-2 bytes para cambiar .navigate (a.href)a.navigate a.href

-27 bytes para reducir el for each a in ... if (...) then ... end if .. nextbucle ado until ... loop

-10 bytes para condensar imgresa resy encryptedayp

-8 bytes para la eliminación de initalizers para j, ky suponiendo módulo limpio

-1 byte para cambiar google.comagoogle.nl

-3 bytes para reemplazar Dim i as New ...conSet i=New ...

-8 bytes para eliminar SHDocVw.la referencia de clase

-12 bytes para eliminar el with ibloque

-7 bytes para eliminar i.quit: esto causa una pérdida de memoria al dejar Internet Explorer abierto en segundo plano, por lo que se recomienda que se use la versión completa no protegida o que la tarea de Internet Explorer se finalice a través del administrador de tareas después del uso

-6 bytes para pasar i.navigatea la subrutina auxiliarh

-13 bytes para pasar Do Until ... Loopa la subrutina auxiliar

-2 bytes moviéndose j=0a helper y eliminando ,j, ,0(x2)

-11 bytes para convertir a una función de ventana inmediata anónima

-8 bytes para reducir las llamadas de función auxiliar en el for .. nextbucle

-16 bytes para cambiar la salida del Sheets(1)objeto de imagen a mostrar a través del InternetExplorerobjeto

Sin Golf, 1304 Bytes

Option Private Module
Option Compare Text
Option Explicit
Option Base 0

Sub GlamourShot(ByVal name As String)

    Dim ie As New SHDocVw.InternetExplorer, _
        doc As MSHTML.HTMLDocument, _
        link As String, _
        j As Integer, _
        k As Integer

    With ie
        On Error GoTo CloseIE #'prevents memory leak

        Let .visible = True
        Call .navigate("www.google.com/search?tbm=isch&q=" & _
                    Replace(name, " ", "+") & _
                    "+glamour+shot")
        While .readyState <> READYSTATE_COMPLETE Or .Busy
            VBA.DoEvents
        Wend

        Set doc = .document

        Let j = 1
        Do Until InStr(1, link, "imgres") > 0
            Let link = doc.getElementsByTagName("a")(j).href
            Let j = j + 1
        Loop

        Call .navigate(link)
        While .readyState <> READYSTATE_COMPLETE Or .Busy
            VBA.DoEvents
        Wend

        Let k = 1
        Do Until InStr(1, link, "encrypted") > 0
            Let link = doc.getElementsByTagName("img")(k).src
            Let k = k + 1
        Loop

        With ThisWorkbook.ActiveSheet
            Call .Range("A1").Select
            Call .Pictures.Insert(link)
            Call .Activate
        End With
CloseIE:
        Call .Quit
    End With
End Sub

Gif de uso

Uso Gif


3

Vimperador , 30 pulsaciones de teclas

pgi<End> glamour shot<CR>fi222jf<CR>fim2

Alternativamente, 27 pulsaciones de teclas si no necesita la imagen de mayor resolución:

pgi<End> glamour shot<CR>fi222j;I<CR>

Video: https://youtu.be/t8824UjlYt8



Afortunadamente, el motor de búsqueda estándar en Firefox es google, y Vimperator le permite escribir sugerencias de forma predeterminada. Esto es más largo de lo necesario para asegurarse de que siempre funcione independientemente de lo que busque.

Toma entrada a través del portapapeles.

Explicación:

p             Google the contents of the clipboard
gi            Select the search box
<End>         Move the cursor to the end of the text
 glamour shot Type " glamour shot"
<CR>          Press enter to search
fi2           Click the second link that begins with the letter "i" (images)
22j           Go 22 scroll steps down on the page.
              This makes it so that the first row of images are at
              the very top of the screen.

f<CR>         Click the first clickable element, which is the
              first image because we scrolled down

fim2          Click the second link containing "im" (view image)

Gracias a @TaylorScott por encontrar un caso límite.


Hace esto casos mango cuando Google recomienda otros resultados de búsqueda al igual que los casos como éste
Taylor de Scott

@TaylorScott No lo hace, pero no puedo obtener recomendaciones en Firefox. ¿Podría depender del navegador?
BlackCap

1
No importa, los conseguí para una búsqueda diferente
BlackCap

3

Python 3.6, 247 242 232 quizás 224 bytes

Este es un lindo intento de resolver este. Guardará el archivo como p.pngen el directorio actual.

import sys; import requests as r; from bs4 import BeautifulSoup as s;
n = sys.argv[1]; open('p.png', 'wb').write(r.get(s(r.get(f'https://www.google.com.br/search?tbm=isch&q={n}+glamour+shot').content,'lxml').find_all('img')[1].get('src')).content)

Para ejecutarlo con facilidad desde la línea de comandos, simplemente coloque el contenido anterior en un archivo, como glamour.pyy ejecutar:

$ python glamour.py NAME_YOU_WANT

Actualización 1: Mejor versión con nueva url de google

import sys; import requests as r; from bs4 import BeautifulSoup as s;
n = sys.argv[1]; open('p.png', 'wb').write(r.get(s(r.get(f'http://www.google.nl/search?tbm=isch&q={n}+glamour+shot').content,'lxml').find_all('img')[1].get('src')).content)

Actualización 2:

Guardé algunos bytes:

  • Al importar solo la función get del módulo de solicitudes
  • aprovechando el nuevo findicador de interpolación de cadenas python 3.6 sin asignar el sys.argva una variable
  • eliminando algunos espacios en blanco
  • convirtiéndolo en una línea
  • eliminar la especificación del analizador de la BeautifulSoupllamada

El último es controvertido, ya que da como resultado un mensaje de salida estándar que le indica al programador que especifique el analizador para la compatibilidad multiplataforma, por lo que podría considerarse una salida no deseada.

Aquí está la versión de 224 bytes:

import sys;from requests import get;from bs4 import BeautifulSoup as s;open('p.png','wb').write(get(s(get(f'http://www.google.nl/search?tbm=isch&q={sys.argv[1]}+glamour+shot').content).find_all('img')[1].get('src')).content)

Aquí está la versión de 232 bytes:

import sys;from requests import get;from bs4 import BeautifulSoup as s;open('p.png','wb').write(get(s(get(f'http://www.google.nl/search?tbm=isch&q={sys.argv[1]}+glamour+shot').content, 'lxml').find_all('img')[1].get('src')).content)

Pero la versión más corta podría usarse si std.out se redirige a /dev/nullalgo o algo así: D


Probablemente podría tener una versión con urllib + html.parse para que pueda ejecutarse completamente con la biblioteca estándar.
Gui42

1
probablemente pueda usar www.google.nl/o tal vez incluso en google.nllugar de https://www.google.com.br/guardar algunos bytes
Taylor Scott

1
por alguna razón, tengo que mantenerlo http://para que funcione con las solicitudes. Pero el google brasileño me dio resultados más divertidos, así que
perdí

Hace esto casos mango cuando Google recomienda otros resultados de búsqueda al igual que los casos tales como este (puede que tenga que hacer múltiples búsquedas para obtener sugerencias de este tipo pop-up)
Taylor de Scott

También me gusta cómo me gano unos pocos bytes gracias a la n = 'something'; f'{n}_here'vez de n = 'something'; '{n}_here'.format(n = n)on = 'something'; '{}_here'.format(n)
Gui42

1

Raqueta, 284 byes

(require net/url html-parsing sxml racket/draw)(define(g n)(let([g(compose get-pure-port string->url string-append)])(make-object bitmap%(g(car((sxpath"//*[@id='ires']//@src/text()")(html->xexp(g"http://www.google.com/search?tbm=isch&q="(string-replace n" ""+")"+glamour+shot"))))))))

Captura de pantalla: ingrese la descripción de la imagen aquí

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.