node爬虫扒小说
Step 1: 万年不变的初始化项目,安装依赖
cnpm i express cheerio superagent superagent-charset async -S
express 就不用多说了,比较流行的node框架
cheerio 页面数据解析模块。一般都习惯称它node版的jquery,专门用来操作网页dom元素,使用方式和jquery基本相同。
superagent superagent是nodejs里一个非常方便的客户端请求代码模块,superagent是一个轻量级的,渐进式的ajax API,可读性好,学习曲线低,内部依赖nodejs原生的请求API,适用于nodejs环境下。
superagent-charset 很明显,处理编码的。
async 见名知意,node的异步模块。
Step 2: 编写node程序
/*
以爬取起点小说某文为例
*/
// 1. 首先引入模块
const cheerio = require('cheerio')
const express = require('express')
const app = express()
const superagent = require('superagent')
require('superagent-charset')(superagent)
const async = require('async'); let total = 0 // 总章节数
let id = 0 // 计数器
const chapter = 10 // 爬取多少章
const url = 'https://book.qidian.com/info/1011146676#Catalog' // 章节列表页面
// 处理请求
app.get('/',(req,response,next)=>{
superagent.get(url).charset('UTF-8').end((err,res)=>{
var $ = cheerio.load(res.text); // 读取章节列表页面
let urls = []
total = $(".volume-wrap li").length // 获取所以章节元素拿到总章节数
// 循环获取每个章节的页面url并push进urls
$('.volume-wrap li').each(function(i,v){
if(i < chapter){
urls.push('http:' + $(v).find("a").attr('href'))
}
})
// 通过async去请求urls里的地址,并通过fetchUrl方法拆分数据。这里的async.mapLimit方法有点类似es6里的promise.all
async.mapLimit(urls,chapter,(url,callback)=>{
id++
fetchUrl(url,callback,id);
},(err,results)=>{
response.send(results); })
})
}) // 去空格和空格转义字符
function trim(str){
return str.replace(/(^\s*)|(\s*$)/g, '').replace(/ /g, '')
} // 将Unicode转汉字
function reconvert(str) {
str = str.replace(/(&#x)(\w{1,4});/gi, function ($0) {
return String.fromCharCode(parseInt(escape($0).replace(/(%26%23x)(\w{1,4})(%3B)/g, "$2"), 16));
});
return str
} // 加载每个章节并拆分数据返回
function fetchUrl(url,callback,id){
superagent.get(url)
.charset('UTF-8')
.end(function(err,res){
let $ = cheerio.load(res.text);
let arr = []
let content = reconvert($(".read-content").html()) const obj = {
id: id,
err: 0,
bookName: $('.text-info a').eq(0).text().substring(1),
title: $('.j_chapterName').text(),
content: content.toString()
}
callback(null,obj)
})
} // 监听窗口
const PORT = 8080
app.listen(PORT,function(){
console.log("server listening on " + PORT)
})
最后,运行node程序,本地打开localhost:8080 就可以看到数据了

node爬虫扒小说的更多相关文章
- 继续node爬虫 — 百行代码自制自动AC机器人日解千题攻占HDOJ
前言 不说话,先猛戳 Ranklist 看我排名. 这是用 node 自动刷题大概半天的 "战绩",本文就来为大家简单讲解下如何用 node 做一个 "自动AC机&quo ...
- Node爬虫
Node爬虫 参考 http://www.cnblogs.com/edwardstudy/p/4133421.html 所谓的爬虫就是发送请求,并将响应的数据做一些处理 只不过不用浏览器来发送请求 需 ...
- python爬虫之小说网站--下载小说(正则表达式)
python爬虫之小说网站--下载小说(正则表达式) 思路: 1.找到要下载的小说首页,打开网页源代码进行分析(例:https://www.kanunu8.com/files/old/2011/244 ...
- node爬虫gbk中文乱码问题
刚入坑node 写第二个node爬虫时,遇到了这个坑,记录一下. 主要步骤: 1.安装iconv-lite 输入npm install iconv-lite 2.将接收到的网页源码以二进制的方式存储下 ...
- 简单的node爬虫练手,循环中的异步转同步
简单的node爬虫练手,循环中的异步转同步 转载:https://blog.csdn.net/qq_24504525/article/details/77856989 看到网上一些基于node做的爬虫 ...
- node爬虫(简版)
做node爬虫,首先像如何的去做这个爬虫,首先先想下思路,我这里要爬取一个页面的数据,要调取网页的数据,转换成页面格式(html+div)格式,然后提取里面独特的属性值,再把你提取的值,传送给你的页面 ...
- node 爬虫 --- 批量下载图片
步骤一:创建项目 npm init 步骤二:安装 request,cheerio,async 三个模块 request 用于请求地址和快速下载图片流. https://github.com/reque ...
- node爬虫的几种简易实现方式
说到爬虫大家可能会觉得很NB的东西,可以爬小电影,羞羞图,没错就是这样的.在node爬虫方面,我也是个新人,这篇文章主要是给大家分享几种实现node 爬虫的方式.第一种方式,采用node,js中的 s ...
- 有趣的Node爬虫,数据导出成Excel
最近一直没更新了诶,因为学习Backbone好头痛,别问我为什么不继续AngularJs~因为2.0要出来了啊,妈蛋!好,言归正传,最近帮我的好基友扒数据,他说要一些股票债券的数据.我一听,那不就是要 ...
随机推荐
- Angular学习第一步
前端开发越来越流行了,作为后端开发人员,也开始需要学习前端了.随着前端技术的发展,前端技术也越来越复杂,复杂程度不亚于后端,各种框架各种设计模式前端都用上了,什么AngularJS,Angular, ...
- 深入理解 Java 虚拟机
Java 代码编译和执行的整个过程 Java 代码编译是由 Java 源码编译器来完成,流程图如下所示: Java 字节码的执行是由 JVM 执行引擎来完成,流程图如下所示: Java 代码编译和执行 ...
- SpringBoot入门之集成JSP
原本打算这篇继续写thymeleaf方面的内容,一看内容还挺多的,可能一周也写不完,而且从Controller获取值等内容也都能从网上百度,所以就写了springboot集成jsp.不管thymele ...
- [转]在Node.js中使用RabbitMQ系列一 Hello world
本文转自:https://www.cnblogs.com/cpselvis/p/6288330.html 在前一篇文章中可伸缩架构简短系列中提到过关于异步的问题.当时推荐使用RabbitMQ来做任务队 ...
- C# 常用的加密代码参考
1.MD5加密 public static string EncryptString(string source) { string result; if (source == string.Empt ...
- csharp: DefaultValueAttribute Class
public class CalendarEvent { public int id { get; set; } public string title { get; set; } public st ...
- 【读书笔记】iOS-后台运行模式
苹果在关于后台模式的文档中称:“这个配置项应该尽可能少的使用,而且最好只给那些提供通知服务的应用使用.如果有在后台运行的替代方法,就应该使用替代方法.比如,如果应用能使用显著位置变化接口来接受位置变动 ...
- python之 协程
协程: 协程是一种用户态的轻量级线程, 即协程是由用户程序自己控制调度的 1.Greenlet import time # import greenlet from greenlet import g ...
- Windows下 webpack4.0 的安装
这里我们通过npm来进行安装 1. 安装 webpack // 全局安装webpack npm install webpack -g 2. 通过 webpack -v 命令查看当前安装的版本 此时如果 ...
- Fragment问题集
最近做一个APP ,因为在慕课网上学习到了新的方法来做Tab(APP主界面)效果,所以刚学不久久用起来了 用的Fragment实现Tab方法 查询了一下午的安卓资料,关于这个东西是在安卓3.0以后的 ...