コードゴルフイメージダウンローダー


20

警告:一部のコードゴルファーには回答が役立つ場合があります。

多くの課題では、投稿に画像が含まれており、問題に取り組むために画像をファイルに保存する必要があります。これは特に面倒な手作業です。私たちプログラマーはそのような面倒な作業にさらされる必要はないはずです。あなたの仕事は、Code Golf.SEの質問に含まれるすべての画像を自動的にダウンロードすることです。

ルール

  • プログラムはのどの部分にも接続できstackexchange.comますが、画像の場所を除き、他のドメインには接続できません(URL短縮機能を使用しないでください)。
  • 整数Nは、コマンドラインまたはstdinで入力として指定されます。
  • URL は、Code Golfの質問への有効なリンクであることが保証されています。http://codegolf.stackexchange.com/questions/N
  • 質問Nの本文に表示される各画像は、ローカルコンピューター上のファイルに保存する必要があります。次の場所のいずれかを使用できます。
    • 現在のディレクトリ
    • ユーザーが入力したディレクトリ
  • プログラムでは、質問本文の画像以外のファイル(ユーザーアバターや回答に含まれる画像など)を保存しないでください。
  • 画像はオリジナルと同じファイル拡張子で保存する必要があります。

これはです。できる限り短いプログラムを書いてください。

回答の妥当性基準

同じ名前の複数の画像、HTML要素と同じ名前のテキストなど、さまざまな可能性のあるエッジケースがあります。回答は、2015年1月10日以前に投稿された質問の一部の改訂で失敗することが示される場合にのみ無効になります。


画像名を同じにするか、0.png、
1.png

@stokastic拡張子の前の部分に好きな名前を付けることができます(同じ名前を2回使用しない限り、以前のファイルを上書きします)。
feersum

回答:


10

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

ゴルフをしていない:

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として解析します。正しい要素(本文)を選択しImportString、HTMLを解析してすべての画像URLを除外するために使用します。FileNameTake@#~Export~Import@#次に、各画像をダウンロードし、URL内のファイル名と同じファイル名で現在の作業ディレクトリに保存します。

現在の作業ディレクトリはで確認できますDirectory[]

原則としてImportString、URLを提供するだけでなく、実際にすべてのファイルをすぐにダウンロードできるため、かなり短いバージョンがあります。しかし、その後、元のファイルタイプに関する情報が失われます(Imageダウンロード時にオブジェクトに変換されるため)。すべて同じタイプ(PNGなど)としてのみ保存できます。


8

Javascript- 149161バイト

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

スクリプトを実行するには、stackexchangeサイトから実行する必要があります。プロンプトで質問番号が指定されていない場合、デフォルトで現在のページになります


1
上記の@doorknobで述べたように、質問のためにqを交換することで少し節約できます。そして、ページの投稿にあるすべての画像を取得することを気にしないのであれば、$('[src*="imgur"]',d)私は信じることができます。私はこれがコンソールで実行できることを気に入っています-すぐに満足します。
ジョサイア

1
questionsに短縮できますが、そのページにいることに依存する代わりにq、そのcodegolf.stackexchange.com部分を含める必要があります。@Josiahは、他のドメインの画像を投稿に含めることができます。
feersum

1
セレクタ#question .post-text img.post-text:first imgまたはに短縮できます.post-text:eq(0) img
cPu1

5

Python 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バイト(とされる-ファイル名はそのまま保持されます[-9:])画像その5文字の名前を維持しなければならないURLの.png.jpgなどの拡張子が長い3文字以上である場合には、ファイル名のバイト切り落とすます。
確率論的

ファイル名が9バイトより短い場合はどうなりますか?ファイル名にスラッシュが含まれていませんか?
マーティンエンダー

forループを1行にすることで2バイトを節約できます。for p re.findall(...):f=open(...);f.write(...)
地下

@marファイル名が9バイト未満になることはないと思いますが、間違っているかもしれません
-undergroundmonorail

@MartinBüttner9バイトは妥当な仮定だと思いますが、あなたがそうすべきだと思うなら、それを変更できます。価値があるのは、たった6または7バイトを使用するだけで十分であり、それでも異なるファイル名をかなり保証します。
確率論的

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[])

これは、MartinがMathematicaソリューションで行ったのと同じ方法で画像をエクスポートします。詳細については、彼の答えを読んでください。このアプローチは、APIからの結果を解析するのではなく、HTMLページを直接解析するという彼の手法とは大きく異なります。むしろ、MathematicaがHTMLから生成できるシンボリックXMLを解析します。


1

パイソン2 - 398の 342 334バイト

このプログラムは、SEページをダウンロードし、投稿部分(post-text div要素)を抽出し、画像拡張子で終わるURLを見つけてダウンロードします。画像は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個がダウンロードされます。
-feersum

私のプログラムは、10個の高解像度画像と10個のサムネイルをダウンロードします。他のエントリが高解像度バージョンを取得するかどうかわかりません。
ロジックナイト

@Doorknob-ありがとう。私は逃しました。しかし、他の人を捕まえるためにはもっと必要です。
ロジックナイト

1
@CarpetPythonはほぼ間違いなく便利ですが、仕様の意図は、表示されている画像のみをダウンロードすることでした。
feersum

1

バッシュ-86バイト

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

wgetは何も修正しません。 -npwgetが上位ディレクトリ(ユーザーImgs)に入るのを防ぎ -A、表示されたリストに一致する拡張子を持つファイルのみを取得します。-r再帰的なダウンロードです。-lwgetが深くなりすぎないようにします。$1つかむべき質問です。


1
これが機能するために私がする必要がある特定の何かがありますか?いくつかの質問で試してみましたが、よくありません。ここに出力します
ジオビット

1
私は、OUを置き換えることにより、8つの文字を保存することができると思うquestionsqURLに。
ティムテック

1

Node.js、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

Lua、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ます(右?)。

また注意してください .. ...。私はそのことを特に誇りに思っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.