Code Golf Image Downloader


20

ATTENZIONE: le risposte possono essere utili ad alcuni golfisti di codici.

In molte sfide di delle immagini, il post contiene immagini che devono essere salvate in un file per poter risolvere il problema. Questo è un compito manuale particolarmente noioso. Noi programmatori non dovremmo essere soggetti a tale fatica. Il tuo compito è scaricare automaticamente tutte le immagini contenute in una domanda di Code Golf.SE.

Regole

  • Il tuo programma può connettersi a qualsiasi parte di stackexchange.com, ma potrebbe non connettersi ad altri domini, ad eccezione delle posizioni delle immagini (ad esempio, non preoccuparti di un accorciatore di URL).
  • Un numero intero N viene fornito come input, sulla riga comandi o stdin.
  • L'URL è garantito per essere un collegamento valido a una domanda di Code Golf.http://codegolf.stackexchange.com/questions/N
  • Ogni immagine visualizzata nel corpo della domanda N deve essere salvata in un file sul computer locale. È accettabile una delle seguenti posizioni:
    • La directory corrente
    • Una directory immessa dall'utente
  • Il tuo programma non deve salvare file diversi dalle immagini nel corpo della domanda (ad es. Avatar dell'utente o immagini contenute nelle risposte).
  • Le immagini devono essere salvate con la stessa estensione di file dell'originale.

Questo è un : scrivi il programma più corto che puoi.

Criterio di validità per le risposte

Esistono vari casi limite con più immagini con lo stesso nome, testo con lo stesso nome di elementi HTML, ecc. Una risposta verrà invalidata solo se si può dimostrare che fallisce in qualche revisione di una domanda pubblicata prima del 10 gennaio 2015 .


Se i nomi delle immagini dovessero essere uguali o possiamo fare come 0.png, 1.png ecc.
stokastic

@stokastic È possibile assegnare un nome alla parte prima dell'estensione come desiderato (purché non si usi lo stesso nome due volte, sovrascrivendo un file precedente).
feersum,

Risposte:


10

Mathematica, 211 210 byte

i=Import;FileNameTake@#~Export~i@#&/@ImportString["body"/.("items"/.i["http://api.stackexchange.com/2.2/questions/"<>InputString[]<>"?site=codegolf&filter=!*Lgp.gEWHA6BNP.l","JSON"])[[1]],{"HTML","ImageLinks"}]

Ungolfed:

i = Import;
FileNameTake@#~Export~i@# & /@ 
 ImportString[
  "body" /. (
    "items" /. 
      i["http://api.stackexchange.com/2.2/questions/" <> 
        InputString[] <> "?site=codegolf&filter=!*Lgp.gEWHA6BNP.l", 
       "JSON"]
  )[[1]], 
  {"HTML", "ImageLinks"}
 ]

È abbastanza semplice. Ho impostato un filtro per l'API StackExchange, che restituisce solo il corpo di una domanda. Il codice recupera le informazioni sulla domanda con quel filtro e le analizza come JSON. Seleziono l'elemento corretto (il corpo) e utilizzo ImportStringper analizzare l'HTML e filtrare tutti gli URL delle immagini. FileNameTake@#~Export~Import@#quindi scarica ciascuna delle immagini e la memorizza nella directory di lavoro corrente con lo stesso nome file dell'URL.

Puoi scoprire l'attuale directory di lavoro con Directory[].

In linea di principio, esiste una versione molto più breve, perché ImportStringpuò effettivamente scaricare immediatamente tutti i file, invece di darmi solo gli URL. Ma poi perdo informazioni sul tipo di file originale (dal momento che vengono convertiti in Imageoggetti al momento del download), quindi posso solo salvarli tutti dello stesso tipo (PNG, diciamo).


8

Javascript - 149 161 byte

$.get("http://codegolf.stackexchange.com/q/"+prompt(),function(e){$(".post-text:first img",e).each(function(e,t){$('<a href="'+t.src+'"download>')[0].click()})})

con spazi bianchi

$.get('http://codegolf.stackexchange.com/q/' + prompt(), function(d) {
  $('.post-text:first img',d).each(function(i,e){
   $('<a href="' + e.src + '"download>')[0].click();
  })
})

lo script deve essere eseguito dal sito stackexchange per funzionare. Passerà automaticamente alla pagina corrente se non viene specificato un numero di domanda nel prompt


1
Come sopra menzionato da @doorknob, puoi salvare un po 'scambiando q per domande. E se non ti dispiace ottenere tutte le immagini nei post sulla pagina, puoi $('[src*="imgur"]',d)crederci. Mi piace che questo possa essere eseguito nella console: gratificazione istantanea.
Giosia

1
questionspuò essere abbreviato q, ma dovrebbe includere la codegolf.stackexchange.comparte invece di affidarsi a quella pagina. @Josiah è possibile includere immagini di altri domini nei post.
feerum

1
Il selettore #question .post-text imgpuò essere ridotto a .post-text:first imgo .post-text:eq(0) img.
cPu1

5

Python 2 - 241 byte

Abbastanza semplice, probabilmente può essere ulteriormente giocato a golf. Cerco nel sito tutte le occorrenze img src=tra la prima occorrenza post-texte quella /divimmediatamente successiva. Ogni URL immagine viene quindi letto e salvato nella directory di lavoro.

import string,sys,urllib,re;o=string.find;u=urllib.urlopen
r=u("http://codegolf.stackexchange.com/q/"+sys.argv[1]).read()
i=o(r,"post-text")
for p in re.findall(r'img src="([^"]*)',r[i:o(r,"/div",i)]):f=open(p[-9:],"wb");f.write(u(p).read())

I nomi dei file vengono mantenuti così come sono: il nome viene preso come gli ultimi 9 byte ( [-9:]) dell'URL dell'immagine, che dovrebbe mantenere il nome di 5 caratteri e un .pngo .jpgecc. Se il file ha una lunghezza superiore a 3 caratteri, eliminerà i byte del nome del file .
stokastic

Cosa succede se il nome del file è inferiore a 9 byte? Non includerebbe una barra nel nome del file?
Martin Ender,

puoi salvare 2 byte rendendo il forciclo di una riga. for p re.findall(...):f=open(...);f.write(...)
undergroundmonorail,

@mar Non credo che il nome del file possa essere inferiore a 9 byte, ma potrei sbagliarmi
undergroundmonorail

@ MartinBüttner Penso che 9 byte sia un presupposto ragionevole, ma posso cambiarlo se pensi che dovrei. Per quello che vale: l'utilizzo di soli 6 o 7 byte è probabilmente sufficiente e garantirà comunque nomi di file distinti.
stokastic

2

Mathematica, 195

x=XMLElement;c=Cases;i=Import;l=Infinity;FileNameTake@#~Export~i@#&/@(((c[#,x["img",{"src"->e_,_},___]:>e,l]&)@*(c[#,x[_,{__,"id"->"question",__},e_]:>e,l]&)@*(i[#,"XMLObject"] &))@InputString[])

Questo esporta immagini nello stesso modo di Martin nella sua soluzione Mathematica, leggi la sua risposta per ulteriori informazioni a riguardo. Questo approccio è molto diverso dal suo, invece di analizzare il risultato dall'API analizzo direttamente la pagina HTML. O meglio, analizzo l'XML simbolico che Mathematica può generare da HTML.


1

Python 2 - 398 342 334 byte

Il programma scarica la pagina SE, estrae la parte post (l'elemento div post-text), trova gli URL che terminano in un'estensione di immagine e li scarica. Le immagini vengono salvate come img<n>.<ext>nella directory corrente.

import urllib2 as u,re,sys
z=u.urlopen;i=1
p=z('http://codegolf.stackexchange.com/q/'+sys.argv[1]).read()
s=re.search(r'ss="po(.+?)/di',p,16).group(1)
for L in re.findall('"(h.+?://.*?)"',s):
 b=L.rsplit('.',1)
 if len(b)==2 and b[1].lower() in 'jpg jpeg png gif bmp'.split():
  open('img%u.%s'%(i,b[1]),'wb').write(z(L).read());i+=1

Questo programma scaricherà anche le immagini fornite come collegamento, non solo le immagini incorporate. Dando a ogni immagine un nome file univoco, si evitano anche gli scontri con i nomi.


2
Puoi salvare 8 caratteri sostituendoli questionscon q(nell'URL).
Maniglia della porta

Nella domanda 43274, vedo solo 11 immagini, ma 21 vengono scaricate.
feerum,

Il mio programma scarica le 10 immagini ad alta risoluzione e le 10 miniature. Non sono sicuro che le altre voci recuperino le versioni ad alta risoluzione.
Logic Knight,

@Doorknob - grazie. Ho perso questo. Avrò bisogno di molto di più però per catturare gli altri ragazzi.
Logic Knight,

1
@CarpetPython anche se è probabilmente più utile ... l'intenzione della specifica era di scaricare solo le immagini che sono visibili.
feersum,

1

Bash - 86 byte

wget -r -l1 -np -Ajpg,jpeg,png,bmp,gif http://codegolf.stackexchange.com/questions/$1

Niente che wget non risolverà. -npimpedisce a wget di accedere alle directory superiori (User Imgs) -Asolo afferra i file con l'estensione corrispondente all'elenco presentato. -rè un download ricorsivo. -limpedisce a wget di andare troppo in profondità. $1è la domanda da prendere.


1
C'è qualcosa di specifico che devo fare affinché questo funzioni? L'ho provato su un paio di domande, ma non va bene. Uscita qui .
Geobits il

1
Penso che puoi salvare 8 caratteri sostituendoli questionscon qnell'URL.
Timtech,

1

Node.js, 251 247 byte

r=require,g=r('request'),g('http://codegolf.stackexchange.com/q/'+process.argv[2],function(_,_,b){r('cheerio').load(b)('#question .post-text img').each(function(i,a){s=a.attribs.src,g(s).pipe(r('fs').createWriteStream(i+r('path').basename(s)))})})

Utilizza requestper creare HTTP GETe cheerioper analizzare l'HTML. Le collisioni di nomi vengono risolte anteponendo l'indice dell'immagine corrente al nome di base dell'URL del file. Le immagini vengono salvate nella stessa directory del file corrente.


1

Lua, 200 byte

r=require'socket.http'.request r('http://codegolf.stackexchange.com/questions/'.. ...):gsub('post.text(.-)div',function(p)p:gsub('src="(.-)"',function(i)io.open(i:sub(-9),'wb'):write((r(i)))end)end)

Accetta il numero come argomento della riga di comando.

Presuppone che qualsiasi src=attributo sarà per un imgtag poiché questi sono gli unici tag consrc attributi consentiti scambio di stack (giusto?).

Notare anche il .. .... Ne sono particolarmente orgoglioso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.