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要出来了啊,妈蛋!好,言归正传,最近帮我的好基友扒数据,他说要一些股票债券的数据.我一听,那不就是要 ...
随机推荐
- 精读JavaScript模式(三),new一个构造函数居然发生了什么?
一.前言 上个月底,爸爸因为事故突然离世,说心里话,现在看到'去世','爸爸'这样的字眼,眼泪都会忍不住在眼眶打转,还是需要时间治愈.最近也只是零碎的看了下东西,始终沉不下心去读书,直到今天还是决定捡 ...
- javascript Uncaught ReferenceError: 方法名 is not defined
前言: 那天我犯了这样一个低级错误,如果按照这样下去,根本在这条路上走不远.错的太离谱,把代码拿出来自己笑笑,等摆脱菜鸟之名的时候再回来好好的告诉自己,都是这么过来的,原来以前我菜的这么离谱.. 错误 ...
- 移动APP开发框架盘点
移动APP开发框架盘点 总体概述 现在比较流行的移动APP开发框架有以下六种:网页.混合.渐进.原生.桥接.自绘.前三种体验与Web的体验相似,后三种与原生APP的体验相似.这六种框架形式,都有自己适 ...
- 正则表达式之javascript
1.正则表达式的定义 描述字符模式的对象,JavaScript的RepExp类表示正则表达式 var pattern = new RegExp("s\("); <=> ...
- MQTT再学习 -- MQTT 客户端源码分析
MQTT 源码分析,搜索了一下发现网络上讲的很少,多是逍遥子的那几篇. 参看:逍遥子_mosquitto源码分析系列 参看:MQTT libmosquitto源码分析 参看:Mosquitto学习笔记 ...
- 【Core】创建简单的Core MVC项目
创建项目: 首先:打开vs选中新建项目- >选中.NET Core - >ASP.NET Core Web应用程序: 然后:在选择web应用程序,注意上面要选中.net Core 别选错了 ...
- 【Java深入研究】2、JDK 1.8 LinkedList源码解析
LinkedList是一个实现了List接口和Deque接口的双端链表. 有关索引的操作可能从链表头开始遍历到链表尾部,也可能从尾部遍历到链表头部,这取决于看索引更靠近哪一端. LinkedList不 ...
- python 百度cpc点击
# coding=utf8 import urllib2 import string import urllib import re import random #设置多个user_agents,防止 ...
- php导出excel再IE下乱码问题
$userBrowser = $_SERVER['HTTP_USER_AGENT']; //判断是否是ie内核 $fileName = '会员列表-'.date('Y-m-d', time()).'. ...
- Mysql数据库多表查询
一.介绍 首先说一下,我们写项目一般都会建一个数据库,那数据库里面是不是存了好多张表啊,不可能把所有的数据都放到一张表里面,肯定要分表来存数据,这样节省空间,数据的组织结构更清晰,解耦和程度更高,但是 ...