Heim  >  Artikel  >  Web-Frontend  >  Node.js-Implementierung eines einfachen neuartigen Crawler-Beispiels

Node.js-Implementierung eines einfachen neuartigen Crawler-Beispiels

高洛峰
高洛峰Original
2016-12-06 14:25:591444Durchsuche

Aufgrund eines Mangels an Dramen folgte Boss einem Online-Drama von iQiyi, das aus Ding Mos gleichnamigem Roman „Beauty for Stuffing“ adaptiert wurde, obwohl das gesamte Drama bereits ausgebucht ist der Mängel, Boss, ich habe es wirklich genossen, es zu sehen, und nachdem ich die zweite Staffel gesehen hatte, fragte ich nach Romanressourcen und ging direkt zum Originalroman, um das Ende zu lesen ...

Ich habe einfach gesucht , und sie waren alle Online-Ressourcen, und ich habe sie heruntergeladen. Wenn Sie sich anmelden müssen, ist es in Ordnung, zum Spaß einen Crawler zu schreiben. Ich werde mir hier Notizen machen 🎜>

Workflow

Rufen Sie die Liste der URLs ab (Ressourcen-Anforderungsmodul anfordern)

Beziehen Sie den relevanten Seitenquellcode gemäß der URL-Liste (es können Probleme bei der Seitenkodierung auftreten, iconv-lite-Modul)

Quellcode-Analyse, neuartige Informationen erhalten (Cheerio-Modul)

Speichern Sie die neuartigen Informationen in einer Markdown-Datei und fügen Sie entsprechende Änderungen und Kapitelinformationen hinzu (Datei fs schreiben, synchronisieren Ressourcenanforderungs-Synchronisierungsanforderungsmodul)

Markdown in PDF konvertieren (verwenden Sie die Druckfunktion von Pandoc oder Chrome)

URLs abrufen


Laut der Navigationsseite des Romans , rufen Sie die URLs aller Kapitel des Romans ab und speichern Sie sie in einem JSON-Array.

Die erste Möglichkeit besteht darin, den Quellcode der Seite über die Methode http.get() abzurufen

Holen Sie sich den Quellcode, drucken Sie verstümmelte chinesische Zeichen aus und suchen Sie sie, überprüfen Sie und finden Sie charset = 'gbk' , muss transkodiert werden

Verwenden Sie zum Transkodieren das Iconv-Lite-Modul. Nachdem die chinesische Anzeige normal ist, beginnen Sie mit dem Parsen des Quellcodes und erhalten Sie die erforderliche URL. Um das Parsen zu vereinfachen, müssen Sie das einführen cheerio-Modul. cheerio kann als im Hintergrund ausgeführtes jQuery verstanden werden und ist der Verwendung von jQuery sehr ähnlich.

Laden Sie den Quellcode in cheerio Im Code haben wir erfahren, dass alle Kapitelinformationen in einem von div umschlossenen Tag gespeichert sind. Verwenden Sie cheerio, um die qualifizierte Tag-Gruppe zu extrahieren, zu durchlaufen, den Titel und die URL des Kapitels abzurufen, es als Objekt zu speichern und es in einem Array zu speichern (Da die im Link gespeicherte URL unvollständig ist, muss sie beim Speichern vervollständigt werden)

Serialisieren Sie das Objektarray und schreiben Sie es in die list.json-Datei

var http = require("http")
var fs = require("fs")
var cheerio = require("cheerio")
var iconv = require("iconv-lite")
var url = 'http://www.17fa.com/files/article/html/90/90747/index.html'
http.get(url, function(res) { //资源请求
  var chunks = []
  res.on('data', function(chunk) {
    chunks.push(chunk)
  })
  res.on('end', function() {
    var html = iconv.decode(Buffer.concat(chunks), 'gb2312') //转码操作
    var $ = cheerio.load(html, {
      decodeEntities: false
    })
    var content = $("tbody")
    var links = []
    $('div').children('a').each(function(i, elem) {
      var link = new Object()
      link.title = $(this).text()
      link.link = 'http://www.17fa.com/files/article/html/90/90747/' + $(this).attr('href') //补齐 URL 信息
      if (i > 5) {
        links.push(link)
      }
    })
    fs.writeFile("list.json", JSON.stringify(links), function(err) {
      if (!err) {
        console.log("写文件成功")
      }
    })
  }).on('error', function() {
    console.log("网页访问出错")
  })
})

Beispiel für eine erhaltene Liste

[{
  "title": "3 法医司白",
  "link": "http://www.17fa.com/files/article/html/90/90747/16548771.html"
}, {
  "title": "4 第1个梦 ",
  "link": "http://www.17fa.com/files/article/html/90/90747/16548772.html"
}, {
  "title": "5 刑警韩沉 ",
  "link": "http://www.17fa.com/files/article/html/90/90747/16548773.html"
}, {
  "title": "6 最初之战",
  "link": "http://www.17fa.com/files/article/html/90/90747/16548774.html "
}]

Erhalten von Daten


Mit der Liste der URLs werden die Die nächste Arbeit ist jedoch sehr mechanisch. Sie durchläuft die Liste der URLs, um Ressourcen anzufordern, den Quellcode zu erhalten, Romane zu erhalten und Dateien zu schreiben Die Kapitel müssen sichergestellt sein, daher erfordert das Schreiben von Dateien synchrone Vorgänge. Tatsächlich wurden beim Codieren alle Vorgänge in den synchronen Modus geändert

Holen Sie sich den Quellcode


Durch Parsen der Lesen Sie die Datei list.json, rufen Sie die Liste der URLs ab und durchlaufen Sie die Liste, um Ressourcen zu erhalten. Da die Reihenfolge der Kapitel sichergestellt werden muss, wird hier das Sync-Request-Modul eingeführt, um synchrone Anforderungsanforderungen für Ressourcen auszuführen Ressourcen, sie werden wie gewohnt transkodiert

var http = require("http")
var fs = require("fs")
var cheerio = require("cheerio")
var iconv = require("iconv-lite")
var request = require('sync-request')
var urlList = JSON.parse(fs.readFileSync('list.json', 'utf8'))
function getContent(chapter) {
  var res = request('GET',chapter.link)
  var html = iconv.decode(res.body, 'gb2312') //获取源码
}
for (let i = 0; i < urlList.length; i++) {
  getContent(urlList[i])
}

Parsen Sie den Quellcode, um den Roman zu erhalten


Oder erhalten Sie den Inhalt des Romans Um das Erscheinungsbild nicht zu beeinträchtigen, entfernen Sie es über das Cheerio-Modul vor dem Schreiben. Die HTML-Tags im Inhalt

function getContent(chapter) {
  var res = request(&#39;GET&#39;,chapter.link)
  var html = iconv.decode(res.body, &#39;gb2312&#39;)
  var $ = cheerio.load(html, {
    decodeEntities: false
  })
  var content = ($("div#r1c").text()).replace(/\ /g, &#39;&#39;)
}

Speichern Sie den Roman


Der Schreibvorgang erfordert auch einen synchronen Betrieb, daher wird zum ersten Mal die Funktion fs.writeFileSync() und die synchrone Additionsfunktion fs.appendFileSync() verwendet Um das Leseerlebnis zu verbessern, wird vor jedem Kapitel ein Titel


hinzugefügt.

Sie können auch [Inhaltsverzeichnis] ​​als Navigationslink vor dem Inhalt hinzufügen

Node.js-Implementierung eines einfachen neuartigen Crawler-Beispiels

var http = require("http")
var fs = require("fs")
var cheerio = require("cheerio")
var iconv = require("iconv-lite")
var path = require(&#39;path&#39;)
var urlList = JSON.parse(fs.readFileSync(&#39;list.json&#39;, &#39;utf8&#39;))
function getContent(chapter) {
  console.log(chapter.link)
  http.get(chapter.link, function(res) {
    var chunks = []
    res.on(&#39;data&#39;, function(chunk) {
      chunks.push(chunk)
    })
    res.on(&#39;end&#39;, function() {
      var html = iconv.decode(Buffer.concat(chunks), &#39;gb2312&#39;)
      var $ = cheerio.load(html, {
        decodeEntities: false
      })
      var content = ($("div#r1c").text()).replace(/\ /g, &#39;&#39;)
      if (fs.existsSync(&#39;美人为馅.md&#39;)) {
        fs.appendFileSync(&#39;美人为馅.md&#39;, &#39;### &#39; + chapter.title)
        fs.appendFileSync(&#39;美人为馅.md&#39;, content)
      } else {
        fs.writeFileSync(&#39;美人为馅.md&#39;, &#39;### &#39; + chapter.title)
        fs.appendFileSync(&#39;美人为馅.md&#39;, content)
      }
    })
  }).on(&#39;error&#39;, function() {
    console.log("爬取" + chapter.link + "链接出错!")
  })
}
for (let i = 0; i < urlList.length; i++) {
  console.log(urlList[i])
  getContent(urlList[i])
}
Markdown in PDF


Ich werde den Roman in einer Markdown-Datei konvertieren. Um das Leseerlebnis zu verbessern, können Sie die Markdown-Datei in eine PDF-Datei konvertieren . Derzeit bevorzuge ich die Druckfunktion von Chrome und die Pandoc-Konvertierung.

Chrome-Druck


SublimeText verfügt über eine Plug-in-Markdown-Vorschau Klicken Sie mit der rechten Maustaste auf die Chrome-Seite und wählen Sie „Als PDF speichern“. Es ist einfach, grob und hat mich beeindruckt:

pandoc-KonvertierungNode.js-Implementierung eines einfachen neuartigen Crawler-Beispielspandoc ist ein sehr leistungsfähiges Dateiformat-Konvertierungstool, das Markdown-Dateien in mehrere Formate konvertieren kann. Ich hatte heute Abend unter Windows 10 Probleme, aber ich Ich kann pdflatex immer noch nicht abrufen. Bezüglich Pandoc werde ich später eine Zusammenfassung schreiben.

Das PDF wurde an den Chef gesendet und ich lese es jetzt

Über Python, Node und Crawler

Schon lange vorher habe ich Ich wollte Python verwenden, ich möchte unbedingt einen Crawler schreiben, und ich möchte sogar Python verwenden, um einen Crawler zu schreiben. Je umfassender das Wissen wird, desto mehr verschwindet die Obsession ist viel weniger „Nachdenken“. Wenn Dinge passieren, denke ich mehr darüber nach, aktiv zu werden und zu üben, um wahres Wissen zu erlangen.

Stellungnahme:
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