Node.js erstellt ein einfaches Crawler-Case-Tutorial

Node.js erstellt ein einfaches Crawler-Case-Tutorial

Vorbereitung

  1. Zuerst müssen Sie nodejs herunterladen, was kein Problem sein sollte.
  2. Für den Originaltext muss ich Webstrom herunterladen. Ich habe es bereits auf meinem Computer, muss es aber nicht herunterladen. Ich kann es einfach in der Befehlszeile ausführen.

Erstellen eines Projekts

Nachdem die Vorbereitungen abgeschlossen sind, beginnen wir mit der Erstellung des Projekts.

  1. Erstellen Sie zunächst einen Ordner, in dem Sie die Ressourcen ablegen möchten. Ich habe beispielsweise einen Ordner myStudyNodejs auf dem Laufwerk E erstellt.
  2. Öffnen Sie den erstellten Ordner in der Kommandozeile wie im Bild gezeigt und geben Sie das Laufwerk E ein: E:
    Gehen Sie in den Ordner: cd myStudyNodejs (der Name des Ordners, den Sie erstellt haben)
    Beachten Sie, dass es sich bei allen um englische Symbole handelt
  3. Initialisieren Sie das Projekt. Führen Sie npm init in dem von Ihnen erstellten Ordner aus. Drücken Sie die Eingabetaste ganz durch, um das Projekt zu initialisieren. Geben Sie abschließend „yes“ ein.
  4. Nach dem Ausführen wird im Ordner eine Datei package.json generiert, die einige grundlegende Informationen des Projekts enthält.
  5. Installieren Sie die erforderlichen Pakete und führen Sie sie im Verzeichnis des erstellten Ordners aus
    npm installiere cheerio –speichern
    npm installiere Anforderung-Speichern
    Wenn Sie die Wuhan-Universität besteigen möchten, reichen diese beiden Pakete aus. Wenn Sie Caoliu besteigen möchten, benötigen Sie ein zusätzliches Kodierungskonvertierungspaket. Das unter Windows ist
    npm installiere iconv-lite -save
    Verwenden Sie auf dem Mac npm install iconv -save
    Das Ergebnis sollte wie auf dem zweiten Bild aussehen, allerdings fehlt mir in der Mitte ein Buchstabe.
  6. Erstellen Sie eine Datei unter dem von Ihnen erstellten Ordner, um einen Datenordner zum Speichern der gecrawlten Textdaten zu erstellen.
    Erstellen Sie einen Bildordner zum Speichern von Bilddaten.
    Erstellen Sie eine JS-Datei, um das Programm zu schreiben. Beispielsweise study.js. (Erstellen Sie eine Notizblockdatei und ändern Sie .txt in .js)
    Der Zweck von –save besteht darin, die Abhängigkeit des Projekts vom Paket in die Datei package.json zu schreiben.

Abbildung 1

Abbildung 2

Nachrichten-Crawler-Code der Fakultät für Informatik der Universität Wuhan

Nachfolgend finden Sie den Crawler-Code für die Nachrichten der School of Computer Science der Wuhan University. Kopieren Sie ihn in die erstellte JS-Datei und speichern Sie ihn.

var http = erforderlich('http');
var fs = erfordern('fs');
var cheerio = erforderlich('cheerio');
var Anfrage = erforderlich('Anfrage');
var i = 0;
//Ursprüngliche URL 
var url = "http://cs.whu.edu.cn/a/xinwendongtaifabu/2018/0428/7053.html"; 

function fetchPage(x) { //Kapselt eine Ebene der function startRequest(x); 
}

Funktion startRequest(x) {
     //Verwenden Sie das http-Modul, um eine Get-Anfrage an den Server zu initiieren http.get(x, function (res) {     
        var html = ''; //Wird verwendet, um den gesamten HTML-Inhalt der angeforderten Webseite zu speichern var titles = [];    
        res.setEncoding('utf-8'); //Verhindere verstümmelte chinesische Schriftzeichen //Achte auf Datenereignisse und nehme jeweils ein Datenstück auf res.on('data', function (chunk) {   
	      html += Block;
	 });
     // Auf das Endereignis warten. Wenn das HTML des gesamten Webseiteninhalts abgerufen wurde, führen Sie die Rückruffunktion res.on('end', function () { aus.
         var $ = cheerio.load(html); //Verwende das Cheerio-Modul, um HTML zu analysieren
         var news_item = {
          //Titel des Artikels abrufen: $('div#container dt').text().trim(),
          i: i = i + 1,     
       };

	  console.log(news_item); //Nachrichteninformationen drucken var news_title = $('div#container dt').text().trim();
	  savedContent($,news_title); //Speichern Sie den Inhalt und den Titel jedes Artikels savedImg($,news_title); //Speichern Sie das Bild und den Titel jedes Artikels //URL des nächsten Artikels
       var nextLink="http://cs.whu.edu.cn" + $("dd.Paging a").attr('href');
       str1 = nextLink.split('-'); //Entferne die chinesischen Zeichen nach der URL str = encodeURI(str1[0]);  
       //Dies ist eines der Highlights. Durch die Steuerung von I können Sie steuern, wie viele Artikel gecrawlt werden sollen. Die Wuhan University hat nur 8 Artikel, daher ist sie auf 8 eingestellt
       wenn (i <= 8) {                
          fetchPage(str);
       }
	});
}).on('Fehler', Funktion (err) {
      console.log(fehler);
    });
 }
//Die Funktion dient zum lokalen Speichern der gecrawlten Nachrichteninhaltsressourcen function savedContent($, news_title) {
	$('dd.info').each(Funktion (Index, Element) {
		var x = $(dieser).text();       
		var y = x.substring(0, 2).trim();
		wenn (y == '') {
			x = x + '\n';   
			//Fügen Sie den Nachrichtentextinhalt Stück für Stück dem /data-Ordner hinzu und benennen Sie die Datei mit dem Titel der Nachricht fs.appendFile('./data/' + news_title + '.txt', x, 'utf-8', function (err) {
				wenn (Fehler) {
				console.log(fehler);
				}
			});
		}	
	})
}       
//Die Funktion dient zum lokalen Speichern der gecrawlten Bildressourcen function savedImg($,news_title) {
  $('dd.info img').each(Funktion (Index, Element) {
        var img_title = $(this).parent().next().text().trim(); //Titel des Bildes abrufen if(img_title.length>35||img_title==""){
         	img_title="Null";
        }
        var Bilddateiname = Bildtitel + '.jpg';
        var img_src = 'http://cs.whu.edu.cn' + $(this).attr('src'); // URL des Bildes abrufen

		//Verwenden Sie das Anforderungsmodul, um eine Anforderung an den Server zum Abrufen von Bildressourcen zu initiieren request.head(img_src,function(err,res,body){
		  wenn(fehler){
		    console.log(fehler);
		  }
		});
		request(img_src).pipe(fs.createWriteStream('./image/'+news_title + '---' + img_filename)); //Schreibe das Bild per Streaming in das lokale /image-Verzeichnis und verwende den Titel der Nachricht und den Titel des Bildes als Namen des Bildes.
	})
}

fetchPage(url); //Das Hauptprogramm wird gestartet

Jetzt kommt der spannende Moment. Führen Sie im aktuellen Ordner die erstellte js-Datei aus. Meine ist beispielsweise news.js.

npm news.js

Abbildung 3

Textquellen:

Abbildung 4

Bildquellen:

Abbildung 5

Caoliu Technology Forum Crawler

Nachdem ich die Nachrichten der Wuhan-Universität durchsucht hatte, war ich nicht zufrieden und versuchte daher, das technische Diskussionsforum von Caoliu zu durchsuchen (natürlich kann ich auch einige Dinge crawlen, die Sie verstehen). Es sind einige Probleme aufgetreten.
Beim Crawlen des Grases muss der Header der HTTP-Anforderungsnachricht das Feld „User-Agent“ enthalten, daher muss die ursprüngliche URL wie folgt geändert werden

var url = {
	Hostname: 'cl.5fy.xyz',
	Pfad: '/thread0806.php?fid=7',
	Überschriften: {
		'Inhaltstyp': 'text/html',
  	//Ohne dieses Feld können Sie nicht darauf zugreifen 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36',  
  }};

Zweitens unterstützt nodejs nur das Crawlen von Websites mit der Zeichenkodierung UTF-8. Sie müssen daher zusätzliche Pakete installieren, um die Kodierung zu konvertieren. Ändern Sie daher den Code wie folgt

/*
* @Autor: Benutzer
* @Datum: 28.04.2018 19:34:50
* @Zuletzt geändert von: Benutzer
* @Letzte Änderungszeit: 2018-04-30 21:35:26
*/
var http = erforderlich('http');
var fs = erfordern('fs');
var cheerio = erforderlich('cheerio');
var Anfrage = erforderlich('Anfrage');
var iconv = erforderlich('iconv-lite');
var i = 0;
  //Wird verwendet, um zu bestimmen, ob gespeichert oder darauf zugegriffen werden soll. var temp=0;
  let startPage=3;//Ab welcher Seite mit dem Crawlen begonnen werden soll let page=startPage;
  let endPage=5;//Welche Seite soll gecrawlt werden? let searchText='';//Gecrawlte Schlüsselwörter, alle werden standardmäßig gecrawlt, entsprechend Ihren Anforderungen //Ursprüngliche URL 
  var url = {
  Hostname: '1024liuyouba.tk',
  Pfad: '/thread0806.php?fid=16'+'&search=&page='+startPage,
  Überschriften: {
    'Inhaltstyp': 'text/html',
    //Ohne dieses Feld können Sie nicht auf 'User-Agent' zugreifen: 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36',  
  }};
//Speichern Sie die URL der Homepage
urlList=[];
//Kapselt eine Funktionsebene function fetchPage(x) { 
  setzeTimeout(Funktion(){  
    startRequest(x); },5000)
}
//Speichern Sie zuerst die URL der Schnittstelle, auf die zugegriffen werden soll
Funktion getUrl(x){
  Temperatur++;
  http.get(x,function(res){
    var html = ''; 
    res.setEncoding('binär');
    res.on('Daten', Funktion (Block) {   
      html += Block;
    });
    res.on('Ende', Funktion () {
      var buf = neuer Puffer (html, „binär“);
      var str=iconv.decode(buf,'GBK');
          var $ = cheerio.load(str); //Verwende das Cheerio-Modul, um HTML zu analysieren                
          $('tr.tr3 td.tal h3 a').jeweils(Funktion(){
            var Suche = $(this).text();
            wenn(Suche.indexOf(Suchtext)>=0){
            var nextLink="http://cl.5fy.xyz/" + $(this).attr('href');
            str1 = nextLink.split('-'); //Entferne die chinesischen Zeichen nach der URL str = encodeURI(str1[0]); 
            urlList.push(str); }
          })
          Seite++;
          wenn(Seite<Seitenende){
            //Speichern Sie die URL der nächsten Seite
            x.path='/thread0806.php?fid=16'+'&search=&page='+page,
            getUrl(x);
          }sonst wenn(urlList.length!=0){
            fetchPage(urlList.shift());
          }anders{
            console.log('Keine Schlüsselwörter gefunden!');
          }
        })
  }).on('Fehler', Funktion (err) {
    console.log(fehler);
  });

}
Funktion startRequest(x) {
  wenn(temp===0){
    getUrl(x);     
  }   
  anders{
     //Verwenden Sie das http-Modul, um eine Get-Anfrage an den Server zu initiieren http.get(x, function (res) {     
        var html = ''; //Wird verwendet, um den gesamten HTML-Inhalt der angeforderten Webseite zu speichern res.setEncoding('binary');
        var Titel = [];        
	     //Auf das Datenereignis hören und jeweils einen Datenblock abrufen res.on('data', function (chunk) {   
	      html += Block;
	    });
	     // Auf das Endereignis warten. Wenn das HTML des gesamten Webseiteninhalts abgerufen wurde, führen Sie die Rückruffunktion res.on('end', function () { aus.
	    	var buf = neuer Puffer (html, „binär“);
	    	var str=iconv.decode(buf,'GBK');
	        var $ = cheerio.load(str); //Verwende das Cheerio-Modul, um HTML zu analysieren
	        var news_item = {
	          	//Titel des Artikels abrufen: $('h4').text().trim(),
	        	//i wird verwendet, um zu bestimmen, wie viele Artikel i erhalten wurden: i = i + 1,     
	      	};
	    console.log(news_item); //Informationen drucken var news_title = $('h4').text().trim();
		
	  	savedContent($,news_title); //Speichern Sie den Inhalt und den Titel jedes Artikels		
	  	savedImg($,news_title); //Speichern Sie das Bild und den Titel jedes Artikels		
	  	//Wenn der Zugriff nicht abgeschlossen ist, fahre mit dem Zugriff fort, if (urlList.length!=0) {
	    	fetchPage(urlList.shift());
	  	}
	});
}).on('Fehler', Funktion (err) {
    console.log(fehler);
  });
 }
}
       //Die Funktion dient zum lokalen Speichern der gecrawlten Textinhaltsressourcen function savedContent($, news_title) {
	$("div.t2[style].tpc_content.do_not_catch").jeweils(Funktion (Index, Element) {
          var x = $(dieser).text();       
          x = x + '\n';   
		  //Fügen Sie den Nachrichtentextinhalt Stück für Stück dem /data-Ordner hinzu und benennen Sie die Datei mit dem Titel der Nachricht fs.appendFile('./data/' + news_title + '.txt', x, 'utf-8', function (err) {
			  wenn (Fehler) {
			    console.log(fehler);
			  }
		  });
		})
 }
//Die Funktion dient zum lokalen Speichern der gecrawlten Bildressourcen function savedImg($,news_title) {
  //Erstelle einen Ordner fs.mkdir('./image/'+news_title, function (err) {
        wenn(err){console.log(err)}
      });
  $('.tpc_content.do_not_catch input[src]').jeder(Funktion (Index, Element) {
        var img_title = index; //Jedem Bild eine Nummer hinzufügen var img_filename = img_title + '.jpg';
        var img_src = $(this).attr('src'); // URL des Bildes abrufen
//Verwenden Sie das Anforderungsmodul, um eine Anforderung an den Server zum Abrufen von Bildressourcen zu initiieren request.head(img_src,function(err,res,body){
  wenn(fehler){
    console.log(fehler);
  }
});
setzeTimeout(Funktion(){
  Anfrage({uri: img_src, Kodierung: 'binär'}, Funktion (Fehler, Antwort, Text) {
    wenn (!Fehler && response.statusCode == 200) {
      fs.writeFile('./image/'+news_title+'/' + img_filename, body, 'binary', Funktion (Fehler) {
        wenn(err){console.log(err)}
      });
    }
  })
});
})
}
fetchPage(url); //Das Hauptprogramm wird gestartet

Ergebnisse:

Geben Sie hier die Bildbeschreibung ein

Dies ist das Ende dieses Artikels zum Erstellen eines einfachen Crawlers mit node.js. Weitere Informationen zum Erstellen eines einfachen Crawlers mit node.js finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Erste Erfahrungen mit dem Crawler-Framework node.js node-crawler
  • So erhalten Sie Wetterdaten und tägliche Grüße mit dem Node.js-Crawler
  • Implementierung eines node.js-Crawler-Tools basierend auf Cheerio (ein Crawler-Tool, das eine Anmeldeberechtigung erfordert)
  • Erläuterung zur Implementierung von Crawlern basierend auf node.js
  • Node.js-Lernunterlagen: Koa-Framework und einfache Crawler-Übungen
  • Erfahren Sie, wie Sie Website-Daten mit dem Node.js-Crawler crawlen
  • Node.js verwendet Cheerio, um ein einfaches Webcrawler-Beispiel zu erstellen
  • Eine kurze Erläuterung des Webseitenanforderungsmoduls des Node.js-Crawlers

<<:  SSM implementiert die Chiffretext-Anmeldefunktion für das Kennwort des MySQL-Datenbankkontos

>>:  Detaillierte Erläuterung der Methode zur Optimierung der MySQL-Datenbanktabellenstruktur

Artikel empfehlen

Der einfachste Weg, MySQL 5.7.20 mit yum in CentOS 7 zu installieren

Die Standarddatenbank von CentOS7 ist MariaDB, ab...

Basierend auf den Sonderzeichen in der URL-Escape-Kodierung

Inhaltsverzeichnis Sonderzeichen in URLs Escapeze...

Detaillierte Erklärung der Sperrstruktur in MySQL

Mysql unterstützt 3 Arten von Sperrstrukturen Spe...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 5.7.25

Es gibt zwei Arten von MySQL-Installationsdateien...

Vue implementiert eine Formularvalidierungsfunktion

Dieser Artikel beschreibt hauptsächlich, wie die ...

JavaScript, um den Effekt des Tab-Leistenwechsels zu erzielen

Registerkartenleiste: Klicken Sie auf verschieden...

Ladeanimation mit CSS3 implementiert

Ergebnisse erzielen Implementierungscode <h1&g...

Dinge, die Sie nicht über die CSS-Pseudoelemente ::before und ::after wissen

CSS hat zwei Pseudoklassen, die nicht häufig verw...

Verwenden von HTML+CSS zum Verfolgen von Mausbewegungen

Da Benutzer immer datenschutzbewusster werden und...

Einführung in Who-Befehlsbeispiele in Linux

Über wen Zeigt die am System angemeldeten Benutze...

SQL-Implementierung LeetCode (176. Zweithöchstes Gehalt)

[LeetCode] 176. Zweithöchstes Gehalt Schreiben Si...