Код Гольф Image Downloader


20

ПОПЕРЕДЖЕННЯ. Відповіді можуть бути корисними для деяких гольфістів з кодом.

У багатьох проблемах зображень публікація містить зображення, які потрібно зберегти у файл, щоб мати можливість працювати над проблемою. Це особливо виснажливе ручне завдання. Ми, програмісти, не повинні піддаватися такому жорстокості. Ваше завдання - автоматично завантажувати всі зображення, що містяться у запитанні Code Golf.SE.

Правила

  • Ваша програма може підключатися до будь-якої частини stackexchange.com, але може не підключатися до будь-яких інших доменів, за винятком розташування зображень (тобто, не турбуйтеся із скорочувачем URL-адрес).
  • Ціле число N подається у вигляді вводу, у командному рядку або stdin.
  • URL-адреса гарантовано є дійсним посиланням на питання Code Golf.http://codegolf.stackexchange.com/questions/N
  • Кожне зображення відображається в тілі питання N має бути збережено у файл на локальному комп'ютері. Будь-яке з наступних місць є прийнятним:
    • Поточний каталог
    • Введення користувачем каталогу
  • Ваша програма не повинна зберігати файли, крім зображень, в тілі запитання (наприклад, аватари користувачів або зображення, що містяться у відповідях).
  • Зображення потрібно зберігати з тим самим розширенням файлу, що і оригінал.

Це - пишіть найкоротшу програму, яку можете.

Критерій достовірності відповідей

Існують різні можливі крайові випадки з декількома зображеннями з однаковим іменем, текстом з тим самим іменем, що і HTML-елементи, і т.д. .


Якщо імена зображень мають бути однаковими чи ми можемо робити так, як 0.png, 1.png тощо
stokastic

@stokastic Ви можете назвати частину перед розширенням до того, що ви хочете (до тих пір, поки ви не будете використовувати одне і те ж ім’я двічі, перезаписавши попередній файл).
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"}
 ]

Це досить просто. Я встановив фільтр для API StackExchange, який повертає лише частину питання. Код отримує інформацію про питання з цим фільтром і аналізує його як JSON. Я вибираю правильний елемент (тіло) і використовую ImportStringдля розбору HTML і відфільтрування всіх URL-адрес зображень.FileNameTake@#~Export~Import@#потім завантажує кожне із зображень і зберігає їх у поточному робочому каталозі з тим самим ім'ям файлу, що і в URL-адресі.

Ви можете дізнатися поточний робочий каталог із Directory[].

В принципі, є набагато коротша версія, тому що ImportStringфактично можна завантажити всі файли відразу, а не просто надавати мені URL-адреси. Але тоді я втрачаю інформацію про оригінальний тип файлу (оскільки вони перетворюються на Imageоб’єкти при завантаженні), тому можу зберегти їх лише як одного типу (PNG, скажімо).


8

Javascript - 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

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:]) URL-адреси зображення, яке повинно зберігати своє ім'я з 5 символів та a .pngабо .jpgтощо. Це буде відсікати байти імені файлу, якщо розширення довше 3 символів .
стокастик

Що робити, якщо ім'я файлу коротше 9 байт? Чи не включатиме це косою рисою в ім'я файлу?
Мартін Ендер

ви можете зберегти 2 байти, зробивши forцикл одним рядком. for p re.findall(...):f=open(...);f.write(...)
підземниймонорельс

@mar Я не думаю, що ім'я файлу може бути менше 9 байт, але я можу помилитися
undergroundmonorail

@ MartinBüttner Я думаю, що 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[])

Це експортує зображення так само, як це робив Мартін у своєму рішенні Mathematica, читаючи його відповідь для отримання додаткової інформації про це. Цей підхід сильно відрізняється від його, замість того, щоб аналізувати результат з API, я безпосередньо аналізував сторінку HTML. А точніше, я розбираю символічний XML, який Mathematica може генерувати з HTML.


1

Python 2 - 398 342 334 байт

Програма завантажує сторінку SE, витягує частину публікації (елемент тексту після тексту), знаходить 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 символів шляхом заміни questionsз q(в URL).
Дверна ручка

У питанні 43274 я бачу лише 11 зображень, але 21 завантажено.
feersum

Моя програма завантажує 10 зображень з високою роздільною здатністю, а також 10 ескізів. Я не впевнений, що інші записи отримують версії з високою роздільною здатністю.
Логічний лицар

@Doorknob - спасибі Я пропустив це. Мені знадобиться набагато більше, хоча щоб спіймати інших хлопців.
Логічний лицар

1
@CarpetPython, хоча це, мабуть, корисніше ... намір специфікації полягав у завантаженні лише видимих ​​зображень.
feersum

1

Bash - 86 байт

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

Нічого wget не виправить. -npперешкоджає введенню wget у верхні каталоги (User Imgs) -Aлише захоплює файли з розширенням, що відповідає представленому списку. -rє рекурсивним завантаженням. -lзаважає wget заглиблюватися. $1це питання, щоб схопити.


1
Чи потрібно щось конкретно мені зробити для цього? Я спробував це на пару питань, але нічого хорошого. Виведіть тут .
Геобіт

1
Я думаю , що ожно зберегти 8 символів шляхом заміни questionsз qв 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 GETs таcheerio для розбору HTML. Зіткнення імен вирішуються, попередньо додавши індекс поточного зображення до базового імені 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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.