2016-09-03 22 views
0

Kürzlich habe ich in Web-Crawler bekommen und ich habe herausgefunden, ob Sie nach Text suchen, aber gibt es keine Möglichkeit, dass ich meinen Web-Crawler nach etwas anderem wie Videos und Bildern suchen lassen kann und dann lade sie herunter und organisiere sie.node.js web crawler images/video

hier ist meine Web-Crawler so weit:

var request = require('request'); 
var cheerio = require('cheerio'); 
var URL = require('url-parse'); 
var fs = require('fs'); 

var START_URL = "https://www.google.com"; 
var SEARCH_WORD = "apples"; 
var MAX_PAGES_TO_VISIT = 200; 

var pagesVisited = {}; 
var numPagesVisited = 0; 
var pagesToVisit = []; 
var url = new URL(START_URL); 
var baseUrl = url.protocol + "//" + url.hostname; 

pagesToVisit.push(START_URL); 
crawl(); 

function crawl() { 
    if(numPagesVisited >= MAX_PAGES_TO_VISIT) { 
    console.log("Reached max limit of number of pages to visit."); 
    return; 
    } 
    var nextPage = pagesToVisit.pop(); 
    if (nextPage in pagesVisited) { 
    // We've already visited this page, so repeat the crawl 
    crawl(); 
    } else { 
    // New page we haven't visited 
    visitPage(nextPage, crawl); 
    } 
} 

function visitPage(url, callback) { 
    // Add page to our set 
    pagesVisited[url] = true; 
numPagesVisited++; 

    // Make the request 
console.log("Visiting page " + url); 
    request(url, function(error, response, body) { 
    // Check status code (200 is HTTP OK) 
    console.log("Status code: " + response.statusCode); 
    if(response.statusCode !== 200) { 
     callback(); 
     return; 
    } 
    // Parse the document body 
     var $ = cheerio.load(body); 
    var isWordFound = searchForWord($, SEARCH_WORD); 
    if(isWordFound) { 
     console.log('Word ' + SEARCH_WORD + ' found at page ' + url); 
    } else { 
     collectInternalLinks($); 
     // In this short program, our callback is just calling crawl() 
     callback(); 
    } 
    }); 
} 

function searchForWord($, word) { 
    var bodyText = $('html > body').text().toLowerCase(); 
    return(bodyText.indexOf(word.toLowerCase()) !== -1); 
} 

function collectInternalLinks($) { 
    var relativeLinks = $("a[href^='/']"); 
console.log("Found " + relativeLinks.length + " relative links on page"); 
relativeLinks.each(function() { 
    pagesToVisit.push(baseUrl + $(this).attr('href')); 
}); 
} 

Ich habe die meisten dieser Code von einem Online-Tutorial bekommen mir den Einstieg zu erleichtern, aber ich brauche mehr den Code helfen funktioniert Ich wollte nur wissen, ob und wie wäre es möglich, Bilder und Videos im Web zu crawlen?

Neuere Code:

var request = require('request'); 
var cheerio = require('cheerio'); 
var URL = require('url-parse'); 
var fs = require('fs'); 

var START_URL = "http://moetube.net"; 
//var SEARCH_WORD = "anime"; 
var MAX_PAGES_TO_VISIT = 200; 

var pagesVisited = {}; 
var numPagesVisited = 0; 
var pagesToVisit = []; 
    var url = new URL(START_URL); 
var baseUrl = url.protocol + "//" + url.hostname; 

pagesToVisit.push(START_URL); 
crawl(); 

function crawl() { 
    if(numPagesVisited >= MAX_PAGES_TO_VISIT) { 
    console.log("Reached max limit of number of pages to visit."); 
    return; 
    } 
    var nextPage = pagesToVisit.pop(); 
    if (nextPage in pagesVisited) { 
    // We've already visited this page, so repeat the crawl 
    crawl(); 
    } else { 
     // New page we haven't visited 
     visitPage(nextPage, crawl); 
    } 
    } 

    function visitPage(url, callback) { 
    // Add page to our set 
    pagesVisited[url] = true; 
    numPagesVisited++; 

    // Make the request 
    console.log("Visiting page " + url); 
    request(url, function(error, response, body) { 
    var $ = cheerio.load(body); 
     // Check status code (200 is HTTP OK) 
     console.log("Status code: " + response.statusCode); 
     collectImages($); 
     if(response.statusCode !== 200) { 
     callback(); 

      return; 
     } 
     // Parse the document body 

    // var isWordFound = searchForWord($, SEARCH_WORD); 

    // if(isWordFound) { 
    // console.log('Word ' + SEARCH_WORD + ' found at page ' + url); 
    // } else { 
     collectInternalLinks($); 
     // In this short program, our callback is just calling crawl() 
     callback(); 
    // } 
    }); 
} 

    function searchForWord($, word) { 
    var bodyText = $('html > body').text().toLowerCase(); 
    return(bodyText.indexOf(word.toLowerCase()) !== -1); 
    } 

function collectImages($) { 

    return $("img").map(function() { 
     return $(this).text(); 
     console.log((this).text() + "JHJHHHHHHHHHHHHHHHHHHHH"); 
    }).get(); 
     } 

function collectInternalLinks($) { 

    var relativeLinks = $("a[href^='/']"); 
    console.log("Found " + relativeLinks.length + " relative links on page"); 
    relativeLinks.each(function() { 
     pagesToVisit.push(baseUrl + $(this).attr('href')); 
    }); 
} 
+0

Was bedeutet "Webcrawl Bilder und Video"? Sie haben den Inhalt einer Webseite in Ihrem Crawler bereits mit cheerio geparst. Sie können diese verwenden, um Bilder oder Videoverweise im Seiten-DOM zu finden. Was fragst du noch? – jfriend00

+0

@ jfriend00 danke ich war mir nicht bewusst, dass das möglich war, deshalb frage ich – frenchtoaster10

+0

Nun, Sie haben bereits Code, der alle Links auf der Seite findet. Sie können ähnlichen Code verwenden, um alle '' Tags oder'

Antwort

0

Genau wie Sie cheerio verwenden, den Körper nach Links zu suchen, können Sie auch den Körper suchen entweder <img> oder <video> Tags. Sie sagen nicht genau, was Sie tun möchten, wenn Sie diese Tags zu finden, aber man könnte eine ähnliche Funktion wie Ihre collectInternalLinks() erstellen, die Medienobjekte für die weitere Verarbeitung sammeln würde:

// return array of image URLs (these may be page-relative URLS) 
function collectImages($) { 
    return $("img").map(function() { 
     return $(this).prop("src"); 
    }).get(); 
} 

// return collection of video elements 
function collectVideos($) { 
    let videoUrls = []; 
    $("video").each(function() { 
     let src = $(this).prop("src"); 
     if (src) { 
      videoUrls.push(src); 
     } else { 
      let subElements = $(this).find("track, source"); 
      subElements.each(function() { 
       let src = $(this).prop("src"); 
       if (src) { 
        videoUrls.push(src); 
       } 
      }); 
     } 
    }); 
    return videoUrls; 
} 

Sammeln Video-URLs ist ein bisschen mehr beteiligt, weil diese URLs können eine Reihe von verschiedenen Möglichkeiten angegeben werden (.src Eigenschaft, eingebettete <track> Tags, eingebettete <source> Tags, etc ...), so müssten Sie jeden möglichen Weg für jedenTag analysieren.

+0

Ok danke für den Code, es ist nur, wenn ich versuche, es zu implementieren, es gibt mir immer einen TypeError: $ ist keine Funktion. irgendeine Hilfe? – frenchtoaster10

+0

oder eine Möglichkeit, es zu implementieren, würde viel helfen. – frenchtoaster10

+0

@ frommetoaster10 - Wie in den anderen Funktionen 'collectInternalLinks()' und 'searchForWord()' müssen Sie die cheerio-Instanz als Argument an die Funktionen übergeben. Das wird zum '$' Argument. Schau dir an, wie deine anderen Funktionen in dieser Hinsicht funktionieren. – jfriend00