Heim  >  Artikel  >  Web-Frontend  >  Node verwendet Puppeteer als Crawler

Node verwendet Puppeteer als Crawler

php中世界最好的语言
php中世界最好的语言Original
2018-06-07 14:06:002627Durchsuche

Dieses Mal werde ich Ihnen die Verwendung von Puppeteer als Crawler durch Node vorstellen. Was sind die Vorsichtsmaßnahmen für die Verwendung von Puppeteer als Crawler? Das Folgende ist ein praktischer Fall, schauen wir uns das an.

Architekturdiagramm

Puppeteer-Architekturdiagramm

  1. Puppeteer kommuniziert mit dem Browser über devTools

  2. Browser Eine Browser-Instanz (Chroium), die mehrere Seiten haben kann

  3. Seite Eine Seite, die mindestens einen Frame enthält

  4. Frame verfügt über mindestens eine Ausführungsumgebung zum Ausführen von Javascript und kann auch mehrere Ausführungsumgebungen erweitern

Vorwort

Ich möchte es kaufen Ein Desktop-Computer und ein Notebook i5 weisen offensichtliche Verzögerungen beim Öffnen von Webseiten und vsc auf, daher habe ich vor, einen i7 + GTX1070TI- oder GTX1080TI-Computer zu verwenden. Die direkte Suche auf Taobao erfordert zu viele Seiten und es gibt zu viele Bilder Ich kann es nicht ertragen, deshalb möchte ich einige Daten crawlen und Grafiken verwenden, um aktuelle Preistrends zu analysieren. Deshalb habe ich einen Crawler mit Puppeteer geschrieben, um relevante Daten zu crawlen.

Was ist Puppenspieler?

Puppeteer ist eine Node-Bibliothek, die eine High-Level-API zur Steuerung von Headless Chrome oder Chromium über das DevTools-Protokoll bereitstellt. Sie kann auch für die Verwendung von vollständigem (nicht Headless) Chrome oder Chromium konfiguriert werden.

Kurz gesagt handelt es sich bei diesem Produkt um eine Knotenbibliothek, die eine High-Level-API bereitstellt, die Chrome oder Chrom im Headless-Modus über Devtool steuern kann. Sie kann jede menschliche Operation im Headless-Modus simulieren.

Der Unterschied zwischen cheerio und cheerio

cherrico ist im Wesentlichen nur eine Bibliothek, die eine jquery-ähnliche Syntax zum Bearbeiten von HTML-Dokumenten verwendet. Bei der Verwendung von cherrico zum Crawlen von Daten wird nur statisches HTML angefordert .Dokument: Wenn die Daten innerhalb der Webseite dynamisch über Ajax abgerufen werden, können die entsprechenden Daten nicht gecrawlt werden. Puppeteer kann die Betriebsumgebung eines Browsers simulieren, Website-Informationen anfordern und die interne Logik der Website ausführen. Anschließend ruft es die Daten innerhalb der Seite dynamisch über das WS-Protokoll ab, kann alle simulierten Vorgänge ausführen (Klicken, Schieben, Schweben usw.) und unterstützt Seitensprünge und die Verwaltung mehrerer Seiten. Es kann sogar Skripte auf dem Knoten in die interne Umgebung des Browsers einfügen, um sie auszuführen. Kurz gesagt, es kann alles tun, was Sie auf einer Webseite tun können, und es kann auch Dinge tun, die Sie nicht tun können.

Start

Dieser Artikel ist keine Schritt-für-Schritt-Anleitung, daher benötigen Sie Grundkenntnisse der Puppeteer-API, wenn Sie sie nicht verstehen Lesen Sie zuerst die offizielle Einführung
Offizielle Puppeteer-Site
PuppeteerAPI

Zuerst beobachten wir die Website-Informationen, die wir crawlen möchten GTX1080

Dies ist die Taobao-Seite, die wir crawlen möchten Produktelemente in der Mitte sind die Inhalte, die wir crawlen müssen. Nach sorgfältiger Analyse seiner Struktur glaube ich, dass jedes Frontend über solche Funktionen verfügt.

Das von mir verwendete Typescript kann vollständige API-Tipps für Puppetter und verwandte Bibliotheken erhalten. Wenn Sie TS nicht kennen, müssen Sie nur den relevanten Code in die ES-Syntax ändern

// 引入一些需要用到的库以及一些声明
import * as puppeteer from 'puppeteer' // 引入Puppeteer
import mongo from '../lib/mongoDb' // 需要用到的 mongodb库,用来存取爬取的数据
import chalk from 'chalk' // 一个美化 console 输出的库
const log = console.log // 缩写 console.log
const TOTAL_PAGE = 50 // 定义需要爬取的网页数量,对应页面下部的跳转链接
// 定义要爬去的数据结构
interface IWriteData { 
 link: string // 爬取到的商品详情链接
 picture: string // 爬取到的图片链接
 price: number // 价格,number类型,需要从爬取下来的数据进行转型
 title: string // 爬取到的商品标题
}
// 格式化的进度输出 用来显示当前爬取的进度
function formatProgress (current: number): string { 
 let percent = (current / TOTAL_PAGE) * 100
 let done = ~~(current / TOTAL_PAGE * 40)
 let left = 40 - done
 let str = `当前进度:[${''.padStart(done, '=')}${''.padStart(left, '-')}]  ${percent}%`
 return str
}

Als nächstes beginnen wir um die Hauptlogik des Crawlers einzugeben

// 因为我们需要用到大量的 await 语句,因此在外层包裹一个 async function
async function main() {
 // Do something
}
main()
rrree

Denken

1 Warum Typescript verwenden?

Da Typescript so einfach zu verwenden ist, kann ich mir nicht alle Puppeteer-APIs merken und möchte nicht jede einzelne davon überprüfen, sodass ich TS verwenden kann, um intelligente Erinnerungen zu erhalten und zu vermeiden aufgrund eines Rechtschreibfehlers dumm sein. Grundsätzlich können Sie nach der Verwendung von TS den Code noch einmal eingeben

puppeteer.png

2. Was ist das Leistungsproblem des Crawler?

Da Puppeteer einen Browser startet und interne Logik ausführt, beansprucht er viel Speicher. Auf der Konsole belegt dieser Knotenprozess etwa 300 MB Speicher.

Meine Seiten werden einzeln gecrawlt. Wenn Sie schneller crawlen möchten, können Sie mehrere Prozesse starten. Beachten Sie, dass es in V8 keinen Sinn macht, mehrere Seiten innerhalb eines Prozesses zu öffnen Es muss so konfiguriert werden, dass verschiedene Knotenprozesse geöffnet werden. Dies ist natürlich auch über den Knotencluster (Cluster) möglich.
Ich habe auch unterschiedliche Wartezeiten während des Crawling-Prozesses festgelegt. Es dient einerseits dazu, darauf zu warten, dass die Webseite geladen wird, um zu verhindern, dass Taobao erkennt, dass ich ein Crawler-Bomben-Bestätigungscode bin

3 Andere Funktionen von Puppeteer

Hier verwenden wir nur einige grundlegende Funktionen von Puppeteer. Tatsächlich verfügt Puppeteer über mehr Funktionen. Beispielsweise wird die Verarbeitungsfunktion auf dem Knoten so eingeführt, dass sie im Browser ausgeführt wird, und die aktuelle Seite wird als PDF- oder PNG-Bild gespeichert. Und Sie können auch einen Browser mit Schnittstelleneffekten über const browser = waiting puppeteer.launch({ headless: false }) starten und sehen, wie Ihr Crawler funktioniert. Wenn Sie bei einigen Websites, für die eine Anmeldung erforderlich ist, den Bestätigungscode nicht zur Verarbeitung an Dritte weitergeben möchten, können Sie außerdem Headless deaktivieren, dann die Wartezeit im Programm festlegen und einige Überprüfungen manuell durchführen den Zweck der Anmeldung erreichen.

Natürlich hat Google eine so tolle Bibliothek erstellt, die nicht nur zum Crawlen von Daten verwendet wird. Diese Bibliothek wird auch für einige automatisierte Leistungsanalysen, Schnittstellentests, Front-End-Website-Überwachung usw. verwendet.

4. Einige andere Gedanken

Im Allgemeinen ist die Erstellung eines Crawlers zum Crawlen von Daten ein relativ komplexes Übungsprojekt, das viele grundlegende Fähigkeiten testet Wenn es um Async geht, erfordert dies ein umfassendes Verständnis von Async, Promise und anderen damit verbundenen Kenntnissen. Bei der Analyse des DOM zum Sammeln von Daten habe ich häufig auch native Methoden verwendet, um DOM-Attribute abzurufen (wenn die Website über JQuery verfügt, können Sie diese auch direkt verwenden. Wenn nicht, ist eine externe Injektion erforderlich. Unter Typoskript sind einige Konfigurationen erforderlich, um Berichte zu vermeiden (Auf diese Weise kann DOM durch die JQuery-Syntax manipuliert werden.) Außerdem wurde die Kompetenz in DOM-bezogenen APIs untersucht.

Außerdem handelt es sich hierbei lediglich um prozessorientierte Programmierung. Dies testet auch das OOP-Verständnis von ES.

Ich glaube, Sie haben es nach dem Lesen beherrscht Der Fall in diesem Artikel finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website.

Empfohlene Lektüre:

Eine Zusammenfassung der Verwendung des Statusobjekts von Vuex

Wie man Angular zum Starten einer Komponente verwendet

Das obige ist der detaillierte Inhalt vonNode verwendet Puppeteer als Crawler. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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