基于nodeJS的小说爬虫实战
背景与需求分析
最近迷恋于王者荣耀、斗鱼直播与B站吃播视频,中毒太深,下班之后无心看书。
为了摆脱现状,能习惯看书,我开始看小说了,然而小说网站广告多而烦,屌丝心态不愿充钱,于是想到了爬虫。
功能分析
为了将网上小说内容获取到本地,进行了功能分析:
1、获取每个章节列表地址
2、更加每个章节地址,获取每个章节的内容
3、将获取的各个章节内容有序的写入文件
技术调研
作为一个前端er,实现爬虫nodeJS必须是首选,虽然数据挖掘Python才是真理
npm依赖如下
1、爬取内容 superagent
2、分析爬取的内容 cheerio
3、并发 async
4、文件写入 fs
编码实现
xiaoshuo.js代码如下
const cheerio = require('cheerio')
const superagent = require('superagent')
require('superagent-charset')(superagent)
const async = require('async');
const fs = require('fs');
let baseUrl = 'http://www.xxx.com/book/14435/';
let infos = [];
let urls = [];
let titles = [];
let fileName = '';
superagent.get(baseUrl).charset('UTF-8').end((err,res)=>{
var $ = cheerio.load(res.text);
// 读取章节列表页面
$('.am-book-list').eq(1).find('.am-u-lg-4 a').each((i, v) => {
let link = 'http://www.xxx.com' + $(v).attr('href')
urls.push(link);
fileName = $('.am-book-info h2').text()+'.txt';
})
let id = 0;
//获取每个章节列表
async.mapLimit(urls,urls.length,(url,callback)=>{
id++
fetchUrl(url,callback,id);
},(err,results)=>{
//将文件写入本地
fs.existsSync(fileName);
for(var i = 0;i<results.length-1;i++){
fs.appendFileSync(fileName, results[i].title) //
fs.appendFileSync(fileName, results[i].content)
}
})
})
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($("#am-read-centent").text())
const obj = {
id: id,
err: 0,
title: '\n'+$('#am-book-h3').text(), //标题
content: '\n'+trim(content.toString()) //内容
}
callback(null,obj)
})
}
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 trim(str){
return str.replace(/(^\s*)|(\s*$)/g, '').replace(/ /g, '')
}
为了避免坐牢,站点使用xxx代替,
运行效果
在命令行运行 node xiaoshuo,试验了本小说,好像还是ok的,哈哈哈

基于nodeJS的小说爬虫实战的更多相关文章
- python 基于aiohttp的异步爬虫实战
钢铁知识库,一个学习python爬虫.数据分析的知识库.人生苦短,快用python. 之前我们使用requests库爬取某个站点的时候,每发出一个请求,程序必须等待网站返回响应才能接着运行,而在整个爬 ...
- 基于NodeJs的网页爬虫的构建(二)
好久没写博客了,这段时间已经忙成狗,半年时间就这么没了,必须得做一下总结否则白忙.接下去可能会有一系列的总结,都是关于定向爬虫(干了好几个月后才知道这个名词)的构建方法,实现平台是Node.JS. 背 ...
- 基于NodeJs的网页爬虫的构建(一)
好久没写博客了,这段时间已经忙成狗,半年时间就这么没了,必须得做一下总结否则白忙.接下去可能会有一系列的总结,都是关于定向爬虫(干了好几个月后才知道这个名词)的构建方法,实现平台是Node.JS. 背 ...
- 浏览器自动刷新——基于Nodejs的Gulp LiveReload与VisualStudio完美结合。
本文版权桂博客园和作者吴双共同所有,转载和爬虫请注明原文地址 http://www.cnblogs.com/tdws/p/6016055.html 写在前面 大家好我是博客园的蜗牛,博客园的蜗牛就是我 ...
- 基于nodejs模拟浏览器post请求爬取json数据
今天想爬取某网站的后台传来的数据,中间遇到了很多阻碍,花了2个小时才请求到数据,所以我在此总结了一些经验. 首先,放上我所爬取的请求地址http://api.chuchujie.com/api/?v= ...
- 爬虫实战:爬虫之 web 自动化终极杀手 ( 上)
欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:陈象 导语: 最近写了好几个简单的爬虫,踩了好几个深坑,在这里总结一下,给大家在编写爬虫时候能给点思路.本次爬虫内容有:静态页面的爬 ...
- iKcamp团队制作|基于Koa2搭建Node.js实战项目教学(含视频)☞ 环境准备
安装搭建项目的开发环境 视频地址:https://www.cctalk.com/v/15114357764004 文章 Koa 起手 - 环境准备 由于 koa2 已经开始使用 async/await ...
- 32个Python爬虫实战项目,满足你的项目慌
爬虫项目名称及简介 一些项目名称涉及企业名词,小编用拼写代替 1.[WechatSogou]- weixin公众号爬虫.基于weixin公众号爬虫接口,可以扩展成其他搜索引擎的爬虫,返回结果是列表,每 ...
- Python爬虫实战---抓取图书馆借阅信息
Python爬虫实战---抓取图书馆借阅信息 原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约 ...
随机推荐
- NTP服务及时间同步
环境: centos7 server 192.168.2.171 client 192.168.2.173.192.168.2.174 整体思路:173.174同步171的时间,171定时同 ...
- robotframework FOR循环
#获取到的ID组装成一个list ${List_ID} Create List ${ID_1} ${ID_2} ${ID_3} ${ID_4} ${ID_5} ... ${ID_6} ${ID_7} ...
- C# 数组转字符串显示
, , , , , , , }; arry[] = (] | ); string result = String.Join("", arry); Console.WriteLine ...
- java.lang.UnsupportedOperationException at java.util.AbstractList
常常使用Arrays.asLisvt()后调用add,remove这些method时出现 Java.lang.UnsupportedOperationException异常.这是由于: Arrays. ...
- C/C++字符串转换函数;
字符串转数字: char 转 int 函数: atoi wchar 转 int 函数: _wtoi 数字转字符串: std::to_string(): std::to_wsting();
- 数据结构图之三(最短路径--迪杰斯特拉算法——转载自i=i++
数据结构图之三(最短路径--迪杰斯特拉算法) [1]最短路径 最短路径?别乱想哈,其实就是字面意思,一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两 ...
- python获取某路径下某扩展名的所有文件名和文件个数
# -*- coding: utf-8 -*- # @Time : 19-1-10 下午10:02 # @Author : Felix Wang import os def get_file_coun ...
- 7.9T2EASY(easy)
EASY(easy) sol:非常经典的题,取了一次之后,把线段树上这一段变成相反数 然后再贪心取和最大的. 重复以上操作,发现最后一定有对应的解,且根据贪心过程一定 是最大的 线段树上维护区间和最大 ...
- anaconda环境管理
创建新环境 conda create -n rcnn python=3.6 删除环境 conda remove -n rcnn --all 重命名环境 参考SO:https://stackoverfl ...
- CentOS 安装 Mongodb详解 --- 有Linux基础
安装包:https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.4.1.tgz 安装过程 安装pstree小工具,以及其使用 关闭 ...