2016-09-03 6 views
0

최근에 웹 크롤러에 들어갔고 텍스트 검색을 위해 알아 낸 바가 있지만 웹 크롤러에서 동영상 및 이미지와 같은 다른 항목을 검색 할 수있는 방법이 있습니다. 그런 다음 다운로드하여 구성하십시오. 나는 나를 시작하지만 난 그냥 알고 싶어 작동 코드를 도움이 더 필요하기 위해 온라인 튜토리얼이 코드의 대부분을 입수했습니다node.js 웹 크롤러 이미지/비디오

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

, 당신은 또한 하나 <img> 또는 <video> 태그 본문을 검색 할 수 있습니다. 동영상 URL을 수집

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

조금 더 : 당신은 당신이 해당 태그를 찾을 때 수행 할 작업을 정확하게 말을하지 않습니다,하지만 당신은 추가 처리를 위해 미디어 객체를 수집하는 것입니다 귀하의 collectInternalLinks() 유사한 기능을 만들 수 있습니다 (.src 속성, 포함 된 태그, 포함 된 <source> 태그 등 ...)을 지정할 수 있으므로 각 <video> 태그에 대해 각 가능한 방법을 파싱해야합니다.

+0

코드를 주셔서 감사합니다, 그때 내가 그것을 구현하려고하면, 그것은 항상 나를 준다 typeError : $는 함수가 아닙니다. 어떤 도움? – frenchtoaster10

+0

또는 그것을 구현하는 방법은 많은 도움이 될 것입니다. – frenchtoaster10

+0

@ frenchtoaster10 - 다른 함수'collectInternalLinks()'와'searchForWord()'에서와 같이 cheerio 인스턴스를 인수로 함수에 전달해야합니다. 그것은'$'인수가됩니다. 이와 관련하여 다른 기능이 어떻게 작동하는지보십시오. – jfriend00