'use strict';
let request = require('request')
let cheerio = require('cheerio'); //爬虫
let iconv = require('iconv-lite'); //处理gbk编码的网页
let Entities = require('html-entities').XmlEntities;
let entities = new Entities();
const fs = require('fs')
const path = require('path')
const host = 'http://www.quanshuwang.com/shuku/' const db = uniCloud.database()
const collection = db.collection('repiles-book')
const dbCom = db.command exports.main = async (event, context) => { // 开始抓取首页链接
let indexArr = []
//发送请求获取页面内容
var body = await requestFn()
var $ = cheerio.load(body);
//兼容网页编码格式
if ($('meta[charset]').attr('charset') == 'utf-8') { //如果网页是utf-8的编码 } else { //如果网页是gbk的编码
body = iconv.decode(body, 'gbk'); //转换gbk编码的页面内容
$ = cheerio.load(body);
}
//处理网页数据 获取排行列表
let list = $('.yd-book-content .tab-item').find('.yd-book-item')
for (var i = 0; i < list.length; i++) {
let href = list.eq(i).find('a').attr("href")
//获取书的id
let index = href.indexOf('_') + 1
let index2 = href.lastIndexOf('.')
let bookId = href.slice(index, index2) //书ID
//获取书的封面
let bookImageSrc = list.eq(i).find('img').attr("src")
//获取书的标题 注意使用html-entities解码
let bookName = entities.decode(list.eq(i).find('h2').html())
//获取书的作者 注意使用html-entities解码
let bookAuthor = entities.decode(list.eq(i).find('.dl-horizontal-inline p').html()) console.log('书的封面:' + bookImageSrc);
console.log('书的标题:' + bookName);
console.log('书的作者:' + bookAuthor);
console.log('书的id:' + bookId);
let obj={
bookImageSrc,
bookName,
bookAuthor,
bookId,
}
saveContent(obj)
} console.log('新增文章数量:', indexArr.length); // 循环抓取每个新文章详情页
// if (indexArr.length > 0) {
// for (let i = 0; i < indexArr.length; i++) {
// let href = list.eq(indexArr[i]).attr("href")
// let imgSrc = list.eq(indexArr[i]).find('img').attr('src')
// let title = list.eq(indexArr[i]).find('.title').text()
// await saveArticle(href, title, imgSrc)
// }
// } //返回数据给客户端
return event
}; function saveContent(obj) {
//获取要写入文件的文件夹路径(以书名当文件夹)
let pathBook=path.join(__dirname, `../../bookData/${obj.bookName}`)
//判断书名文件夹是否存在,不存在则创建
if (!fs.existsSync(pathBook)) {
fs.mkdirSync(pathBook)
}
//写入json文件
fs.writeFile(`${pathBook}/chapter1.json`, JSON.stringify(obj), 'utf-8', err => {
if (err) throw err
})
} function requestFn() {
return new Promise((resolve, reject) => {
request({
url: host,
encoding: null //设置抓取页面时不要对数据做任何转换
}, function(err, res, body) {
if (err) {
reject(err)
} else {
resolve(body)
}
});
})
}

uniCloud爬虫获取网页数据的更多相关文章

  1. 爬虫获取网页数据,报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start by

    https://blog.csdn.net/hj_xy_0705/article/details/85011072

  2. Java 网络爬虫获取网页源代码原理及实现

    Java 网络爬虫获取网页源代码原理及实现 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL ...

  3. 【转】如何在Windows+VS2005使用最新静态libcurl 7.35.0获取网页数据,支持HTTPS

    地址: http://blog.csdn.net/hujkay作者:Jekkay Hu(34538980@qq.com)关键词:Windows,curl,ssl,  visual c++ 2005, ...

  4. 在php中分别使用curl的post提交数据的方法和get获取网页数据的方法

    在php中分别使用curl的post提交数据的方法和get获取网页数据的方法整理分享一下额,具体代码如下: (1)使用php curl获取网页数据的方法: $ch=curl_init(); //设置选 ...

  5. UWP 使用HttpClient获取网页数据

    我的App自然灾害中,为了展示地震的各种信息,就需要从网页上获取地震源数据. 如图所示,我们需要展示 地震等级.地震发生时间.经纬度.震源深度.地震位置等信息. 那么,假设给了一个地震的源,中国地震台 ...

  6. 使用HttpClient进行Get方式通信(使用HttpGet获取网页数据)

    1.项目结构 导入jar包 jar包去官网下载解压后项目新建lib目录,将解压包中的lib目录中的zip拷入项目lib目录文件夹,然后build path-->配置到项目中 2.TestGet. ...

  7. C# 获取网页数据、获取本机IP 分类: C# 2014-12-16 14:59 308人阅读 评论(0) 收藏

    说明: (1) http://www.3322.org/dyndns/getip 这个网址可以获取本机IP,读取的内容就是本机IP (2)方法经测试,可以实现. (3)参考:http://www.cn ...

  8. 20170717_python_爬虫_网页数据解析_BeautifulSoup_数据保存_pymysql

    上午废了老大劲成功登陆后,下午看了下BeautifulSoup和pymysql,晚上记录一下 自己电脑装的sublime,字体颜色竟然拷贝不下来 - - 写的过程中遇到了很多问题: 1.模拟登陆部分 ...

  9. VB中获取网页数据

    以下是在Microsoft Visual Basic 6.0 中文版下做的 VB可以抓取网页数据,所用的控件是Inet控件. 第一步:单击工程-->部件 选择Microsoft Internet ...

随机推荐

  1. [源码解析] PyTorch分布式优化器(2)----数据并行优化器

    [源码解析] PyTorch分布式优化器(2)----数据并行优化器 目录 [源码解析] PyTorch分布式优化器(2)----数据并行优化器 0x00 摘要 0x01 前文回顾 0x02 DP 之 ...

  2. day07 ORM中常用字段和参数

    day07 ORM中常用字段和参数 今日内容 常用字段 关联字段 测试环境准备 查询关键字 查看ORM内部SQL语句 神奇的双下划线查询 多表查询前提准备 常用字段 字段类型 AutoField in ...

  3. Fllin(七)【Flink CDC实践】

    目录 FlinkCDC 1.简介 2.依赖 3.flink stream api 4.flink sql 5.自定义反序列化器 6.打包测试 FlinkCDC 1.简介 CDC是Change Data ...

  4. Linux基础命令---ntpdate网络时间服务器

    ntpdate ntpdate指令通过轮询指定为服务器参数的网络时间协议(NTP)服务器来设置本地日期和时间,从而确定正确的时间. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS ...

  5. oracle(数据备份)

    1 --oracle数据备份(三种方法) 2 --1.逻辑备份与恢复:用Oracle提供的工具,导入/导出(exp,imp),数据 3 --泵导入/导出(impdp,expdp),装入器(SQL*Lo ...

  6. OC-基础数据类型

    七 字符串与基本数据类型转换 获取字符串的每个字符/字符串和其他数据类型转换 八 NSMutableString 基本概念/常用方法 九 NSArray NSArray基本概念/创建方式/注意事项/常 ...

  7. java 对 final 关键字 深度理解

    基础理解 : 1.修饰类 当用final去修饰一个类的时候,表示这个类不能被继承.处于安全,在JDK中,被设计为final类的有String.System等,这些类不能被继承 .注意:被修饰的类的成员 ...

  8. 如何将java对象转换成json数据

    package cn.hopetesting.com.test;import cn.hopetesting.com.domain.User;import com.fasterxml.jackson.c ...

  9. MySQL 面试题汇总(持续更新中)

    COUNT COUNT(*) 和 COUNT(1) 根据 MySQL 官方文档的描述: InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) opera ...

  10. springboot学习(一)

    最近想学习springboot所以在网上找了很多文章参考怎么构建springboot项目以及集成mybatis 集成mybatis的部分参考了这两篇文章 https://blog.csdn.net/t ...