2016-09-03 3 views
0

Недавно я попадал в веб-сканеры, и я выяснил, что нужно искать текст, но есть ли способ, которым я могу заставить искателя своего веб-сайта искать что-то еще, например видео и изображения а затем загрузить их и организовать их.node.js web crawler images/video

вот мой веб-гусеничного до сих пор:

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')); 
}); 
} 

Я получил большую часть этого кода из онлайн учебник, чтобы помочь мне начать работу, но мне нужно больше помогать код работает, я просто хотел бы знать, если и как бы можно было сканировать изображения и видео в Интернете.

Новее Код:

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

Что означает «веб-сканирование изображений и видео»? У вас есть содержимое веб-страницы в вашем искателе, уже обработанном cheerio. Вы можете использовать это, чтобы найти любые изображения или ссылки на видео на странице DOM. Что еще вы спрашиваете? – jfriend00

+0

@ jfriend00 спасибо, я не знал, что это возможно, поэтому я спрашиваю – frenchtoaster10

+0

Ну, у вас уже есть код, который находит все ссылки на странице. Вы можете использовать аналогичный код, чтобы найти все теги '' или '

ответ

0

Так же, как вы используете Cheerio искать тело для ссылок, вы также можете найти тело либо для <img> или <video> тегов. Вы точно не сказать, что вы хотите делать, когда вы найдете эти теги, но вы можете создать функцию, аналогичную вашей collectInternalLinks(), которые будут собирать медиа-объектов для дальнейшей обработки:

// 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; 
} 

Сбор видео URL, немного больше потому что эти URL-адреса могут быть указаны несколькими различными способами (.src, встроенные <track> теги, встроенные теги <source> и т. д.), поэтому вам нужно будет разобрать каждый возможный способ для каждого тега <video>.

+0

Хорошо спасибо за код, его просто, когда я пытаюсь его реализовать, он всегда дает мне типError: $ не является функцией. любая помощь? – frenchtoaster10

+0

или каким-либо образом реализовать это поможет много. – frenchtoaster10

+0

@ frenchtoaster10 - Как и в ваших других функциях 'collectInternalLinks()' и 'searchForWord()', вам нужно передать экземпляр cheerio в функции в качестве аргумента. Это становится аргументом '$'. Посмотрите, как работают ваши другие функции в этом отношении. – jfriend00