node爬虫(二)—— 获取小说章节详情

node爬虫(二)—— 获取小说章节详情

/**
 * 获取小说章节详情
 */

//引入模块
const http = require('http')
const fs = require('fs')
const cheerio = require('cheerio')
const iconv = require('iconv-lite')


//第一章url
const url = 'http://www.biquge.com/91_91711/4720017.html'
//开始章节数
let i = 1
//最大获取章节数
let num = 3

function main (url) {
    startRequest(url)
}

function startRequest (url) {
    http.get(url, res => {
        //定义空数组存放html
        const html = []
        res.on('data', (chunk) => {
            //把数据块添加进数组
            html.push(chunk)
        })
        res.on('end', () => {
            //获取数据完毕后,使用iconv-lite转码,decedo中为Buffer对象,Buffer.concat为数组
            const html1 = iconv.decode(Buffer.concat(html), 'utf-8')
            //使用cheerio解析html,cheerio模块的语法跟jQuery基本一样
            const $ = cheerio.load(html1, { decodeEntities: false })
            //处理数据
            const title = $('.bookname h1').text()
            const arr = []
            const content = $("#content").html()
            //分析结构后分割html
            const contentArr = content.split('<br><br>')

            //去除内容的两端空格和 
            contentArr.forEach(elem => {
                const data = trim(elem.toString())
                arr.push(data)
            })

            const bookName = $(".con_top a").eq(1).text()

            //定义存入数据库的对象
            const obj = {
                id: i,
                bookName: bookName,
                title: title,
                content: arr
            }

            //获取当前章节的下一章地址,递归调用fetchPage
            const link = $(".bottem2 a").eq(2).attr('href')
            const nextLink = `http://www.biquge.com/${link}`

            //保存数据
            saveContent(obj, nextLink)
            console.log(`第${i + 1}章:${nextLink}`)
            i++
            if (i <= num) {
                setTimeout(() => {
                    main(nextLink)
                }, 1000)
            }
        })
    })
}

function saveContent (obj, nextLink) {
    console.log(`${i}--${obj.title}`)
    //判断书名文件夹是否存在,不存在则创建
    if (!fs.existsSync(`data/${obj.bookName}`)) {
        fs.mkdirSync(`data/${obj.bookName}`);
        fs.writeFile(`data/${obj.bookName}/chapter.json`, "", (err) => {
            if (err) throw err;
        })
    }

    // 写入json文件
    fs.appendFile(`./data/${obj.bookName}/chapter.json`, JSON.stringify(obj) + ",", 'utf-8', err => {
        if (err) throw err
    })
}

function trim (str) {
    return str.replace(/(^\s*)|(\s*$)/g, '').replace(/ /g, '')
}

main(url)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js 爬虫添加定时功能通常通过使用各种时间管理库和 Node.js 的特性来实现。下面是一个简化的步骤说明: ### 使用计划任务 (cron jobs) 添加定时爬虫 对于 Linux 和 macOS 操作系统,你可以利用 cron 工具来设置定时任务。在 Windows 系统上,通常使用 Task Scheduler。 #### 步骤一:编写爬虫脚本 首先,你需要有一个运行爬虫的 JavaScript 文件。例如,我们假设已经创建了一个名为 `scrape.js` 的文件,该文件包含了一些基本的爬虫逻辑。 ```javascript // scrape.js const axios = require('axios'); async function fetchData(url) { try { const response = await axios.get(url); console.log(response.data); } catch (error) { console.error(`Error fetching data from ${url}:`, error); } } fetchData("https://example.com"); ``` #### 步骤:配置 crontab 或 Task Scheduler 接下来,在 Linux/macOS 上,打开 crontab 来编辑定时任务: - 打开终端并输入 `crontab -e` 进入文本编辑器。 然后在文件中添加一行命令来指定爬虫任务的定时执行。例如,为了每天凌晨两点执行爬虫,可以添加以下行: ```bash 0 2 * * * /usr/bin/node /path/to/scrape.js > /path/to/logfile.txt 2>&1 ``` 这条命令的意思是在每天凌晨两点执行 `/path/to/scrape.js` 脚本,并将输出结果和错误信息写入到 `/path/to/logfile.txt` 中。 保存并关闭文件后,需要重启 crond 服务让新的定时任务生效: ```bash sudo service crond restart ``` 在 Windows 系统上,使用 Task Scheduler 设置定时任务更为直观,步骤包括选择新建任务、设定触发条件、指向执行的 .js 文件等操作。详细步骤取决于系统的版本和具体的用户权限情况。 #### 关联的其他问题: 1. **如何调试 Node.js 爬虫**? 使用日志记录和断点定位错误是非常重要的调试手段,如在 `scrape.js` 中添加 `console.log()` 或者使用像 Mocha 测试框架配合 Chai 断言来进行测试。 2. **如何优化 Node.js 爬虫性能**? 通过限制并发请求数、使用缓存技术、优化网络通信等策略可以提高爬虫效率和稳定性。 3. **处理异步回调和 Promise 在 Node.js 爬虫中的应用**? 异步编程模型是 Node.js 的核心,理解并善用回调函数、Promise 和 async/await 可以使爬虫代码更清晰、易于维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值