코드 골프 이미지 다운로더


20

경고 : 답변은 일부 코드 골퍼에게 유용 할 수 있습니다.

많은 문제에서 게시물에 이미지가 포함되어 있으며, 이미지는 문제를 해결하기 위해 파일로 저장해야합니다. 이것은 특히 지루한 수동 작업입니다. 우리 프로그래머들은 그런 혼란에 빠질 필요가 없습니다. 귀하의 작업은 Code Golf.SE 질문에 포함 된 모든 이미지를 자동으로 다운로드하는 것입니다.

규칙

  • 프로그램은의 일부 stackexchange.com에는 연결할 수 있지만 이미지의 위치를 ​​제외하고 다른 도메인에는 연결할 수 없습니다 (예 : URL 단축기를 사용하지 않음).
  • 명령 행 또는 stdin에 정수 N 이 입력으로 제공됩니다.
  • URL 은 Code Golf 질문에 대한 유효한 링크 여야합니다.http://codegolf.stackexchange.com/questions/N
  • 질문 N 의 본문에 표시된 각 이미지 는 로컬 컴퓨터의 파일에 저장해야합니다. 다음 위치 중 하나가 허용됩니다.
    • 현재 디렉토리
    • 사용자가 입력 한 디렉토리
  • 프로그램은 질문 본문의 이미지 이외의 파일 (예 : 사용자 아바타 또는 답변에 포함 된 이미지)을 저장해서는 안됩니다.
  • 이미지는 원본과 동일한 파일 확장자로 저장해야합니다.

이것은 입니다. 가능한 가장 짧은 프로그램을 작성하십시오.

답변의 유효성 기준

이름이 같은 여러 이미지, HTML 요소와 이름이 같은 텍스트 등 다양한 엣지 사례가 있습니다. 2015 년 1 월 10 일 이전에 게시 된 질문의 일부 개정에 실패한 경우에만 답변이 무효화됩니다. .


이미지 이름을 동일하게 유지하거나 0.png, 1.png 등으로 할 수 있다면
stokastic

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

언 골프 드 :

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

원칙적으로 ImportStringURL이 아닌 모든 파일을 실제로 다운로드 할 수 있기 때문에 버전이 훨씬 짧습니다 . 그러나 원본 파일 형식에 대한 정보가 손실됩니다 ( Image다운로드 할 때 객체 로 변환되기 때문에 ). 동일한 형식 (PNG, say)으로 만 저장할 수 있습니다.


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

스크립트가 작동하려면 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

파이썬 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 자 이상의 경우 등은 그것은 파일 이름의 바이트를 잘라 것 .
stokastic 2016 년

파일 이름이 9 바이트보다 짧은 경우 어떻게합니까? 파일 이름에 슬래시가 포함되어 있지 않습니까?
마틴 엔더

for루프를 한 줄로 만들어 2 바이트를 절약 할 수 있습니다 . for p re.findall(...):f=open(...);f.write(...)
undergroundmonorail

@mar 나는 파일 이름이 9 바이트보다 작을 수 있다고 생각하지 않지만, 오해 할 수도있다
undergroundmonorail

@ MartinBüttner 나는 9 바이트가 합리적인 가정이라고 생각하지만, 내가 생각한다고 생각하면 변경할 수 있습니다. 가치있는 것은 6 바이트 또는 7 바이트 만 사용하면 충분하고 여전히 고유 한 파일 이름을 보장합니다.
stokastic 2016 년

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

이것은 Martin이 Mathematica 솔루션에서했던 것과 같은 방식으로 이미지를 내보내고 이에 대한 자세한 정보는 그의 답변을 읽습니다. 이 접근법은 API의 결과를 구문 분석하는 대신 HTML 페이지를 직접 구문 분석하는 것과는 매우 다릅니다. 또는 Mathematica가 HTML에서 생성 할 수있는 상징적 인 XML을 구문 분석합니다.


1

파이썬 2 - (398) 342 334 바이트

이 프로그램은 SE 페이지를 다운로드하고 포스트 부분 (포스트 텍스트 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
당신은 대체하여 8 개 문자를 저장할 수 있습니다 questionsq(URL에).
Doorknob

질문 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

아무것도 얻을 수 없습니다. -npwget이 상위 디렉토리를 입력하지 못하게합니다 (User Imgs) -A. 표시된 목록과 일치하는 확장자를 가진 파일 만 가져옵니다 . -r재귀 다운로드입니다. -lwget이 너무 깊어지지 않도록합니다. $1잡아야 할 질문입니다.


1
이 작업을 수행하기 위해 수행해야 할 특정 사항이 있습니까? 몇 가지 질문에 시도했지만 좋지 않습니다. 여기에 출력 하십시오 .
Geobits

1
나는 OU는 대체하여 8 개 문자를 저장할 수 있다고 생각 questionsqURL에.
Timtech

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 만들 GETs와 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(오른쪽?).

또한 참고하십시오 .. .... 나는 그 점을 특히 자랑스럽게 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.