Heim > Web-Frontend > js-Tutorial > Hauptteil

So implementieren Sie einen einfachen Crawler mit Node.js

高洛峰
Freigeben: 2017-03-19 17:24:40
Original
2045 Leute haben es durchsucht

Warum haben Sie sich entschieden, Node zum Schreiben eines Crawlers zu verwenden? Das liegt daran, dass die Cheerio-Bibliothek vollständig mit der jQuery-Syntax kompatibel ist. Wenn Sie damit vertraut sind, macht die Verwendung der

Abhängigkeitsauswahl

  • wirklich Spaß

    cheerio: Node .js Version von jQuery

  • http: kapselt einen HTTP-Server und einen einfachen HTTP-Client

  • iconv-lite: Lösen Sie das Problem verstümmelter Zeichen beim Crawlen von gb2312-Webseiten

Erstimplementierung

Da wir den Inhalt der Website crawlen möchten, sollten wir zuerst Folgendes tun Ein Blick auf die Grundstruktur der Website
Wir haben Movie Paradise als Zielwebsite ausgewählt und wollten alle aktuellen Film-Download-Links crawlen

Analyseseite

Die Seitenstruktur ist wie folgt :
So implementieren Sie einen einfachen Crawler mit Node.js

Wir können sehen, dass sich der Titel jedes Films in einem <a href="http://www.php.cn/wiki/164.html" befindet="_blank">class<code><a href="http://www.php.cn/wiki/164.html" target="_blank">class</a> Unter dem ulink-Tag für a und dann nach oben können wir sehen, dass das äußerste Feld class co_content8

ok ist , Sie können mit der Arbeit beginnen

, um einen Seitenfilmtitel zu erhalten

Führen Sie zunächst Abhängigkeiten ein und legen Sie die zu crawlende URL fest

var cheerio = require('cheerio');
var http = require('http');
var iconv = require('iconv-lite');

var url = 'http://www.ygdy8.net/html/gndy/dyzz/index.html';
Nach dem Login kopieren

Kerncodeindex.js

http.get(url, function(sres) {
  var chunks = [];
  sres.on('data', function(chunk) {
    chunks.push(chunk);
  });
  // chunks里面存储着网页的 html 内容,将它zhuan ma传给 cheerio.load 之后
  // 就可以得到一个实现了 jQuery 接口的变量,将它命名为 `$`
  // 剩下就都是 jQuery 的内容了
  sres.on('end', function() {
    var titles = [];
    //由于咱们发现此网页的编码格式为gb2312,所以需要对其进行转码,否则乱码
    //依据:“<meta>”
    var html = iconv.decode(Buffer.concat(chunks), 'gb2312');
    var $ = cheerio.load(html, {decodeEntities: false});
    $('.co_content8 .ulink').each(function (idx, element) {
      var $element = $(element);
      titles.push({
        title: $element.text()
      })
    })    
    console.log(titles);     
  });
});
Nach dem Login kopieren

Führen Sie node index

Die Ergebnisse sind wie folgt aus
So implementieren Sie einen einfachen Crawler mit Node.js

Der Filmtitel wurde erfolgreich abgerufen, wenn ich die Titel mehrerer Seiten erhalten möchte ist es nicht möglich, die URLs einzeln zu ändern. Natürlich gibt es eine Möglichkeit, dies zu tun, bitte lesen Sie weiter!

Mehrseitige Filmtitel erhalten

Wir müssen nur den vorherigen Code in eine Funktion kapseln und rekursivausführen, und schon ist es erledigt

Kerncodeindex.js

var index = 1; //页面数控制
var url = 'http://www.ygdy8.net/html/gndy/dyzz/list_23_';
var titles = []; //用于保存title

function getTitle(url, i) {
  console.log("正在获取第" + i + "页的内容"); 
  http.get(url + i + '.html', function(sres) {
    var chunks = [];
    sres.on('data', function(chunk) {
      chunks.push(chunk);
    });
    sres.on('end', function() {
      var html = iconv.decode(Buffer.concat(chunks), 'gb2312');
      var $ = cheerio.load(html, {decodeEntities: false});
      $('.co_content8 .ulink').each(function (idx, element) {
        var $element = $(element);
        titles.push({
          title: $element.text()
        })
      })  
      if(i <p>Die Ergebnisse sind wie folgt<br><img src="https://img.php.cn/upload/article/000/000/013/79a1edcfe9244c5fb6f23f007f455aaf-2.png"    style="max-width:90%"  style="max-width:90%" title="So implementieren Sie einen einfachen Crawler mit Node.js" alt="So implementieren Sie einen einfachen Crawler mit Node.js"></p><h4>Holen Sie sich die Film-Download-Verbindung</h4><p>Wenn es ein ist Manueller Vorgang, wir benötigen einen Vorgang durch Klicken, um die Seite mit den Filmdetails aufzurufen und die Download-Adresse zu finden<br>Wie implementieren wir es über den Knoten</p><p>Lassen Sie uns zuerst die Routine analysieren<a href="http://www.php.cn/code/7955.html" target="_blank">Seitenlayout</a> <br><img src="https://img.php.cn/upload/article/000/000/013/45e6e69669b80c60f0e7eabd78b3a018-3.png"    style="max-width:90%"  style="max-width:90%" title="So implementieren Sie einen einfachen Crawler mit Node.js" alt="So implementieren Sie einen einfachen Crawler mit Node.js"></p><p> Wenn wir den Download-Link genau lokalisieren möchten, müssen wir zuerst das p finden, wobei <code>id</code> <code>Zoom</code> ist. Der Download-Link befindet sich im <code>p</code>-Tag unter <code>tr</code> unter diesem <code>a</code>. </p><p>Dann <a href="http://www.php.cn/code/8119.html" target="_blank">definieren wir eine Funktion </a>, um den Download-Link zu erhalten </p><p>getBtLink()</p><pre class="brush:php;toolbar:false">function getBtLink(urls, n) { //urls里面包含着所有详情页的地址
  console.log("正在获取第" + n + "个url的内容");
  http.get('http://www.ygdy8.net' + urls[n].title, function(sres) {
    var chunks = [];
    sres.on('data', function(chunk) {
      chunks.push(chunk);
    });
    sres.on('end', function() {
      var html = iconv.decode(Buffer.concat(chunks), 'gb2312'); //进行转码
      var $ = cheerio.load(html, {decodeEntities: false});
      $('#Zoom td').children('a').each(function (idx, element) {
        var $element = $(element);
        btLink.push({
          bt: $element.attr('href')
        })
      })
      if(n <p>Erneut ausführen<code>node index</code><br><img src="https://img.php.cn/upload/article/000/000/013/2816c9cbd03b1466c255e54c10156e14-4.png"    style="max-width:90%"  style="max-width:90%" title="So implementieren Sie einen einfachen Crawler mit Node.js" alt="So implementieren Sie einen einfachen Crawler mit Node.js"><br><img src="https://img.php.cn/upload/article/000/000/013/8eb570e10f1a4e755ebffd92bd150760-5.png"    style="max-width:90%"  style="max-width:90%" title="So implementieren Sie einen einfachen Crawler mit Node.js" alt="So implementieren Sie einen einfachen Crawler mit Node.js"></p><p>Auf diese Weise haben wir die Download-Links aller Filme auf 3 Seiten erhalten. </p><h2>Daten speichern</h2><p>Natürlich müssen die Daten nach dem Auslesen gespeichert werden. Hier habe ich <a href="http://www.php.cn/wiki/1523.html" target="_blank">MongoDB</a> zum Speichern ausgewählt</p> <p>Datenspeicherfunktion<code>save()</code></p><pre class="brush:php;toolbar:false">function save() {
  var MongoClient = require('mongodb').MongoClient; //导入依赖
  MongoClient.connect(mongo_url, function (err, db) {
    if (err) {
      console.error(err);
      return;
    } else {
      console.log("成功连接数据库");
      var collection = db.collection('node-reptitle');
      collection.insertMany(btLink, function (err,result) { //插入数据
        if (err) {
          console.error(err);
        } else {
          console.log("保存数据成功");
        }
      })
      db.close();
    }
  });
}
Nach dem Login kopieren

Die Bedienung hier ist sehr einfach, es ist nicht erforderlich, Mungo zu verwenden
Erneut ausführennode index
So implementieren Sie einen einfachen Crawler mit Node.js

Dies ist der implementierte Crawler von Node.js. Ich hoffe, dass jeder die gewünschten Daten crawlen kann;)

Das obige ist der detaillierte Inhalt vonSo implementieren Sie einen einfachen Crawler mit Node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage