WhitneyRip 👾

Crash

Sorry I Crashed Whitney’s Website

The assignment was to build a web scraper and collect as much data as possible from anywhere. Naturally, I wrote one that tried to collect every available artwork from the Whitney Museum of American Art.

Leaks

See the Leaks or the Full Archive.

The Hack

Scraping Logs

found whitney image url - https://collectionimages.whitney.org/standard/176757/largepage.jpg
seems to be randomized number naming
wrote a bash script to download all images by running numbers from 1 to 300000 (./rip.sh)
divided the work load into three days since the progress took too long to complete

obtained a total of 18154 folders, 387.2 MB, with number naming of the image as the folder name

found an easier way to scrape whitney's collection
they index their objects with - https://collection.whitney.org/object/(number)
plugged in the total number of items, 18154, obtained from the previous process
https://collection.whitney.org/object/18154

realized that the previous process missed one item

to total collection is 1-18155

began development for a node scraping tool

figured out a way to loop from 1 to 18155 with node module - lupus

discovered whitney's DDOS prevention system

got soft banned from the server for 10 minutes

solved the problem with node module - system-sleep

saving data to data.json file with node module - jsonfile

discovered a problem with the node scraping tool,
found out that whitney rendered some pages with a special vm binding structure
that prevents my node scraping tool from getting the html elements (ex:https://collection.whitney.org/object/9)

"<div id="main-webapp">
<noscript>
&lt;a href="/artists/by-letter/A"&gt;Browse artists&lt;/a&gt;
</noscript>
</div>"

------------------------------------------------------------------------------------------------------------------------

Visualization One

began working on a visualization with images obtained from bash scrape. (/public/index.html)

wrote a bash_script (./count.sh) to obtain whitney's image number naming from folder names and save to data .txt in /img

created a data.json file with data.txt

ran into a problem of too many files that crashed the browser, maximum serving is 100 images now

looking for some javascript solutions to load all images



Visualization Two

Since I have too many images, and the browser cannot handle the workload, so I decided to take a different approach and show one image at a time

inspired by Fifty Shades of Grey, I created 18154 Shades of Whitney with a show me button
when the button is clicked the site will show you one shade of whitney from the 18154 shades.

found error - https://collectionimages.whitney.org/standard/13663/largepage.jpg whitney took out access to this image from the public domain.

“Forbidden

You don't have permission to access /standard/13663/largepage.jpg on this server.”

Scraping with a Node.js Server

node

Scraping with a Bash Script

bash

Code

scraper.js

var request = require("request"),
  cheerio = require("cheerio"),
  lupus = require("lupus"),
  sleep = require("system-sleep"),
  jsonfile = require("jsonfile"),
  data = [],
  file = "data.json",
  port = 9000;

//1-18155 (18156 for search) 25.216 hrs to complete on6226
lupus(13620, 18156, function (n) {
  //console.log(n);
  request(
    {
      method: "GET",
      url: "https://collection.whitney.org/object/" + n,
    },
    function (err, response, body) {
      if (err) return console.error(err);
      $ = cheerio.load(body);
      console.log(n);
      //if($('h1.xlarge').length == 0){
      $("div#main-webapp").each(function () {
        if ($("div.detail.artist").length > 0) {
          var detailArtist = $("div.detail.artist", this),
            detailTitle = $("div.detail.title", this),
            detailDate = $("div.detail.date", this),
            detailOM = $("div.detail.object-medium", this),
            detailDim = $("div.detail.dimensions", this),
            detailCL = $("div.detail.credit-line", this),
            detailAcce = $("div.detail.accession", this),
            detailCR = $("div.detail.copyright", this),
            artImg = $("img.artwork", this).attr("src"),
            holder = "p.info";

          console.log({
            id: n,
            img: artImg,
            artist: $(holder, detailArtist).text(),
            title: $(holder, detailTitle).text(),
            date: $(holder, detailDate).text(),
            medium: $(holder, detailOM).text(),
            dimension: $(holder, detailDim).text(),
            credit: $(holder, detailCL).text(),
            accession: $(holder, detailAcce).text(),
            copyright: $(holder, detailCR).text(),
          });

          data.push({
            id: n,
            img: artImg,
            artist: $(holder, detailArtist).text(),
            title: $(holder, detailTitle).text(),
            date: $(holder, detailDate).text(),
            medium: $(holder, detailOM).text(),
            dimension: $(holder, detailDim).text(),
            credit: $(holder, detailCL).text(),
            accession: $(holder, detailAcce).text(),
            copyright: $(holder, detailCR).text(),
          });

          //save to json
          jsonfile.writeFile(file, data, { spaces: 2 }, function (err) {
            console.error(err);
          });
        }
        //console.log(data);
      });
    }
  );

  //sleep delay prevents socket hangup
  sleep(5000);
});

scrape.sh

#!/bin/bash

for i in {194876..300000}

do
wget https://collectionimages.whitney.org/standard/$i/largepage.jpg -P ./img/\$i

done

Artwork Data

View all artwork data.

[
  {
    "id": 3586,
    "img": "https://collectionimages.whitney.org/standard/102386/largepage.jpg",
    "artist": "Pamela Bianco (1906-1995)",
    "title": "Zinnias",
    "date": "1927",
    "medium": "Lithograph",
    "dimension": "Sheet: 14 1/2 × 9 11/16 in. (36.8 × 24.6 cm) Image: 11 7/16 × 6 7/8 in. (29.1 × 17.5 cm)",
    "credit": "Whitney Museum of American Art, New York; Gift of Gertrude Vanderbilt Whitney ",
    "accession": "31.606",
    "copyright": "© artist or artist’s estate"
  },
  {
    "id": 4129,
    "img": "https://collectionimages.whitney.org/standard/102387/largepage.jpg",
    "artist": "Emil Ganso (1895-1941)",
    "title": "Hilda #2",
    "date": "c. 1930",
    "medium": "Drypoint, etching, and aquatint",
    "dimension": "Sheet (Irregular): 11 13/16 × 12 3/8 in. (30 × 31.4 cm) Plate: 6 1/4 × 6 15/16 in. (15.9 × 17.6 cm)",
    "credit": "Whitney Museum of American Art, New York; Purchase ",
    "accession": "31.674",
    "copyright": "© artist or artist’s estate"
  },
  {
    "id": 4135,
    "img": "https://collectionimages.whitney.org/standard/102388/largepage.jpg",
    "artist": "Emil Ganso (1895-1941)",
    "title": "Still Life With Bottle",
    "date": "1930",
    "medium": "Wood engraving",
    "dimension": "Sheet (Irregular): 16 3/8 × 13 in. (41.6 × 33 cm) Image: 12 × 10 in. (30.5 × 25.4 cm)",
    "credit": "Whitney Museum of American Art, New York; Purchase ",
    "accession": "31.734",
    "copyright": "© artist or artist’s estate"
  }
]