Fabelhafter Glamour-Shot

11

Geben Sie hier die Bildbeschreibung ein

Fand dieses Bild heute im Web. Als fauler Programmierer möchte ich Google nicht öffnen und ein paar Zeichen eingeben. Viel zu viel Arbeit! Dies ist eine so wichtige Aufgabe, dass sie automatisiert werden sollte.

Herausforderung

Jeder weiß, dass das erste Bild in einem Google-Suchergebnis immer das beste ist. Daher sollte es dem Benutzer präsentiert werden.

Sie müssen ein Programm oder eine Funktion schreiben, die eine Zeichenfolge als Parameter verwendet und das erste Bild anzeigt, das bei Google gefunden wird, wenn Sie nach diesem Namen + den Wörtern glamour shotdahinter suchen .

Google-Suchanfragen

Um bei Google nach Bildern zu suchen, sollte die URL den Abfrageparameter tbm=ischund den Namen enthalten q=query, querynach dem Sie suchen möchten.
Eine gültige Abfragezeichenfolge für meinen Namen Baswärewww.google.com/search?tbm=isch&q=Bas

Eingang

Ihr Programm oder Ihre Funktion verwendet einen einzelnen Eingabeparameter. Dies ist der Name, nach dem Sie bei Google suchen möchten. Diese Zeichenkette wird aus den Zeichen [a-z], [A-Z], [0-9]und (Raum). Diese Zeichenfolge kann durch Leerzeichen getrennt werden. Um bei Google nach einer durch Leerzeichen getrennten Zeichenfolge zu suchen, sollten die Leerzeichen durch ersetzt werden +. Dies ist beispielsweise eine gültige Abfrage:
www.google.com/search?tbm=isch&q=Bassdrop+Cumberwubwubwub+glamour+shot

Ausgabe

Das Bild kann entweder auf den Bildschirm gezeichnet oder in einer Datei (in einem beliebigen Format) gespeichert werden.
Wenn das erste Suchergebnis bei Google eine GIF-Datei ist, können Sie entweder das GIF oder einen beliebigen Frame dieses Gifs anzeigen.

Testfälle

Führen Sie dieses Snippet aus, um die erwarteten Ergebnisse anzuzeigen

Dies ist , kürzester Code in Bytes gewinnt!

Bassdrop Cumberwubwubwub
quelle
Welche Zeichen müssen bei der Eingabe unterstützt werden? Müssen wir uns um die URL-Codierung kümmern?
Martin Ender
@ Martin Ender [a-z0-9], hat meinen Beitrag bearbeitet. Die URLs sehen aus wie die Beispiele, die ich bereitgestellt habe, keine Codierung erforderlich, nur Platz für+
Bassdrop Cumberwubwubwub
Ich denke, A-Zkann auch erscheinen, nach Ihrem Beispiel zu urteilen?
Martin Ender
@MartinEnder Ja, die Groß- und Kleinschreibung wird nicht berücksichtigt.
Vergessen
2
Es gibt eine überraschende Anzahl von Leuten, die mit Waffen posieren, wenn Sie dieses Spiel spielen: D
Beta Decay

Antworten:

8

PowerShell v4 +, 160 Byte

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"

Nimmt die Eingabe $aals Zeichenfolge auf. Führt ein Invoke-WebRequest( iwr) zum entsprechenden Google-Speicherort aus, indem ein Skriptblock mit innerer Zeichenfolge für -replaceLeerzeichen +in der Eingabezeichenfolge verwendet wird. Wir nehmen das , .linksdass, wo das .innerhtmlist -likeunser Eingabestring. Das ergibt die Links mit der richtigen Thumbnail-Beschreibung. Nehmen Sie die erste [0]einer von denen, nehmen seine .innerhtml und -splites auf Zitate. Das vierte [3]Element ist der Text innerhalb des img src="Abschnitts, also machen wir einen anderen iwr, indem wir -outfangeben , dass sich die Datei $a.jpgim lokalen Ordner befindet. Da dies nur die von Google generierten Miniaturansichten sind, handelt es sich garantiert um JPG.

AdmBorkBork
quelle
1
Sie können google.commit google.nlfür -1 Byte wechseln
Taylor Scott
4

Excel VBA + , 465 332 Bytes

HINWEIS: Verwendet Verweise auf

  • Microsoft HTML-Objektbibliothek
  • Microsoft Internet Controls
  • Microsoft Scripting Runtime

Golf:

Vollständige SubRoutine, die Eingaben n(kurz für Name) des erwarteten Typs verwendet Variant/Stringund das erste Google-Bildsuchergebnis für die Abfrage dieses Namens und glamour shotin ein Internet Explorer-Fenster ausgibt .

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 zum Entfernen von Leerzeichen in If InStr(1, a.href, "imgres") Then

-2 Bytes zum Wechseln .navigate (a.href)zu.navigate a.href

-27 Bytes zum Reduzieren der for each a in ... if (...) then ... end if .. nextSchleife aufdo until ... loop

-10 Bytes für die Kondensation imgresnach resund encryptednachyp

-8 Bytes für initalizers zum Entfernen j, kund unter der Annahme sauber Modul

-1 Byte zum Wechseln google.comzugoogle.nl

-3 Bytes zum Ersetzen Dim i as New ...durchSet i=New ...

-8 Bytes zum Entfernen der SHDocVw.Klassenreferenz

-12 Bytes zum Entfernen des with iBlocks

-7 Bytes zum Entfernen i.quit- Dies führt zu einem Speicherverlust, indem der Internet Explorer im Hintergrund geöffnet bleibt. Daher wird empfohlen, stattdessen entweder die vollständige ungolfed-Version zu verwenden oder die Internet Explorer-Aufgabe nach der Verwendung über den Task-Manager zu beenden

-6 Bytes zum Verschieben i.navigatein die Hilfsunterroutineh

-13 Bytes zum Verschieben Do Until ... Loopin die Hilfsunterroutine

-2 Bytes , die durch Bewegen j=0in der Helfer- und Entfernen ,j, ,0(x2)

-11 Bytes für die Konvertierung in eine anonyme Sofortfensterfunktion

-8 Bytes zum Reduzieren von Hilfsfunktionsaufrufen in for .. nextSchleife

-16 Bytes zum Ändern der Ausgabe vom Sheets(1)Bildobjekt zur Anzeige über das InternetExplorerObjekt

Ungolfed, 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

Verwendung gif

Verwendung Gif

Taylor Scott
quelle
3

Vimperator , 30 Tastenanschläge

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

Alternativ 27 Tastenanschläge, wenn Sie nicht das Bild mit der höchsten Auflösung benötigen:

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

Video: https://youtu.be/t8824UjlYt8



Glücklicherweise ist die Standardsuchmaschine in Firefox Google, und mit Vimperator können Sie standardmäßig Hinweise eingeben. Dies ist länger als nötig, um sicherzustellen, dass es immer funktioniert, unabhängig davon, wonach Sie suchen.

Nimmt Eingaben über die Zwischenablage vor.

Erläuterung:

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)

Vielen Dank an @TaylorScott für die Suche nach einem Edge Case.

BlackCap
quelle
Behandelt dies Fälle, in denen Google andere Suchergebnisse empfiehlt, wie dies auch
Taylor Scott,
@ TaylorScott Das tut es nicht, aber ich kann keine Empfehlungen in Firefox erhalten. Könnte es browserabhängig sein?
BlackCap
1
Egal, ich habe sie für eine andere Suche bekommen
BlackCap
3

Python 3.6, 247 242 232 vielleicht 224 Bytes

Dies ist ein süßer Versuch, dieses Problem zu lösen. Die Datei wird wie p.pngim aktuellen Verzeichnis gespeichert .

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)

Um es mit Leichtigkeit von der Kommandozeile ausgeführt wird , legen Sie einfach den obigen Inhalt in einer Datei, wie glamour.pyund Lauf:

$ python glamour.py NAME_YOU_WANT

Update 1: Bessere Version mit neuer Google URL

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)

Update 2:

Ich habe ein paar Bytes gespeichert:

  • Indem Sie nur die Funktion get aus dem Anforderungsmodul importieren
  • Nutzen Sie das neue Python 3.6-String-Interpolationsflag, fohne das sys.argveiner Variablen zuzuweisen
  • einige Leerzeichen beseitigen
  • verwandeln es in einen Einzeiler
  • Entfernen der Parser-Spezifikation aus dem BeautifulSoupAufruf

Der letzte ist umstritten, da er zu einer Standardausgabemeldung führt, in der der Programmierer aufgefordert wird, den Parser für die plattformübergreifende Kompatibilität anzugeben, sodass er möglicherweise als unerwünschte Ausgabe angesehen wird.

Hier ist die 224-Byte-Version:

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)

Hier ist die 232-Byte-Version:

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)

Die kürzere Version kann jedoch verwendet werden, wenn std.out umgeleitet wird /dev/nulloder so: D.

Gui42
quelle
Ich könnte wahrscheinlich eine Version mit urllib + html.parse haben, damit sie vollständig mit der Standardbibliothek ausgeführt werden kann.
Gui42
1
Sie können wahrscheinlich verwenden www.google.nl/oder sogar, google.nlanstatt https://www.google.com.br/einige Bytes zu speichern
Taylor Scott
1
Aus irgendeinem Grund muss ich es behalten, http://damit es mit Anfragen funktioniert. Aber die brasilianische Google gab mir lustigere Ergebnisse, so dass ich auf lustige Punkte
verliere
Behandelt dies Fälle, in denen Google andere Suchergebnisse empfiehlt, wie dies auch der Fall ist (möglicherweise müssen Sie mehrere Suchvorgänge durchführen, um Vorschläge wie diesen zu erhalten)
Taylor Scott,
Ich liebe auch, wie ich ein paar Bytes dank der n = 'something'; f'{n}_here'anstelle von n = 'something'; '{n}_here'.format(n = n)odern = 'something'; '{}_here'.format(n)
Gui42
1

Schläger, 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"))))))))

Bildschirmfoto: Geben Sie hier die Bildbeschreibung ein

Geoff Reedy
quelle