四、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入門 關聯查詢 在進行表設計時,往往需要在具體的業務基礎上分析表與表之間的
我們應該如何(以及為什麼)要將Typescript與Express、nodejs一起使用(譯文)
在我的職業生涯開始時,我是一名桌面應用開發人員,其中強型別語言佔據了市場主導地位。 當我遷移到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
四、Spring與Dao練手小案例
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 集群的高可用性的方案