Code Golf图像下载器


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 2015年

@stokastic您可以将扩展名之前的部分命名为所需的名称(只要您两次不使用相同的名称,就覆盖先前的文件)。
feersum

Answers:


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:]图像url 的最后9个字节(),应保留其5个字符的名称以及a .png.jpgetc。如果扩展名超过3个字符,它将砍掉文件名的字节。
stokastic 2015年

如果文件名少于9个字节怎么办?文件名中不包括斜杠吗?
Martin Ender 2015年

您可以将for循环设为一行来节省2个字节。for p re.findall(...):f=open(...);f.write(...)
Undergroundmonorail

@mar我认为文件名不能少于9个字节,但我可能会误会了
Undergroundmonorail

@MartinBüttner我认为9字节是一个合理的假设,但是如果您认为应该的话,我可以更改它。对于它的价值-仅使用6或7个字节可能就足够了,并且仍然可以保证不同的文件名。
stokastic 2015年

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
您可以通过替换questionsq(在URL中)来节省8个字符。
门把手

在问题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不会解决。 -np防止wget进入上层目录(用户Imgs) -A仅获取扩展名与显示的列表匹配的文件。-r是递归下载。-l防止wget太深。$1是要抓住的问题。


1
我需要做一些特定的事情才能使它起作用吗?我试了几个问题,但是不好。在这里输出。
Geobits,2015年

1
我想,您可以同时通过更换保存8个字符questionsq在URL中。
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)))})})

用于request制作HTTP GETcheerio解析HTML。通过将当前图像的索引添加到文件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堆栈交换允许属性的(对吗?)。

另请注意.. ...。我为此感到特别自豪。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.