Web Scraping

Dette er et eksempel på en scraper, der finder alle links på en side, og skriver deres URL ud i konsollen. Den benytter to pakker fra npm, så hele systemet ikke skal programmeres op fra grunden. Pakken axios benyttes i eksemplet til at arbejde med http requests, og cheerio bruges til at parse html strukturen, der returneres fra serveren, og uddrage de data man er interesseret i at arbejde videre med i programmet. Disse pakker skal installeres fra npm for at eksemplet kan eksekveres på din maskine.

Først skal der laves et projekt så node kan finde ud af at køre programmet, og har en package.json fil til at holde styr på projektet og afhængigheder af biblioteksmoduler.

Start med at lave en mappe, som kan indeholde dit projekt. Kald den f.eks. web-scraping. I denne mappe skal du køre følgende kommando, for at oprette projekt filen package.json.

npm init -y

Dernæst har du mulighed for at installere disse afhængigheder.

npm --save install axios
npm --save install cheerio

Du burde nu have en package.json fil, der ser nogenlunde sådan ud:

{
  "name": "web-scraping",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "axios": "^0.19.1",
    "cheerio": "^1.0.0-rc.3"
  }
}

Bemærk de to pakker der er listet under afhængigheder.

Derefter skal du oprette filen simple-scraper.js med følgende indhold.

const cheerio = require("cheerio");
const axios = require("axios");

// Swap this for the url you want to scrape
const url =
  "https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States";

axios
  .get(url)
  .then(response => {
    let $ = cheerio.load(response.data);
    $("a").each(function(i, e) {
      let links = $(e).attr("href");
      console.log(links);
    });
  })
  .catch(function(e) {
    console.log(e);
  });

Nu kan du køre eksemplet med denne kommando:

node simple-scraper.js

Async / await version

Her er et eksempel med samme funktionalitet, men hvor der bruges async / await syntaks i stedet for promise.then().

// import the library modules you installed from npm
const cheerio = require("cheerio");
const axios = require("axios");

// Define the scraping algorithm
async function runScraper(url) {
  try {
    const html = (await axios.get(url)).data;
    const $ = cheerio.load(html);

    $("a").each(function(i, e) {
      const url = $(e).attr("href");
      console.log(url);
    });
  } catch (error) {
    console.log("error: " + error);
  }
}

// Swap this for the url you want to scrape
const url =
  "https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States";

// run the scraper by calling the function
runScraper(url);

Materiale

NPM pakker

Her er en række pakker, der kan bruges til at lave scraping af websider.

Javascript emner

Tutorial

Denne tutorial er et eksempel på hvordan man kan hente en side med links til amerikanske præsidenter fra wikipedia, og ved at følge disse links hente de enkelte præsidenters navne og fødselsdage.

Websider der anvendes i eksemplet: