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 easiest way
to save an image locally is to visit the product detail page,
right-click on the image, and choose "Save Picture As . . . ". Of
course, "easy" is relative. If you have to do this for hundreds of
products, suddenly it's the hard way.
Luckily, every programming environment has methods for retrieving an
image from a remote server and saving it as a local file.
93.1 The Code
Each of these examples takes an ASIN, builds the proper URL [Hack #5], 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( )
|
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.)
|
|
|