Kod Golf Resim İndirici


20

UYARI: Yanıtlar bazı kod meraklıları için yararlı olabilir.

Birçok zorluğunda yazı, sorun üzerinde çalışabilmek için bir dosyaya kaydedilmesi gereken görüntüler içerir. Bu özellikle sıkıcı bir manuel görevdir. Biz programcıların böyle bir yargılamaya maruz kalmamaları gerekir. Göreviniz bir Code Golf.SE sorusunda bulunan tüm görüntüleri otomatik olarak indirmektir.

kurallar

  • Programınız stackexchange.com, görüntülerin konumları hariç, başka bir alana bağlanabilir, ancak başka alanlara bağlanmayabilir (yani, bir URL kısaltmasıyla uğraşmayın).
  • Tam sayı bir N komut hattı veya stdin, girdi olarak verilir.
  • URL'nin , Code Golf sorusuna geçerli bir bağlantı olması garanti edilir.http://codegolf.stackexchange.com/questions/N
  • Soru N'nin gövdesinde görüntülenen her görüntü , yerel bilgisayardaki bir dosyaya kaydedilmelidir. Aşağıdaki konumlardan biri kabul edilebilir:
    • Geçerli dizin
    • Kullanıcı tarafından bir dizin girişi
  • Programınız, soru gövdesindeki resimlerden (örneğin kullanıcı avatarları veya yanıtlarda bulunan resimler) başka dosyalar kaydetmemelidir.
  • Görüntüler orijinal dosya ile aynı dosya uzantısıyla kaydedilmelidir.

Bu bir - yapabileceğiniz en kısa programı yazın.

Cevaplar için geçerlilik kriteri

Aynı adda birden çok görüntüye, HTML öğeleriyle aynı ada sahip metne vb. Sahip çeşitli olası kenar durumlar vardır. Bir yanıt yalnızca 10 Ocak 2015'ten önce gönderilen bir sorunun bazı düzeltmelerinde başarısız olduğu gösterilebiliyorsa geçersiz kılınır. .


Resim adları aynı tutulmalı veya 0.png, 1.png vb. Yapabilir miyiz
stokastic

@stokastic Uzantıdan önceki parçayı istediğiniz herhangi bir adla adlandırabilirsiniz (aynı adı iki kez kullanmadığınız, önceki bir dosyanın üzerine yazdığınız sürece).
feersum

Yanıtlar:


10

Mathematica, 211 210 bayt

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"}
 ]

Oldukça basit. Ben sadece bir soru gövdesi döndüren StackExchange API için bir filtre kurdum . Kod, bu filtreyle birlikte soru bilgilerini alır ve JSON olarak ayrıştırır. Doğru öğeyi (gövde) seçiyorum ve ImportStringHTML'yi ayrıştırmak ve tüm resim URL'lerini filtrelemek için kullanıyorum . FileNameTake@#~Export~Import@#daha sonra görüntülerin her birini indirir ve URL'deki ile aynı dosya adına sahip geçerli çalışma dizininde saklar.

Geçerli çalışma dizinini ile bulabilirsiniz Directory[].

Prensip olarak, çok daha kısa bir sürüm var, çünkü ImportStringbana sadece URL'leri vermek yerine tüm dosyaları hemen indirebilir. Ama sonra orijinal dosya türü hakkında bilgi kaybettim ( Imageindirildikten sonra nesnelere dönüştürüldüklerinden ), böylece hepsini aynı türden (PNG, diyelim) kaydedebilirim.


8

Javascript - 149 161 bayt

$.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()})})

boşluklu

$.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();
  })
})

betiğin çalışması için stackexchange sitesinden çalıştırılması gerekir. Bilgi isteminde herhangi bir soru numarası belirtilmezse, geçerli sayfa varsayılan olarak


1
@Doorknob'un yukarıda belirtildiği gibi, soru için q değiştirerek biraz tasarruf edebilirsiniz. Ve sayfadaki yayınlardaki tüm resimleri almanın sakıncası yoksa, $('[src*="imgur"]',d)inanıyorum. Bunun konsolda çalıştırılabilmesini seviyorum - anında tatmin.
Josiah

1
questionskısaltılabilir q, ancak o codegolf.stackexchange.comsayfada olmaya güvenmek yerine parçayı içermelidir . @Josiah, yayınlara diğer alan adlarından resimler eklemek mümkündür.
feersum

1
Seçici #question .post-text imgiçin kısaltılabilir .post-text:first imgya da .post-text:eq(0) img.
cPu1

5

Python 2-241 bayt

Oldukça basit, muhtemelen daha fazla golf olabilir. Ben tüm oluşumları için sitede arama img src=ilk geçtiği arasındaki post-textve /divhemen o aşağıdaki. Her resim url'si okunur ve çalışma dizinine kaydedilir.

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())

Dosya adları olduğu gibi tutulur - ad, [-9:]5 karakter adını ve a .pngveya .jpgvb. Olması gereken resim URL'sinin son 9 baytı ( ) olarak alınır . Uzantı 3 karakterden uzunsa dosya adının baytını keser. .
stokastic

Dosya adı 9 bayttan kısaysa ne olur? Bu dosya adında eğik çizgi içermez mi?
Martin Ender

fordöngüyü bir satır yaparak 2 bayt kaydedebilirsiniz . for p re.findall(...):f=open(...);f.write(...)
undergroundmonorail

@mar Dosya adının 9 bayttan az olabileceğini sanmıyorum, ama yanılmış olabilirim
undergroundmonorail

@ MartinBüttner Sanırım 9 bayt makul bir varsayımdır, ancak yapmam gerektiğini düşünüyorsanız değiştirebilirim. Değer için - sadece 6 veya 7 bayt kullanmak muhtemelen yeterlidir ve yine de farklı dosya adlarını garanti eder.
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[])

Bu, Martin'in Mathematica çözümünde yaptığı gibi görüntüleri dışa aktarır, bunun hakkında daha fazla bilgi için cevabını okur. Bu yaklaşım ondan çok farklı, sonucu API'dan ayrıştırmak yerine doğrudan HTML sayfasını ayrıştırıyorum. Daha doğrusu, Mathematica'nın HTML'den oluşturabildiği sembolik XML'i ayrıştırıyorum.


1

Python 2 - 398 342 334 bayt

Program SE sayfasını indirir, yazı bölümünü (metin sonrası div öğesi) çıkarır, bir resim uzantısında biten URL'leri bulur ve indirir. Görüntüler img<n>.<ext>geçerli dizindeki gibi kaydedilir .

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

Bu program ayrıca yalnızca gömülü görüntüleri değil, bağlantı olarak sağlanan görüntüleri de indirir. Her görüntüye benzersiz bir dosya adı vererek ad çakışmaları da önlenir.


2
(URL'de) questionsile değiştirerek 8 karakter kaydedebilirsiniz q.
Kapı tokmağı

Soru 43274'te yalnızca 11 resim görüyorum, ancak 21 tanesi indirildi.
feersum

Programım 10 yüksek çözünürlüklü görüntüyü ve 10 küçük resmi indirir. Diğer girişlerin yüksek çözünürlüklü sürümleri aldığından emin değilim.
Mantık Şövalyesi

@Doorknob - teşekkürler. Onu özledim. Diğer adamları yakalamak için çok daha fazlasına ihtiyacım olacak.
Mantık Şövalyesi

1
@CarpetPython her ne kadar tartışmasız daha kullanışlı olsa da ... spesifikasyonun amacı sadece görünen görüntüleri indirmekti.
feersum

1

Bash - 86 bayt

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

Hiçbir şey düzeltmeyecek. -npwget'in üst dizinlere (Kullanıcı Imgs) girmesini engeller, -Ayalnızca sunulan listeyle eşleşen uzantıya sahip dosyaları alır. -ryinelemeli bir indirme. -lwget'in çok derine inmesini önler. $1sorulacak.


1
Bunun çalışması için yapmam gereken özel bir şey var mı? Birkaç soru üzerinde denedim, ama iyi değil. Buradan çıktı .
Geobits

1
URL questionsile değiştirerek 8 karakter kaydedebilirsiniz düşünüyorum q.
Timtech

1

Node.js, 251 247 bayt

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)))})})

HTTP'leri requestyapmak GETve cheerioHTML'yi ayrıştırmak için kullanır . Ad çakışmaları, geçerli resmin dizini dosyanın URL'sinin taban adına eklenerek çözülür. Görüntüler geçerli dosyayla aynı dizine kaydedilir.


1

Lua, 200 bayt

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)

Sayıyı komut satırı bağımsız değişkeni olarak kabul eder.

src=Bir imgetiket için herhangi bir özelliğin olacağını varsayar , çünkü bunlar srcyığın değişiminin izin verdiği özelliklere sahip tek etiketlerdir (değil mi?).

Ayrıca .. .... Bununla gurur duyuyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.