1. 'use strict';
  2. let request = require('request')
  3. let cheerio = require('cheerio'); //爬虫
  4. let iconv = require('iconv-lite'); //处理gbk编码的网页
  5. let Entities = require('html-entities').XmlEntities;
  6. let entities = new Entities();
  7. const fs = require('fs')
  8. const path = require('path')
  9. const host = 'http://www.quanshuwang.com/shuku/'
  10.  
  11. const db = uniCloud.database()
  12. const collection = db.collection('repiles-book')
  13. const dbCom = db.command
  14.  
  15. exports.main = async (event, context) => {
  16.  
  17. // 开始抓取首页链接
  18. let indexArr = []
  19. //发送请求获取页面内容
  20. var body = await requestFn()
  21. var $ = cheerio.load(body);
  22. //兼容网页编码格式
  23. if ($('meta[charset]').attr('charset') == 'utf-8') { //如果网页是utf-8的编码
  24.  
  25. } else { //如果网页是gbk的编码
  26. body = iconv.decode(body, 'gbk'); //转换gbk编码的页面内容
  27. $ = cheerio.load(body);
  28. }
  29. //处理网页数据 获取排行列表
  30. let list = $('.yd-book-content .tab-item').find('.yd-book-item')
  31. for (var i = 0; i < list.length; i++) {
  32. let href = list.eq(i).find('a').attr("href")
  33. //获取书的id
  34. let index = href.indexOf('_') + 1
  35. let index2 = href.lastIndexOf('.')
  36. let bookId = href.slice(index, index2) //书ID
  37. //获取书的封面
  38. let bookImageSrc = list.eq(i).find('img').attr("src")
  39. //获取书的标题 注意使用html-entities解码
  40. let bookName = entities.decode(list.eq(i).find('h2').html())
  41. //获取书的作者 注意使用html-entities解码
  42. let bookAuthor = entities.decode(list.eq(i).find('.dl-horizontal-inline p').html())
  43.  
  44. console.log('书的封面:' + bookImageSrc);
  45. console.log('书的标题:' + bookName);
  46. console.log('书的作者:' + bookAuthor);
  47. console.log('书的id:' + bookId);
  48. let obj={
  49. bookImageSrc,
  50. bookName,
  51. bookAuthor,
  52. bookId,
  53. }
  54. saveContent(obj)
  55. }
  56.  
  57. console.log('新增文章数量:', indexArr.length);
  58.  
  59. // 循环抓取每个新文章详情页
  60. // if (indexArr.length > 0) {
  61. // for (let i = 0; i < indexArr.length; i++) {
  62. // let href = list.eq(indexArr[i]).attr("href")
  63. // let imgSrc = list.eq(indexArr[i]).find('img').attr('src')
  64. // let title = list.eq(indexArr[i]).find('.title').text()
  65. // await saveArticle(href, title, imgSrc)
  66. // }
  67. // }
  68.  
  69. //返回数据给客户端
  70. return event
  71. };
  72.  
  73. function saveContent(obj) {
  74. //获取要写入文件的文件夹路径(以书名当文件夹)
  75. let pathBook=path.join(__dirname, `../../bookData/${obj.bookName}`)
  76. //判断书名文件夹是否存在,不存在则创建
  77. if (!fs.existsSync(pathBook)) {
  78. fs.mkdirSync(pathBook)
  79. }
  80. //写入json文件
  81. fs.writeFile(`${pathBook}/chapter1.json`, JSON.stringify(obj), 'utf-8', err => {
  82. if (err) throw err
  83. })
  84. }
  85.  
  86. function requestFn() {
  87. return new Promise((resolve, reject) => {
  88. request({
  89. url: host,
  90. encoding: null //设置抓取页面时不要对数据做任何转换
  91. }, function(err, res, body) {
  92. if (err) {
  93. reject(err)
  94. } else {
  95. resolve(body)
  96. }
  97. });
  98. })
  99. }

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. apostrophe

    apostrophe 者,', 0x27, 十进制39,ASCII里的single quote (单引号) 也.one of the 'inverted commas'. 在书写上可以表示所有格.省略 ...

  2. Spark产生数据倾斜的原因以及解决办法

    Spark数据倾斜 产生原因 首先RDD的逻辑其实时表示一个对象集合.在物理执行期间,RDD会被分为一系列的分区,每个分区都是整个数据集的子集.当spark调度并运行任务的时候,Spark会为每一个分 ...

  3. Angular中@Output()的使用方法

    子component中的html文件 <button (click)="Send()">送出</button><br> 子component中的 ...

  4. D3-更改x轴的标签

    记录,上代码

  5. 转 GSON

    转 https://www.jianshu.com/p/75a50aa0cad1 GSON弥补了JSON的许多不足的地方,在实际应用中更加适用于Java开发.在这里,我们主要讲解的是利用GSON来操作 ...

  6. 技术预演blog

    canal整合springboot实现mysql数据实时同步到redis spring+mysql集成canal springboot整合canal监控mysql数据库 SpringBoot cana ...

  7. 【Linux】【Services】【SaaS】Docker+kubernetes(13. 部署Jenkins/Maven实现代码自动化发布)

    1. 简介 Jenkins: 官方网站:https://jenkins.io/ 下载地址:https://jenkins.io/download/ war包下载:http://mirrors.jenk ...

  8. Windows下80端口被占用的解决方法(SQL Server)

    查找80端口被谁占用的方法 进入命令提示行(WIN+R 输入 CMD),输入命令 netstat -ano|findstr 80 (显示包含:80的网络连接) ,就可以看到本机所有端口的使用情况,一般 ...

  9. [BUUCTF]PWN——[HarekazeCTF2019]baby_rop2

    [HarekazeCTF2019]baby_rop2 题目附件 步骤: 例行检查,64位,开启了nx保护 运行了一下程序,了解大概的执行情况 64位ida载入,shift+f12检索程序里的字符串,没 ...

  10. Mac终端学习C笔记

    Mac终端自带Clang,是一个C语言.C++.Objective-C语言的轻量级编译器,也可以进行c程序编译.具体Clang和gcc区别不做详细介绍. 终端自动vi编辑器. 终端命令笔记: gcc ...