Skillnad mellan versioner av "Crawler.js"

Från SHF wiki
(Skapade sidan med 'Koden nedan är skriven för node.js. Den listar alla sidor och filer på en mwdiawiki. Den kostar även vilka filer som refereras från varje sida. const http = require('h...')
 
 
Rad 1: Rad 1:
Koden nedan är skriven för node.js. Den listar alla sidor och filer på en mwdiawiki. Den kostar även vilka filer som refereras från varje sida.
Koden nedan listar alla sidor och filer på en mediawiki. Den listar även vilka filer som refereras från varje sida.
 
Koden nedan är skriven för node.js.  


   const http = require('http')
   const http = require('http')

Nuvarande version från 27 oktober 2021 kl. 08.59

Koden nedan listar alla sidor och filer på en mediawiki. Den listar även vilka filer som refereras från varje sida.

Koden nedan är skriven för node.js.

 const http = require('http')
 async function visitNext(state) {
   return new Promise((resolve, reject) => {
     const title = state.queue.pop();
     if(!title) {
       reject('visitNext() is called when queue is empty');
     }
     const options = {
       hostname: '81.91.1.84',
       port: 80,
       path: '/mediawiki/api.php?action=query&prop=links&format=json&pllimit=500&titles=' + encodeURIComponent(title),
       method: 'GET'
     }
     http.get(options, res => {
       let data = [];
       res.on('data', chunk => {
         data.push(chunk);
       });
       res.on('end', () => {
         const response = JSON.parse(Buffer.concat(data).toString());
         const pages = response.query.pages;
         for(index in pages) {
           const page = pages[index];
           if(page.links) {
             page.links.forEach(link => {
               if(!state.known[link.title]){
                 state.known[link.title] = link.title;
                 state.queue.push(link.title);
               }
             });
           }
         }
         resolve(state);
       });
     }).on('error', err => {
       reject('http error: ', err.message);
     });
   });
 }
 async function extractImages(title, state) {
   return new Promise((resolve, reject) => {
     if(!title) {
       reject('extractFiles() is called with empty page title');
     }
     const options = {
       hostname: '81.91.1.84',
       port: 80,
       path: '/mediawiki/api.php?action=query&prop=images&format=json&imlimit=500&titles=' + encodeURIComponent(title),
       method: 'GET'
     }
     http.get(options, res => {
       let data = [];
       res.on('data', chunk => {
         data.push(chunk);
       });
       res.on('end', () => {
         const response = JSON.parse(Buffer.concat(data).toString());
         const pages = response.query.pages;
         for(index in pages) {
           const page = pages[index];
           state.references[title] = [];
           if(page.images) {
             page.images.forEach(image => {
               state.titles[image.title] = image.title;
               state.references[page.title].push(image.title);
             });
           }
         }
         resolve(state);
       });
     }).on('error', err => {
       reject('http error: ', err.message);
     });
   });
 }
 // add the pages in the initial queue to the known pages. 
 async function crawl() {
   let known = {};
   let queue = ['Huvudsida', 'Välkommen'];
   queue.forEach(
    title => known[title] = title
   );
   let pageTitles = {known, queue};
   // find all pages
   while(pageTitles.queue.length) {
     pageTitles = await visitNext(pageTitles);
   }
   // print page titles
   console.log('--- page titles ------------------------------------------------');
   for(title in pageTitles.known) {
     console.log(title);
   }
   // for each page, find all files
   let images = {titles:{}, references:{}};
   for(title in pageTitles.known) {
     await extractImages(title, images);
   }
   // print images
   console.log('--- image titles ------------------------------------------------');
   for(title in images.titles) {
     console.log(title);
   }
   // print images references
   console.log('--- image references ------------------------------------------------');
   for(title in pageTitles.known) {
     if(images.references[title].length) {
       console.log(title);
       images.references[title].forEach(ref => {
         console.log('   ' + ref);
       });
     }
   }
 }
 crawl();