uniCloud爬虫获取网页数据
'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爬虫获取网页数据的更多相关文章
- 爬虫获取网页数据,报错: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
- Java 网络爬虫获取网页源代码原理及实现
Java 网络爬虫获取网页源代码原理及实现 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL ...
- 【转】如何在Windows+VS2005使用最新静态libcurl 7.35.0获取网页数据,支持HTTPS
地址: http://blog.csdn.net/hujkay作者:Jekkay Hu(34538980@qq.com)关键词:Windows,curl,ssl, visual c++ 2005, ...
- 在php中分别使用curl的post提交数据的方法和get获取网页数据的方法
在php中分别使用curl的post提交数据的方法和get获取网页数据的方法整理分享一下额,具体代码如下: (1)使用php curl获取网页数据的方法: $ch=curl_init(); //设置选 ...
- UWP 使用HttpClient获取网页数据
我的App自然灾害中,为了展示地震的各种信息,就需要从网页上获取地震源数据. 如图所示,我们需要展示 地震等级.地震发生时间.经纬度.震源深度.地震位置等信息. 那么,假设给了一个地震的源,中国地震台 ...
- 使用HttpClient进行Get方式通信(使用HttpGet获取网页数据)
1.项目结构 导入jar包 jar包去官网下载解压后项目新建lib目录,将解压包中的lib目录中的zip拷入项目lib目录文件夹,然后build path-->配置到项目中 2.TestGet. ...
- C# 获取网页数据、获取本机IP 分类: C# 2014-12-16 14:59 308人阅读 评论(0) 收藏
说明: (1) http://www.3322.org/dyndns/getip 这个网址可以获取本机IP,读取的内容就是本机IP (2)方法经测试,可以实现. (3)参考:http://www.cn ...
- 20170717_python_爬虫_网页数据解析_BeautifulSoup_数据保存_pymysql
上午废了老大劲成功登陆后,下午看了下BeautifulSoup和pymysql,晚上记录一下 自己电脑装的sublime,字体颜色竟然拷贝不下来 - - 写的过程中遇到了很多问题: 1.模拟登陆部分 ...
- VB中获取网页数据
以下是在Microsoft Visual Basic 6.0 中文版下做的 VB可以抓取网页数据,所用的控件是Inet控件. 第一步:单击工程-->部件 选择Microsoft Internet ...
随机推荐
- Kafka入门教程(二)
转自:https://blog.csdn.net/yuan_xw/article/details/79188061 Kafka集群环境安装 相关下载 JDK要求1.8版本以上. JDK安装教程:htt ...
- Scala【需求二:求各省市的各个指标】
需求处理步骤 原始数据->json->过滤->列裁剪 需求二:求各省市的各个指标 原始数据 文本pmt.json,每一行都是一个json字符串.里面包含ip等信息 {"se ...
- Java【常用的日期操作】
目录 1.设置时间 2.获取年月日时分秒 3.通过运算获取时间 4.和Date类转换 5.格式化时间 6.新功能LocalDate:当前日期格式化 7.示例 java.util.Calendar 类是 ...
- STL学习笔记1
STL六大部件 容器.分配器.算法.迭代器.适配器.仿函数 他们的关系如下
- Docker学习(四)——Docker容器连接
Docker容器连接 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P或-p参数来指定端口映射. 下面我们来实现通过端口连接到一个docker容器. 1.网络端口映射 ...
- Can references refer to invalid location in C++?
在C++中,引用比指针更加的安全,一方面是因为引用咋定义时必须进行初始化,另一方面是引用一旦被初始化就无法使其与其他对象相关联. 但是,在使用引用的地方仍然会有一些例外. (1)Reference t ...
- CountDownLatch原理
正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...
- bugku 杂项 流量分析(cnss)
bugku 杂项 流量分析(cnss) 此题较为简单 wireshark 追踪第一行tcp流信息 得到如下 GET /stat.htm?id=2724999&r=http%3A%2F%2Fsp ...
- 12月第二周bug总结
1.bug总结 复制 别人的依赖和依赖指定类型 报错 解决:依赖还没加载完成,你就指定了版本型号,所以报错,所以先让他加载依赖,后指定该型号 eureka(优瑞卡) 注册服务 控制台没有显示出来的话 ...
- 声临其境,轻松几步教你把音频变成3D环绕音
在音乐创作.音视频剪辑和游戏等领域中,给用户带来沉浸式音频体验越来越重要.开发者如何在应用内打造3D环绕声效?华为音频编辑服务6.2.0版本此次带来了空间动态渲染功能,可以将人声.乐器等音频元素渲染到 ...