Seite 1 von 1

Bild von Amazon downloaden

Verfasst: Montag 11. Mai 2009, 19:14
von spartacus
Hallo

Ich hab ein kleines Projekt am laufen, das schlussendlich die Covers meiner Musiksammlung downloaden soll. Nun bin ich soweit, dass die Suche auf Amazon funktioniert. Dazu gebrauche ich das pyaws Modul. Mit Hilfe dieses Moduls bekomme ich unter anderem die Titel der Resultate und die URLs. Nun sollte es doch möglich sein, das Bild, das jeweils bei den Ergebnisse angezeigt wird, herunterzuladen. Nur habe ich keine Ahnung wie ich mit Python auf einer Webside herum navigieren kann. Kann mir jemand Module oder irgendwelche HowTos schreiben, die das ermöglichen?


Gruss spartacus

Verfasst: Montag 11. Mai 2009, 19:49
von nemomuk
Warum willst du rumnavigieren, wenn du sowieso nur das Bild willst, dass bei den Suchergebnissen angezeigt wird? Ich habe mir den Quelltext der Seite nicht angesehen, aber ich gehe davon aus, dass alle Bilder einer gleichen CSS Klasse angehören. Diese musst du herausfinden und kannst dann über diese das Bild und dessen Link ansprechen.

Verfasst: Montag 11. Mai 2009, 20:21
von spartacus
Mhm... Da hast du eigentlich recht. Ich hab mir nun mal den Quelltext der Seite angeschaut. Da find ich unter anderem diesen abschnitt:

Code: Alles auswählen

<script>
  registerImage("original_image", "http://ecx.images-amazon.com/images/I/41OdgqctDjL._SL500_AA240_.jpg", "<a href="+'"'+"http://www.amazon.de/gp/product/images/B0017HOHTA/sr=8-1/qid=1242068402/ref=dp_image_0?ie=UTF8&n=290380&s=music&qid=1242068402&sr=8-1"+'"'+" target="+'"'+"AmazonHelp"+'"'+" onclick="+'"'+"return amz_js_PopWin(this.href,'AmazonHelp','width=700,height=600,resizable=1,scrollbars=1,toolbar=1,status=1');"+'"'+"  ><img onload="+'"'+"if (typeof uet == 'function') { uet('af'); }"+'"'+" src="+'"'+"http://ecx.images-amazon.com/images/I/41OdgqctDjL._SL500_AA240_.jpg"+'"'+" id="+'"'+"prodImage"+'"'+" width="+'"'+"240"+'"'+" height="+'"'+"240"+'"'+" border="+'"'+"0"+'"'+" alt="+'"'+"Kanonen auf Spatzen - 28 Live Songs (2CD + DVD)"+'"'+"  /></a>", "<br /><a href="+'"'+"http://www.amazon.de/gp/product/images/B0017HOHTA/sr=8-1/qid=1242068402/ref=dp_image_text_0?ie=UTF8&n=290380&s=music&qid=1242068402&sr=8-1"+'"'+" target="+'"'+"AmazonHelp"+'"'+" onclick="+'"'+"return amz_js_PopWin(this.href,'AmazonHelp','width=700,height=600,resizable=1,scrollbars=1,toolbar=1,status=1');"+'"'+"  >Mehr Bilder ansehen</a>");
</script>
Die direkte URL zum Bild wäre
http://ecx.images-amazon.com/images/I/4 ... SS400_.jpg

Diese kommt in diesem Abschnitt auch vor. Nur wie bekomme ich diese URL daraus?

Verfasst: Montag 11. Mai 2009, 20:32
von nemomuk
Ich habe mir mal die Mühe gemacht... (nicht zuletzt weil ich Beatsteaks mag)

Code: Alles auswählen

<div class="productImage"><a href="http://www.amazon.de/Kanonen-auf-Spatzen-Live-Songs/dp/B0017HOHTA/ref=sr_1_1?ie=UTF8&s=music&qid=1242070231&sr=8-1"> <img src="http://ecx.images-amazon.com/images/I/41OdgqctDjL._SL160_AA115_.jpg" class="" alt="Produkt-Information" border="0" height="115" width="115"> </a></div>
Das sollte ja eigentlich reichen.

Verfasst: Montag 11. Mai 2009, 20:40
von problembär
Hi,

um irgendwas mit Python runterzuladen, hab' ich neulich mal folgende Funktion geschrieben:

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

import os
import sys

import urllib2

def downloadNSaveFile(site, fpath, fname, verbose = False):

    fpath = fpath.strip("/")
    fname = fname.strip("/")

    wwwname = os.path.join(site, fpath, fname)
    localname = os.path.join(os.getcwd(), fpath, fname) 
    localdir = os.path.join(os.getcwd(), fpath)

    if os.path.isfile(localname):
        if verbose:
            print localname + " already exists."
        return "already exists"
        
    try:
        ht = urllib2.urlopen(wwwname)
    except:
        print wwwname + " not found."
        return "not found"

    if not os.path.isdir(localdir):
        os.makedirs(localdir)

    fh = file(localname, "wb")
    fh.write(ht.read())
    fh.close()
    ht.close()

    if verbose:
        print localname + " fetched."

    return "fetched"


downloadNSaveFile("http://www.someurl.com",
                  "somedirectory/somemoredirectory",
                  "file.jpg",
                  verbose = True)
HTH

Verfasst: Montag 11. Mai 2009, 20:50
von spartacus
@problembär
Das Problem ist eigentlich nicht der Download ansich, sondern das Herausfinden des Namen des files und somit der URL. Aber eine nette Funktion. Werde mir sicher was abkupfern.

@SchneiderWeisse
Leider habe ich keine Ahnung von HTML und wie ich HTML in Python einbinden kann. Ich weiss nicht einmal was dein Code macht. Kannst du mir eine kurze Erklärung abgeben?

Verfasst: Montag 11. Mai 2009, 20:57
von nemomuk
Der Code macht gar nichts, das ist lediglich der "Container" für das Bild. Jetzt musst du nur noch mit einem HTML-Parser wie zB BeautifulSoup auf dieses Element zugreifen und hast den Bildpfad. Da es mehrere dieser Klasen (da mehrere Bilder) gibt musst du nur noch über diese iterieren und downloaden.

Verfasst: Montag 11. Mai 2009, 21:03
von spartacus
Ok... dann werd ich mal diese Sache angehen. Vielen dank für deine Hilfe.

spartacus

Verfasst: Montag 11. Mai 2009, 22:06
von problembär
spartakus hat geschrieben:Das Problem ist ... das Herausfinden ... der URL.
spartakus hat geschrieben:Mit Hilfe dieses Moduls bekomme ich unter anderem die Titel der Resultate und die URLs.
Widerspricht sich irgendwie :roll:.

Gruß

Verfasst: Montag 11. Mai 2009, 23:14
von ichbinsisyphos
Ich lad mir meistens den Quelltext in eine Variable und such die links mit re. Reicht das nicht?

Verfasst: Montag 11. Mai 2009, 23:30
von derdon
Nicht nur das. Es ist sogar der beste Weg, den jeder Profi hier empfiehlt! Aber das weißt du ja sicherlich schon, weil du seit fast 2 Jahren hier registriert bist. Seitdem hast du bestimmt alle Threads hier aufmerksam mitverfolgt und dabei mitgedacht.

Edit: Ich bin hochnäsig und arrogant!

Verfasst: Dienstag 12. Mai 2009, 06:40
von Barabbas
Warum nicht direkt eine Abfrage via AWS (neuerdings heißt das wohl PAA :?: ):

http://ecs.amazonaws.de/onca/xml?Servic ... Beatsteaks

Das gibt - wenn man eine valide subscription-id in die url eingefügt hat - ein XML Dokument zurück, das man bequem parsen kann: http://paste.bitbin.de/f73969c07

Das ist m.E. verlässlicher und man kann noch zwischen verschiedenen Covergrößen etc. wählen.

Einen schönen Generator für solche Requests gab es immer hier. Die Seite scheint aber gerade nicht aufrufbar zu sein.

lG

dsn

Verfasst: Dienstag 12. Mai 2009, 12:26
von ichbinsisyphos
derdon hat geschrieben:Nicht nur das. Es ist sogar der beste Weg, den jeder Profi hier empfiehlt! Aber das weißt du ja sicherlich schon, weil du seit fast 2 Jahren hier registriert bist. Seitdem hast du bestimmt alle Threads hier aufmerksam mitverfolgt und dabei mitgedacht.

Edit: Ich bin hochnäsig und arrogant!
Check ich nicht. Schreib am besten nochmal in Klartext.

Sarkasmus is sicher drin, aber schwer zu sagen, was wirklich sarkastisch gemeint war und was nicht.

Verfasst: Dienstag 12. Mai 2009, 12:28
von derdon
ichbinsisyphos hat geschrieben:Sarkasmus is sicher drin, aber schwer zu sagen, was wirklich sarkastisch gemeint war und was nicht.
So bin ich eben :wink:

Verfasst: Dienstag 12. Mai 2009, 12:54
von EyDu
ichbinsisyphos hat geschrieben:
derdon hat geschrieben:Nicht nur das. Es ist sogar der beste Weg, den jeder Profi hier empfiehlt! Aber das weißt du ja sicherlich schon, weil du seit fast 2 Jahren hier registriert bist. Seitdem hast du bestimmt alle Threads hier aufmerksam mitverfolgt und dabei mitgedacht.

Edit: Ich bin hochnäsig und arrogant!
Check ich nicht. Schreib am besten nochmal in Klartext.
Er wollte damit zum Ausdruck bringen, dass du du einen HTML/XML-Parser benutzen sollst und keine Regulären Ausdrücke.

Verfasst: Dienstag 12. Mai 2009, 19:07
von spartacus
@Problembär
Ich bekomme den Link zur Suchergebniss. Auf dieser Seite ist dann das Bild vom Cover. Somit fehlt mir aber immer noch den direkten Link zum Bild.

Hab aber nun die Lösung gefunden. Das Modul pyAWS bietet alle funktionen, nur habe ich diese leider übersehen.

Code: Alles auswählen

import ecs

ecs.setLocale("de")             #Auf der deutschen Seite suchen                       
ecs.setLicenseKey("XXXXXXXXXXXXX")       #License-Key eingeben

#Suche starten:
cd = ecs.ItemSearch("Beatsteaks",  SearchIndex='Music',  ResponseGroup ='Medium,Images,ItemAttributes,Request,EditorialReview,Subjects')
print cd[1].LargeImage.URL      #Ausgabe der Cover-URL

Verfasst: Mittwoch 13. Mai 2009, 04:56
von ichbinsisyphos
EyDu hat geschrieben:
ichbinsisyphos hat geschrieben:
derdon hat geschrieben:Nicht nur das. Es ist sogar der beste Weg, den jeder Profi hier empfiehlt! Aber das weißt du ja sicherlich schon, weil du seit fast 2 Jahren hier registriert bist. Seitdem hast du bestimmt alle Threads hier aufmerksam mitverfolgt und dabei mitgedacht.

Edit: Ich bin hochnäsig und arrogant!
Check ich nicht. Schreib am besten nochmal in Klartext.
Er wollte damit zum Ausdruck bringen, dass du du einen HTML/XML-Parser benutzen sollst und keine Regulären Ausdrücke.
Hat er aber nicht.