2016-09-03 5 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で解析されたWebページのコンテンツがあります。ページ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プロパティ、埋め込み<track>タグ、埋め込み<source>タグなど)を指定することができます。したがって、<video>タグごとにそれぞれの方法を解析する必要があります。

+0

コードをありがとう、私はそれを実装しようとするとき、それは常に私にtypeErrorを与える:$は関数ではありません。どんな助け? – frenchtoaster10

+0

やそれを実装する方法があれば、大いに役立ちます。 – frenchtoaster10

+0

@ frenchtoaster10 - あなたの他の関数 'collectInternalLinks()'や 'searchForWord()'と同じように、cheerioインスタンスを引数として関数に渡す必要があります。これは '$'引数になります。あなたの他の機能がこの点でどのように機能するかを見てください。 – jfriend00

関連する問題