Minulla on suunnitteilla pieni ohjelma, joka noutaa tiedostoja Internetistä, ja haluaisin toteuttaa tämän jollain skriptikielellä, missä on helppokäyttöiset funktiot nettitoimintoja varten. Olen kuullut Pythonista ja Rubystä aikaisemmin, joten kumpaa te kokeneemmat skriptailijat suosittelisitte?
Tarkoitus on siis tällainen:
Käyttäjä kirjoittaa URL:n vaikka kuvaan. Esimerkkinä OP:n logo (https://www.ohjelmointiputka.net/img/putka.jpg). Ohjelma hakee OP:n logon ja tallentaa sen johonkin. Onnistuuko?
Muitakin kieliä saa toki ehdottaa.
Jos tiedostoa ei ole mahdollista ladata koneelle, olisi kiva edes, jos saisi tutkittua sen sisällön kuin PHP:n file_get_contents-funktiolla.
Mikset käytä wgetiä?
Pythonilla tiedoston haku sujuu ainakin melko helposti:
import urllib osoite = "https://www.ohjelmointiputka.net/img/putka.jpg" tiedosto = "netista.jpg" urllib.URLopener().retrieve(osoite, tiedosto)
Käyttäisin wgetiä, mutta ohjelman tärkeänä osana olisi tiedoston olemassaolon tiedostaminen.
Antti:
Jos tiedostoa ei ole olemassa, näyttääkö tuo funktio sen jotenkin?
Näin voi tutkia, onnistuiko tiedoston haku:
try: urllib.URLopener().retrieve(osoite, tiedosto) print 'Tiedosto haettu!' except StandardError: print 'Pieleen meni!'
Wgetin palautusarvosta näkee myös onnistuiko tiedoston lataus:
legu@Masiina:~$ wget https://www.ohjelmointiputka.net -O putka.html -q legu@Masiina:~$ echo $? 0 legu@Masiina:~$ wget https://www.ohjelmointiputka.net/eiole -O putka.html -q legu@Masiina:~$ echo $? 1
Ah, kiitos kummallekin!
Jonkimmoinen Ruby-esimerkki (itelläkin tässä manuaaleja n-kappaletta auki taustalla, voip olla hyvinkin elegantimpia tapoja olemassa):
require 'net/http' require 'uri' osoite = "https://www.ohjelmointiputka.net/img/putka.jpg" response = Net::HTTP.get_response(URI.parse(osoite)) if response.code == "200" then begin fh = File.open(File.basename(osoite), "wb") fh.write(response.entity) rescue puts "Tiedoston kopioiminen epäonnistui" else puts "Tiedosto kopioitiin onnistuneesti" ensure fh.close unless fh.nil? end else puts "Tiedostoa ei löydy serveriltä" end
Lyhyemmin:
require 'net/http' require 'uri' osoite = "https://www.ohjelmointiputka.net/img/putka.jpg" puts File.open(File.basename(osoite), "wb") { |fh| fh.write(Net::HTTP.get(URI.parse(osoite))) } ? "Onnistui" : "Epäonnistui"
Nyt en tiedä, että testaavatko python ja wget versiot molemmat tiedoston löytymistä serveriltä ja tiedoston kirjoituksen onnistumista - hyvä niille jos kyllä :3.
Aihe on jo aika vanha, joten et voi enää vastata siihen.