कोड गोल्फ छवि डाउनलोडर


20

चेतावनी: उत्तर कुछ कोड गोल्फरों के लिए उपयोगी हो सकते हैं।

कई चुनौतियों में, पोस्ट में छवियां होती हैं, जिन्हें समस्या पर काम करने में सक्षम होने के लिए एक फ़ाइल में सहेजा जाना चाहिए। यह विशेष रूप से थकाऊ मैनुअल कार्य है। हमें प्रोग्रामर को इस तरह के नशे के अधीन नहीं होना चाहिए। आपका कार्य स्वचालित रूप से एक कोड गोल्फ में निहित सभी छवियों को डाउनलोड करना है। एक प्रश्न।

नियम

  • आपका कार्यक्रम किसी भी हिस्से से stackexchange.comकनेक्ट हो सकता है, लेकिन छवियों के स्थानों को छोड़कर (यानी, एक यूआरएल शॉर्टनर के साथ परेशान न करें) किसी अन्य डोमेन से कनेक्ट नहीं हो सकता है।
  • कमांड लाइन या स्टड पर एक पूर्णांक एन इनपुट के रूप में दिया जाता है।
  • URL को एक कोड गोल्फ प्रश्न का एक वैध लिंक होने की गारंटी है।http://codegolf.stackexchange.com/questions/N
  • सवाल एन के शरीर में प्रदर्शित प्रत्येक छवि को स्थानीय कंप्यूटर पर एक फ़ाइल में सहेजा जाना चाहिए। निम्नलिखित में से कोई एक स्थान स्वीकार्य है:
    • वर्तमान निर्देशिका
    • उपयोगकर्ता द्वारा निर्देशिका इनपुट
  • आपका प्रोग्राम प्रश्न बॉडी में छवियों के अलावा अन्य फ़ाइलों को सहेजना नहीं चाहिए (उदाहरण के लिए उपयोगकर्ता अवतार, या उत्तर में निहित चित्र)।
  • छवियों को मूल के रूप में एक ही फ़ाइल एक्सटेंशन के साथ सहेजा जाना चाहिए।

यह एक - सबसे छोटा प्रोग्राम जो आप कर सकते हैं लिखें।

जवाब के लिए वैधता मानदंड

एक ही नाम की कई छवियों के साथ विभिन्न संभावित किनारे के मामले हैं, HTML तत्वों के समान नाम के साथ पाठ, आदि। एक उत्तर केवल तभी अमान्य होगा जब इसे 10 जनवरी 2015 से पहले पोस्ट किए गए किसी प्रश्न के कुछ संशोधन में विफल दिखाया जा सके। ।


क्या छवि के नाम समान रखे जा सकते हैं या हम 0.png, 1.png आदि की तरह कर सकते हैं
स्टोकैस्टिक

@stokastic आप जिस चीज को चाहते हैं उसे एक्सटेंशन से पहले नाम दे सकते हैं (जब तक आप एक ही नाम का उपयोग दो बार नहीं करते हैं, पिछली फ़ाइल को ओवरराइट कर रहे हैं)।
feersum

जवाबों:


10

गणितज्ञ, 211 210 बाइट्स

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

यह बहुत सीधा है। मैंने StackExchange API के लिए एक फ़िल्टर सेट किया है, जो केवल एक प्रश्न का शरीर देता है। कोड उस फ़िल्टर के साथ प्रश्न सूचना को पुनः प्राप्त करता है और इसे JSON के रूप में पार्स करता है। मैं सही तत्व (निकाय) का चयन करता हूं, और ImportStringHTML को पार्स करने के लिए उपयोग करता हूं और सभी छवि URL को फ़िल्टर करता हूं । FileNameTake@#~Export~Import@#फिर प्रत्येक छवियों को डाउनलोड करता है और वर्तमान कार्यशील निर्देशिका में URL में उसी फ़ाइल नाम के साथ संग्रहीत करता है।

आप के साथ वर्तमान कार्य निर्देशिका का पता लगा सकते हैं Directory[]

सिद्धांत रूप में, एक बहुत छोटा संस्करण है, क्योंकि ImportStringवास्तव में केवल मुझे यूआरएल देने के बजाय सभी फाइलों को तुरंत डाउनलोड कर सकते हैं। लेकिन फिर मैं मूल फ़ाइल प्रकार के बारे में जानकारी खो देता हूं (क्योंकि वे Imageडाउनलोड होने पर वस्तुओं में परिवर्तित हो जाते हैं ), इसलिए मैं केवल उन सभी को एक ही प्रकार (पीएनजी, कहता हूं) के रूप में सहेज सकता हूं।


8

जावास्क्रिप्ट - 149 161 बाइट्स

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

व्हॉट्सएप के साथ

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

स्क्रिप्ट को स्टेक्सएक्सचेंज साइट से काम करने के लिए चलाना पड़ता है। वर्तमान पृष्ठ पर डिफ़ॉल्ट होगा यदि कोई प्रश्न संख्या संकेत में निर्दिष्ट नहीं है


1
जैसा कि @doorknob ऊपर उल्लेख किया गया है, आप प्रश्न के लिए q को स्वैप करके थोड़ा बचा सकते हैं। और अगर आपको पेज पर मौजूद पोस्टों में सभी चित्र प्राप्त करने में कोई आपत्ति नहीं है, तो आप $('[src*="imgur"]',d)मुझे विश्वास कर सकते हैं । मुझे यह पसंद है कि यह कंसोल में चलाया जा सकता है - तत्काल संतुष्टि।
योशिय्याह

1
questionsको छोटा किया जा सकता है q, लेकिन इसमें codegolf.stackexchange.comउस पृष्ठ पर निर्भर होने के बजाय भाग को शामिल करना चाहिए । @ जोशियाह पोस्ट में अन्य डोमेन से छवियों को शामिल करना संभव है।
feersum

1
चयनकर्ता #question .post-text imgको छोटा किया जा सकता .post-text:first imgया .post-text:eq(0) img
cPu1

5

पायथन 2 - 241 बाइट्स

बहुत सीधा, शायद आगे गोल्फ हो सकता है। मैं img src=पहली घटना के तुरंत बाद post-textऔर उसके /divबाद की सभी घटनाओं के लिए साइट खोजता हूं । प्रत्येक छवि url को तब कार्यशील निर्देशिका में पढ़ा और सहेजा जाता है।

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

फ़ाइलनाम इस प्रकार रखे जाते हैं - नाम को [-9:]छवि url के अंतिम 9 बाइट्स ( ) के रूप में लिया जाता है , जिसे अपना 5 वर्ण नाम और .pngया रखना चाहिए .jpg। यदि एक्सटेंशन 3 वर्णों से अधिक है, तो यह फ़ाइल नाम के बाइट्स को काट देगा। ।
स्टोकेस्टिक 16

यदि फ़ाइल का नाम 9 बाइट्स से कम है तो क्या होगा? फ़ाइल नाम में एक स्लैश शामिल नहीं होगा?
मार्टिन एंडर

आप forलूप को एक पंक्ति बनाकर 2 बाइट्स बचा सकते हैं । for p re.findall(...):f=open(...);f.write(...)
भूमिगत

@ मुझे नहीं लगता कि फ़ाइल का नाम 9 बाइट्स से कम हो सकता है, लेकिन मुझसे गलती हो सकती है
भूमिगत

@ मार्टिनबटनर मुझे लगता है कि 9 बाइट्स एक उचित धारणा है, लेकिन अगर आपको लगता है कि मुझे चाहिए तो मैं इसे बदल सकता हूं। इसके लायक क्या है - केवल 6 या 7 बाइट्स का उपयोग करना संभवतः पर्याप्त है और अभी भी बहुत अलग फ़ाइल नामों की गारंटी देगा।
स्टोकैस्टिक

2

मैथमेटिका, 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[])

यह उसी तरह से छवियों का निर्यात करता है जिस तरह से मार्टिन ने अपने गणितज्ञ समाधान में किया था, उस बारे में अधिक जानकारी के लिए उसका जवाब पढ़ें। यह दृष्टिकोण उनके द्वारा बहुत अलग है, एपीआई आई के परिणाम को सीधे पृष्ठ पृष्ठ को पार्स करने के बजाय। या बल्कि, मैं प्रतीकात्मक XML पार्स करता हूं जो कि HTML से Mathematica उत्पन्न कर सकता है।


1

पायथन 2 - 398 342 334 बाइट्स

कार्यक्रम एसई पृष्ठ को डाउनलोड करता है, पोस्ट भाग (पोस्ट-टेक्स्ट डिव तत्व) को निकालता है, उन यूआरएल को ढूंढता है जो एक छवि विस्तार में समाप्त होते हैं और उन्हें डाउनलोड करते हैं। चित्र img<n>.<ext>वर्तमान निर्देशिका में सहेजे गए हैं ।

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

यह कार्यक्रम उन छवियों को भी डाउनलोड करेगा जो एक लिंक के रूप में आपूर्ति की जाती हैं, न केवल एम्बेडेड चित्र। प्रत्येक छवि को एक अद्वितीय फ़ाइल नाम देने से, नाम के टकराव से भी बचा जाता है।


2
(URL में) के questionsसाथ बदलकर आप 8 वर्णों को बचा सकते हैं q
दरवाज़े

प्रश्न 43274 में, मुझे केवल 11 चित्र दिखाई देते हैं, लेकिन 21 डाउनलोड किए जाते हैं।
फ़ेरसम

मेरा कार्यक्रम 10 उच्च संकल्प छवियों और साथ ही 10 थंबनेल डाउनलोड करता है। मुझे यकीन नहीं है कि अन्य प्रविष्टियाँ उच्च रिज़ॉल्यूशन संस्करण लाएगी।
लॉजिक नाइट

@ डॉर्कनोब - धन्यवाद। मैंने यह खो दिया। मुझे अन्य लोगों को पकड़ने के लिए और अधिक की आवश्यकता होगी।
लॉजिक नाइट

1
@CarpetPython हालांकि यह यकीनन अधिक उपयोगी है ... कल्पना का उद्देश्य केवल उन छवियों को डाउनलोड करना था जो दिखाई दे रहे हैं।
feersum

1

बैश - 86 बाइट्स

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

कुछ भी ठीक नहीं होगा। -npऊपरी निर्देशिकाओं (उपयोगकर्ता Imgs) में प्रवेश से छूट को रोकता है -Aकेवल प्रस्तुत की गई सूची से मेल खाते के विस्तार के साथ फाइलें पकड़ लेता है। -rएक पुनरावर्ती डाउनलोड है। -lबहुत गहरे तक जाने से रोकता है। $1हड़पने का सवाल है।


1
क्या काम करने के लिए मुझे कुछ विशिष्ट करने की आवश्यकता है? मैंने इसे कुछ प्रश्नों पर आज़माया, लेकिन कोई अच्छा नहीं। यहाँ आउटपुट ।
Geobits

1
मुझे लगता है कि कहां की जगह 8 वर्ण बचा सकता है questionsके साथ qURL में।
टाइमटेक

1

नोड.जेएस, 251 247 बाइट्स

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

requestHTTP को बनाने GETऔर cheerioHTML को पार्स करने के लिए उपयोग करता है । नाम की टक्कर वर्तमान छवि के सूचकांक को फ़ाइल के URL के बेसनेम में शामिल करके हल की जाती है। छवियाँ वर्तमान फ़ाइल के समान निर्देशिका में सहेजी जाती हैं।


1

लुआ, 200 बाइट्स

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)

कमांड-लाइन तर्क के रूप में संख्या को स्वीकार करता है।

किसी भी src=विशेषता को एक imgटैग के लिए माना जाता है क्योंकि ये एकमात्र टैग हैं जिनमें srcविशेषताओं के साथ स्टैक एक्सचेंज की अनुमति देता है (दाएं?)।

ध्यान भी दें .. ...। मुझे उस पर विशेष गर्व है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.