1. 程式人生 > >四、nodejs使用 superagent 與 cheerio 完成簡單爬蟲

四、nodejs使用 superagent 與 cheerio 完成簡單爬蟲

目標

輸出 CNode(https://cnodejs.org/ ) 社群首頁的所有帖子標題和連結,以 json 的形式。

  • 使用 superagent 抓取網頁
  • 使用 cheerio 分析網頁

內容

安裝依賴 express,superagent 和 cheerio

$ npm install express superagent cheerio --save
superagent

superagent是個 http 方面的庫,可以發起 get 或 post 請求。 https://cnodejs.org/topic/5378720ed6e2d16149fa16bd

一個簡單的post請求,並設定請求頭資訊的例子

request
    .post('/api/pet')
    .send({ name: 'Manny', species: 'cat' })
    .set('X-API-Key', 'foobar')
    .set('Accept', 'application/json')
    .end(function(res){
         if (res.ok) {
           alert('yay got ' + JSON.stringify(res.body));
         } else {
           alert('Oh no! error ' + res.text);
         }
    });

一個簡單的get請求

 request
   .get('/search')
   .end(function(res){

   });

請求方法也可以通過引數傳遞:

request('GET', '/search').end(callback);

delete,head,post,put和別的http動作都可以使用,來換個方法看看:

request
  .head('/favicon.ico')
  .end(function(res){

  });

delete是一個特列,因為它是系統保留的關鍵字,所以應該用.del()這個名字:

request
  .del('/user/1')
  .end(function(res){

  });

http請求預設的方法為get,所以就像你看到的,下面的這個例子也是可用的:

request('/search', function(res){

 });
cheerio

大家可以理解成一個 Node.js 版的 jquery,用來從網頁中以 css selector 取資料,使用方式跟 jquery 一樣的。

https://github.com/cheeriojs/cheerio

抓取資料

// 引入依賴
var express = require('express');
var superagent = require('superagent');
var cheerio = require('cheerio');

var app = express();

app.get('/', function(req, res, next) {
    // 用 superagent 去抓取 https://cnodejs.org/ 的內容
    superagent.get('https://cnodejs.org/')
        .end(function(err, sres) {
            if (err) {
                return next(err);
            }

            // sres.text 裡面儲存著網頁的 html 內容,將它傳給 cheerio.load 之後,就可以得到一個實現了 jquery 介面的變數,我們習慣性地將它命名為 `$`
            // 剩下就都是 jquery 的內容了
            var $ = cheerio.load(sres.text);
            
            var items = [];
            var tt = null;
            $('#topic_list .topic_title').each(function(index, elem) {
                var $element = $(elem);
                items.push({
                    title: $element.attr('title'),
                    href: $element.attr('href'),
                });
            });

            res.send(items);
        });
});

app.listen(3000, function (req, res) {
    console.log('app is running at port 3000');
});

相關推薦

nodejs使用 superagent cheerio 完成簡單爬蟲

目標 輸出 CNode(https://cnodejs.org/ ) 社群首頁的所有帖子標題和連結,以 json 的形式。 使用

C# 二十值傳遞引用傳遞

值傳遞 使用值傳遞時,向形式引數傳遞的是實在引數的副本,方法內發生的對形式引數的更改對實在引數本身沒有任何影響。 程式碼示例: static void Main(string[] args) { int i =

三十Linux 程序訊號——訊號特點訊號集和訊號遮蔽函式

34.1 訊號特點 訊號的發生是隨機的,但訊號在何種條件下發生是可預測的 程序槓開始啟動時,所有訊號的處理方式要麼預設,要麼忽略;忽略是 SIGUSR1 和 SIGUSR2 兩個訊號,其他都採取預設方式(大多數是終止程序)。 程序在呼叫 exec 函式後,原有訊號的捕捉函式失效 子程序的誕

實際springMVC專案中自定義異常spring事務異常的簡單應用

一、異常相關知識: 非執行時異常(Checked Exception) Java中凡是繼承自Exception但不是繼承自RuntimeException的類都是非執行時異常。 執行時異常(Runtime Exception/Unchecked Excep

Git入門基本使用(4)

沒有 object mod second osi type mark apply save 16、把連續的多個commit整理成1個 commit ce587039661c88fd508035fd103a012e33c057ac (HEAD -> temp) Auth

原型模式建造者模式詳解

5.原型模式 5.1.課程目標 1、掌握原型模式和建造者模式的應用場景 2、掌握原型模式的淺克隆和深克隆的寫法。 3、掌握建造者模式的基本寫法。 4、瞭解克隆是如何破壞單例的。 5、瞭解原型模式的優、缺點 6、掌握建造者模式和工廠模式的區別。 5.2.內容定位 1、已瞭解並掌握工廠模式的人群。 2、已瞭解並掌

簡單排序之冒泡排序

sort mage bubble 如圖所示 class 簡單排序 源代碼 emp i++ 原理如圖所示(畫圖太醜將就看看): 源代碼: public class Bubblesort { public static void bubblesort(int

Netty實現webSocket,實現伺服器瀏覽器(HTML)線上聊天功能

        由於http協議有一個缺陷:通訊只能由客戶端發起。如果伺服器有連續的狀態變化,客戶端要獲知只能使用"輪詢":每隔一段時候,就發出一個詢問,瞭解伺服器有沒有新的資訊。輪詢的效率低,非常浪費資源(因為必須不停連線,或者 HTTP 連線始終開啟)

C#程式設計基礎第課2:使用if語句if-else語句多重if語句巢狀if語句完成的C#控制檯小程式

知識點:基本算術運算、簡單if語句、if-else語句的練習。利用語句完成簡單C#控制檯程式。 1、運用if-else語句,判斷使用者輸入的年份是否是閏年 static void Main(string[] args) { /*

簡單學習Mysql語句之檢視

Mysql檢視 1、建立檢視 --格式:CREATE VIEW 檢視名稱 AS SQL語 例: create view v1 as select * from a where part_nid > 3 2、刪除檢視 --格式:DROP VIEW 檢視名稱 例: drop vi

《隨筆》——C#中的 “ 索引器和屬性的相同點和不同點索引器陣列的區別索引器的過載 ”

目錄 索引器和屬性的相同點和不同點 索引器與陣列的區別 索引器的過載 關於索引器的詳細請看這裡《隨筆三》——C#中的“ 索引器”  https://blog.csdn.net/qq_34536551/article/details/83926260 索引器(

mybatis基礎系列()——關聯查詢延遲載入一級快取二級快取

關本文是Mybatis基礎系列的第四篇文章,點選下面連結可以檢視前面的文章: mybatis基礎系列(三)——動態sql mybatis基礎系列(二)——基礎語法、別名、輸入對映、輸出對映 mybatis基礎系列(一)——mybatis入門 關聯查詢 在進行表設計時,往往需要在具體的業務基礎上分析表與表之間的

我們應該如何(以及為什麼)要將TypescriptExpressnodejs一起使用(譯文)

在我的職業生涯開始時,我是一名桌面應用開發人員,其中強型別語言佔據了市場主導地位。 當我遷移到Web開發時,我對JavaScript和Python等語言的每個新功能都很著迷。事實上,我沒有必要宣告變數的型別,這極大的提高了我的生產力,並且使我的工作變得更有趣了。 所以我第一次聽說TypeSc

逆矩陣轉置矩陣

http://www.cnblogs.com/Dumblidor/p/5760606.html 一、關於逆元   (這裡看不懂可以跳過)   在群論中有“逆元”這一概念。   提到逆元就要提到另一個概念:單位元(么元,Identity)。   我們依次來介紹,簡單來說,設G是一個

multiset多重集合容器set集合容器的區別

簡介:multiset與set大體上是一樣的,唯一不同的是,multiset允許重複的元素鍵值插入,set是不允許的。關於set集合容器的詳細內容看:https://blog.csdn.net/ysz171360154/article/details/84142947    mu

SpringDao練手小案例

1.分析 程式碼分為三層,分別為dao、service和test(測試用,暫時不涉及web)。 每個類擁有自己的介面和實現類。 2.Dao 包名是com.itlike.dao UserDao(介面) package com.itlike

[Xcode10 實際操作]常用控制元件-(15)MKMapView載入簡單檢視

本文將演示地圖檢視的使用方法。 在專案導航區,開啟檢視控制器的程式碼檔案【ViewController.swift】 1 import UIKit 2 //首先往檢視控制器類檔案中,引入地圖框架 3 import MapKit 4 5 //新增地理地圖代理協議MKMapViewD

JAVA筆記:介面lambda表示式內部類

一、介面 1.1介面的概念 介面不是類,而是對類的一組需求描述 ,介面所有方法自動為public,當然在定義介面的時候加上也不違反語法規則。 java.lang.Comparable<T>1.0 int compareTo(T other) //小於other則返回負

redis系列之主從複製哨兵機制

1. 緒言   在現實應用環境中,出於資料容量、容災、效能等因素的考慮,往往不會只使用一臺伺服器,而是使用叢集的方式。Redis 中也有類似的維持一主多從的方式提高 Redis 叢集的高可用性的方案,而其中不可避免的則是如何保證主從例項間的資料一致性,複製(Replication)是其解決辦法。本篇介紹re

redis系列之主從復制哨兵機制

添加 連接 管理 block 也有 daemonize toc 導出 拓撲 1. 緒言   在現實應用環境中,出於數據容量、容災、性能等因素的考慮,往往不會只使用一臺服務器,而是使用集群的方式。Redis 中也有類似的維持一主多從的方式提高 Redis 集群的高可用性的方案