Hack 84 Work Around Products Without Images

figs/expert.giffigs/hack84.gif

Those few items that don't have images can be pesky if your application depends on them. The key to weeding out the bad ones is byte size.

Amazon's product database contains millions of items, so it's not surprising that a few of them don't have images. The lack of images can be a problem if your application relies on them. AWS responses don't tell you if an image doesn't exist; in fact, AWS always returns an image URL, but in some cases the image is a single-pixel transparent GIF instead of a picture of the product. For many applications, using the invisible, single-pixel GIF won't be a problem. But if you're watching every pixel and your application works within a strict design, you'll want to find a way to work around this problem.

Although AWS responses don't directly say whether a product has an image or not, they do let you know indirectly. The image at the other end of the image URL will be considerably smaller if it's a single-pixel GIF. With a quick HTTP request, you can find the image byte size and know if it's big or small.

84.1 What You Need

The function can be used in any ASP script; these run on Windows servers running IIS. You'll also need the Microsoft XML Parser, which is usually installed by default when you install Internet Explorer.

84.2 The Code

Create a file called hasImage.asp with the following code:

Function hasImage(asin_in)

    strIURL = "http://images.amazon.com/images/P/" & asin_in
    strIURL = strIURL & ".01.THUMBZZZ.jpg"
        
    On Error Resume Next
        
    Set xmlhttp = Server.CreateObject("Msxml2.SERVERXMLHTTP")
    xmlhttp.Open "GET", strIURL, false
    xmlhttp.Send(Now)
    If Err.Number <> 0 Then
        strResponseBody = ""
        Err.Clear
    Else
        strResponseBody = xmlhttp.responseBody
    End If
        
    On Error GoTo 0
        
    Set xmlhttp = Nothing

    If Len(strResponseBody) > 403 Then
        hasImage = 1
    Else
        hasImage = 0
    End If

End Function

The function requests an image, looks at the byte size, and returns true or false based on what it finds. It just so happens that the number of characters in the single-pixel GIF file is 403. This script assumes that anything greater than that must be a real product image.

84.3 Running the Hack

The hard part in testing this script is finding products without images. Only a small percentage of products don't have images, and there's no way to specifically seek them out. Still, to test it out, add the following lines to hasImage.asp:

    response.write "Asin 1873176945 "
    If hasImage("1873176945") Then
        response.write "has an image."
    Else
        response.write "doesn't have an image!"
    End If

    response.write "<br>"

    response.write "Asin 0596004478 "
    If hasImage("0596004478") Then
        response.write "has an image."
    Else
        response.write "doesn't have an image!"
    End If

Browse to the page on your server:

http://example.com/hasImage.asp

And you should see:

Asin 1873176945 doesn't have an image!
Asin 0596004478 has an image.

Then you can confirm the results by browsing to the product detail pages.