In diesem Artikel erfahren Sie hauptsächlich, wie Sie NodeJS zum Erlernen von Crawlern verwenden, und erläutert die Verwendung und die Auswirkungen des Crawlens der Encyclopedia of Embarrassing Things.
1. Vorwort-Analyse
Wir verwenden normalerweise die Sprache Python/.NET, um Crawler zu implementieren, aber jetzt natürlich als Front-End-Entwickler Erfordert Kenntnisse in NodeJS. Lassen Sie uns die NodeJS-Sprache verwenden, um einen Crawler für die Encyclopedia of Embarrassing Things zu implementieren. Darüber hinaus haben einige der in diesem Artikel verwendeten Codes die ES6-Syntax.
Die zur Implementierung dieses Crawlers erforderlichen abhängigen Bibliotheken sind wie folgt.
Anfrage: Verwenden Sie die Get- oder Post-Methode, um den Quellcode der Webseite abzurufen. Cheerio: Analysieren Sie den Quellcode der Webseite und erhalten Sie die erforderlichen Daten.
In diesem Artikel werden zunächst die vom Crawler benötigten Abhängigkeitsbibliotheken und deren Verwendung vorgestellt. Anschließend werden diese Abhängigkeitsbibliotheken verwendet, um einen Webcrawler für Encyclopedia of Embarrassing Things zu implementieren.
2. Request-Bibliothek
request ist eine leichte http-Bibliothek, die sehr leistungsstark und einfach zu verwenden ist. Sie können damit HTTP-Anfragen implementieren und unterstützen HTTP-Authentifizierung, benutzerdefinierte Anfrageheader usw. Nachfolgend finden Sie eine Einführung in einige der Funktionen in der Anforderungsbibliothek.
Installieren Sie das Anforderungsmodul wie folgt:
npm install request
Nachdem die Anforderung installiert ist, können Sie jetzt die Anforderung verwenden, um Baidu-Webseiten anzufordern.
const req = require('request'); req('http://www.baidu.com', (error, response, body) => { if (!error && response.statusCode == 200) { console.log(body) } })
Wenn der Optionsparameter nicht festgelegt ist, ist die Anforderungsmethode standardmäßig eine Get-Anfrage. Die spezifische Methode, mit der ich das Anforderungsobjekt verwende, lautet wie folgt:
req.get({ url: 'http://www.baidu.com' },(err, res, body) => { if (!err && res.statusCode == 200) { console.log(body) } });
Allerdings erhalten wir oft nicht die Informationen, die wir benötigen, indem wir den von einer URL erhaltenen HTML-Quellcode direkt anfordern. Im Allgemeinen müssen Anforderungsheader und Webseitenkodierung berücksichtigt werden.
Webseiten-Anfrage-Header Webseiten-Codierung
Im Folgenden wird beschrieben, wie man einen Webseiten-Anfrage-Header hinzufügt und bei der Anfrage die richtige Codierung festlegt.
req.get({ url : url, headers: { "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36", "Host" : "www.zhihu.com", "Upgrade-Insecure-Requests" : "1" }, encoding : 'utf-8' }, (err, res, body)=>{ if(!err) console.log(body); })
Legen Sie den Optionsparameter fest und fügen Sie das Attribut headers
hinzu, um den Anforderungsheader festzulegen. Fügen Sie das Attribut encoding
hinzu, um die Codierung der Webseite festzulegen. Es ist zu beachten, dass bei encoding:null
der durch die Get-Anforderung erhaltene Inhalt ein Buffer
-Objekt ist, dh der Körper ist ein Pufferobjekt.
Die oben vorgestellten Funktionen reichen aus, um die folgenden Anforderungen zu erfüllen
3. Cheerio-Bibliothek
Cheerio ist ein Server- side Jquery wird von Entwicklern wegen seiner Funktionen wie Leichtigkeit, Schnelligkeit und einfacher Erlernbarkeit geliebt. Es ist sehr einfach, die Cheerio-Bibliothek zu erlernen, wenn man über Grundkenntnisse in Jquery verfügt. Es kann Elemente in Webseiten schnell finden und seine Regeln sind die gleichen wie die Methode von Jquery zum Auffinden von Elementen. Außerdem kann es den Inhalt von Elementen in HTML ändern und ihre Daten in einer sehr praktischen Form abrufen. Im Folgenden wird hauptsächlich Cheerio vorgestellt, um Elemente auf Webseiten schnell zu finden und deren Inhalte abzurufen.
Installieren Sie zuerst die Cheerio-Bibliothek
npm install cheerio
Das Folgende ist ein Codeteil und erklärt dann die Verwendung der Cheerio-Bibliothek. Analysieren Sie die Homepage des Blogparks und extrahieren Sie die Titel der Artikel auf jeder Seite.
Analysieren Sie zunächst die Homepage des Blogparks. Wie unten gezeigt:
Erhalten Sie nach der Analyse des HTML-Quellcodes zunächst alle Titel über .post_item
und analysieren Sie dann jeden .post_item
mit a.titlelnk
, der mit dem übereinstimmt ein Tag für jeden Titel. Das Folgende wird durch Code implementiert.
const req = require('request'); const cheerio = require('cheerio'); req.get({ url: 'https://www.cnblogs.com/' }, (err, res, body) => { if (!err && res.statusCode == 200) { let cnblogHtmlStr = body; let $ = cheerio.load(cnblogHtmlStr); $('.post_item').each((index, ele) => { let title = $(ele).find('a.titlelnk'); let titleText = title.text(); let titletUrl = title.attr('href'); console.log(titleText, titletUrl); }); } });
Natürlich unterstützt die Cheerio-Bibliothek auch Kettenaufrufe, und der obige Code kann auch wie folgt umgeschrieben werden:
let cnblogHtmlStr = body; let $ = cheerio.load(cnblogHtmlStr); let titles = $('.post_item').find('a.titlelnk'); titles.each((index, ele) => { let titleText = $(ele).text(); let titletUrl = $(ele).attr('href'); console.log(titleText, titletUrl);
Der obige Code ist sehr einfach, daher werde ich nicht näher darauf eingehen in Worten. Im Folgenden fasse ich einige Punkte zusammen, die ich für wichtiger halte.
Verwenden Sie die Methode find()
, um die Knotenmenge A zu erhalten. Wenn Sie das Element in der A-Menge erneut als Wurzelknoten verwenden, um seine untergeordneten Knoten zu lokalisieren und den Inhalt und die Attribute der untergeordneten Elemente abzurufen, erhalten Sie Sie müssen die untergeordneten Elemente im A-Satz vergleichen. Machen Sie eine $(A[i])
-Verpackung wie in $(ele)
oben. Verwenden Sie $(ele)
im obigen Code. Da ich jedoch die Pfeilfunktion von es6 verwende, habe ich den Zeiger dieser Funktion in der $(this)
-Methode geändert. Ich verwende each
; cheerio Die Bibliothek unterstützt auch Kettenaufrufe, wie zum Beispiel $(ele)
oben. Es ist zu beachten, dass das Cheerio-Objekt A die Methode $('.post_item').find('a.titlelnk')
aufruft Sammlung A ruft die Methode find()
auf und gibt ein kombiniertes Ergebnis zurück. Wenn A find()
aufruft, ruft jedes untergeordnete Element in der Sammlung von A text()
auf und gibt eine Zeichenfolge zurück, die die Vereinigung des Inhalts aller untergeordneten Elemente darstellt (direkte Vereinigung, keine Trennzeichen). text()
4. Peinlicher Enzyklopädie-Crawler
通过上面对 request
和 cheerio
类库的介绍,下面利用这两个类库对糗事百科的页面进行爬取。
1、在项目目录中,新建 httpHelper.js
文件,通过 url 获取糗事百科的网页源码,代码如下:
//爬虫 const req = require('request'); function getHtml(url){ return new Promise((resolve, reject) => { req.get({ url : url, headers: { "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36", "Referer" : "https://www.qiushibaike.com/" }, encoding : 'utf-8' }, (err, res, body)=>{ if(err) reject(err); else resolve(body); }) }); } exports.getHtml = getHtml;
2、在项目目录中,新建一个 Splider.js
文件,分析糗事百科的网页代码,提取自己需要的信息,并且建立一个逻辑通过更改 url 的 id 来爬取不同页面的数据。
const cheerio = require('cheerio'); const httpHelper = require('./httpHelper'); function getQBJok(htmlStr){ let $ = cheerio.load(htmlStr); let jokList = $('#content-left').children('p'); let rst = []; jokList.each((i, item)=>{ let node = $(item); let titleNode = node.find('h2'); let title = titleNode ? titleNode.text().trim() : '匿名用户'; let content = node.find('.content span').text().trim(); let likeNumber = node.find('i[class=number]').text().trim(); rst.push({ title : title, content : content, likeNumber : likeNumber }); }); return rst; } async function splider(index = 1){ let url = `https://www.qiushibaike.com/8hr/page/${index}/`; let htmlStr = await httpHelper.getHtml(url); let rst = getQBJok(htmlStr); return rst; } splider(1);
在获取糗事百科网页信息的时候,首先在浏览器中对源码进行分析,定位到自己所需要标签,然后提取标签的文本或者属性值,这样就完成了网页的解析。
Splider.js
文件入口是 splider
方法,首先根据传入该方法的 index 索引,构造糗事百科的 url,接着获取该 url 的网页源码,最后将获取的源码传入 getQBJok
方法,进行解析,本文只解析每条文本笑话的作者、内容以及喜欢个数。
直接运行 Splider.js
文件,即可爬取第一页的笑话信息。然后可以更改 splider
方法的参数,实现抓取不同页面的信息。
在上面已有代码的基础上,使用 koa
和 vue2.0
搭建一个浏览文本的页面,效果如下:
源码已上传到 github 上。下载地址:https://github.com/StartAction/SpliderQB ;
项目运行依赖 node v7.6.0
以上, 首先从 Github 上面克隆整个项目。
git clone https://github.com/StartAction/SpliderQB.git
克隆之后,进入项目目录,运行下面命令即可。
node app.js
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
Das obige ist der detaillierte Inhalt vonSchreiben eines Crawler-Beispiels mit NodeJS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!