O'Reilly Hacks
oreilly.comO'Reilly NetworkSafari BookshelfConferences Sign In/My Account | View Cart   
Book List Learning Lab PDFs O'Reilly Gear Newsletters Press Room Jobs  


 
Buy the book!
Amazon Hacks
By Paul Bausch
August 2003
More Info

HACK
#93
Cache Amazon Images Locally
Caching product images locally can save your users several trips to the Amazon server and speed up your applications
The Code
[Discuss (1) | Link to this hack]

The Code

Each of these examples takes an ASIN, builds the proper URL , grabs the image, and saves it locally as [ASIN].jpg.

Perl

This uses the getstore( ) function of LWP::Simple to request and save the file. $rp is the return code, and to shore this function up you could take additional action if it's equal to 404.

use LWP::Simple;
$Asin = "0596004478";
$rp = getstore(
      "http://images.amazon.com/images/P/$Asin.01.MZZZZZZZ.jpg",&return;
      "$Asin.jpg");
VBScript

Writing binary files like images isn't quite as straightforward with VBScript, so you have to turn to some unusual components. The ServerXMLHTTP component makes the request, which is written to an ADODB stream. The ADODB component has the ability to write binary files.

strASIN = "0596004478"
strURL = "http://images.amazon.com/images/P/" & strASIN & _
         ".01.MZZZZZZZ.jpg"
strFile = strASIN & ".jpg"

'Get the Image
Set xmlhttp = CreateObject("Msxml2.SERVERXMLHTTP")
xmlhttp.Open "GET", strURL, false
xmlhttp.Send(Now)

'Create a Stream
Set adodbStream = CreateObject("ADODB.Stream")
    
'Open the stream
adodbStream.Open 
adodbStream.Type = 1 'adTypeBinary
adodbStream.Write xmlhttp.responseBody
adodbStream.SaveToFile strFile, 2 'adSaveCreateOverWrite
adodbStream.Close

Set adodbStream = Nothing
Set xmlhttp = Nothing

This code will run as a WSH file. Simply add Server. before the CreateObject commands to use this code in an ASP file.

PHP

The key to this PHP code is setting the fopen( ) function to read and write binary files. Note the rb (read binary) and wb (write binary) options.

$asin = "0596004478";
$url = "http://images.amazon.com/images/P/".$asin.".01.MZZZZZZZ.jpg";
$filedata = "";
$remoteimage = fopen($url, 'rb');
if ($remoteimage) {
    while(!feof($remoteimage)) {
           $filedata.= fread($remoteimage,1024);
    }
}
fclose($remoteimage);
$localimage = fopen($asin.".jpg", 'wb');
fwrite($localimage,$filedata);
fclose($localimage);
Python

As with PHP, be sure to set the file open command to wb (write binary) so it can save the file properly.

import urllib
asin = "0596004478"
url = 'http://images.amazon.com/images/P/' + asin + ".01.MZZZZZZZ.jpg"
filedata = urllib.urlopen(url).read(  )
f = open(asin + '.jpg', 'wb')
f.write(filedata)
f.close(  )

TIP

Amazon's license asks that you update any information you've cached from its servers every 24 hours. Check the Last Saved property of your local copy of the file before running any of these snippets; if it's longer than 24 hours, rerun the code to stay in compliance. (See http://www.amazon.com/gp/aws/license_agree.html.)


O'Reilly Home | Privacy Policy

© 2007 O'Reilly Media, Inc.
Website: | Customer Service: | Book issues:

All trademarks and registered trademarks appearing on oreilly.com are the property of their respective owners.