相信每一个开发做了一段时间的人都会知道英语对开发者的重要性,各种框架库的文档、更新日志、issue、各种变量命名。这些东西时效性都是很低的,如果只能一昧的等待别人汉化、更新,那永远都会被别人甩在后面, 更何况除了受众比较广的一些开源项目和优质文章,基本上是不会有汉化的。

正因为这些,不提高英语水平对一个有远大理想($)的coder的而言,绝对是万万不可的。

说到学英语,就少不了背单词,但是现在都是9012年了,不可能像让我们像高中的时候一样走到哪里都拿着个小本本吧。所以这段时间我也折腾了不少背单词的app,扇贝、百词斩、知米、沪江、网易背单词、天天背单词。都是非常优秀的软件,记忆曲线,定期复习等实用的功能大大提高了背单词的效率。

但是,问题又来了。每个单词软件的词库量都参差不齐,而且词库大都是服务在校生,各种考研人员。不过所幸有的单词软件支持用户自己上传词库, 下面是我用积分买的一些单词书

在这里再次感谢这些单词书的收集者?。

问题又双来了,这些词库都是在线词库,虽然买了单词书,但是只能在该平台用,平台包含很多不支持买断的vip功能,自己又想把这些单词书放到自己想要的单词软件去背。问题有了,自然也会解决办法,目前大部分背单词app都支持自己上传单词生成词库,词库一般都是下面这种格式

// 前端单词大全.txt 格式是txt,单词间用回车分开
primitive
undefined
null
object
global
array
value

那现在要做的就是怎么把这些单词数据从别人的官网上爬下来并转换成自己需要的格式了,现有技术栈里node正好适合用来做这个工作,虽然以前没写过爬虫,但是大概知道要做的就是请求目标网页、分析页面结构、取出需要的数据。知道要做什么,ok,查查资料上手~

这里顺便分享一下最后爬取到的文件,仅供学习使用。

单词书

代码

依赖

const axios = require('axios');   // 发起请求
const cheerio = require('cheerio');   // 类jq的node文档分析库
const fs = require('fs');   // 生成文件

html结构:
列表结构

因为单词分为多个章节,需要先获取到各个章节的列表指向的地址


内页结构


数据大于20条时会出现分页

先写一个函数用于获取列表、详情并写入到指定文件

async function getDatas() {// 先调用获取目录的方法,对应函数在下方代码中let res = await getListUrl(urlprefix + '/wordbook/129934/');if(!res) return;// 根据获取到的列表地址数组获取详情await getDetail(res, (data) => {let tempArr = [];for(let [key, val] of Object.entries(data)) {tempArr.push(...val)}// 写入文件fs.writeFile('./output.txt', tempArr.join('\n'), err => {if(err) {console.log('写入文件时发生错误:', err);return;}console.log('写入完成!');})});
}

// 获取列表的函数

async function getListUrl(url) {let res = await axios.get(url);if(res.status !== 200) return;// 分享结构,取值let $ = cheerio.load(res.data);let wordlist = $('.wordbook-wordlist-name a');let urlArr = [];wordlist.each(function () {urlArr.push($(this).attr('href'))})return urlArr;
}

// 获取详情

/*** urls: <arr>  列表url组成的数组* cb: 所有数据都获取完后的回调* index: 用于递归的索引* init: 用于累加的数据* page: 在详情页,数据超过20条时会生成,分页,需要根据获取每一页的内容*/
async function getDetail(urls, cb, index = 0, init = {}, page = 1) {if(index === urls.length) {cb(init)return;};let res = await axios.get(urlprefix + urls[index] + '?page=' + page);if(res.status !== 200) return;let $ = cheerio.load(res.data);// 获取单词let wordlist = $('.span2 strong');// 获取该章节的页码数(因为页码控件是jq插件生成的,直接$(selector)是获取不到节点的,所以需要手动正则一下)let pagesStr= res.data.match(/var pages = Math\.ceil\((\d+) \/ (\d+)\)/);let pageLength = Math.ceil(pagesStr[1] / pagesStr[2]);let urlArr = [];wordlist.each(function () {urlArr.push($(this).html())})init['chapter' + index + '_page' + page] = urlArr;console.log('总完成度 -> 当前章节:' + (index + 1) + '/' + urls.length + ' 当前页:' + page + '/' + pageLength);// 长度小于1直接取下一条,否则取下一页if(pageLength > 1 && pageLength !== page) {await getDetail(urls, cb, index, init, page + 1);}else {await getDetail(urls, cb, index + 1, init, 1);}}

最后附上代码地址
github

初次尝试node爬虫(附赠前端和各种编程词库、coca20000词频表)相关推荐

  1. 初次尝试python爬虫,爬取小说网站的小说。

    本次是小阿鹏,第一次通过python爬虫去爬一个小说网站的小说. 下面直接上菜. 1.首先我需要导入相应的包,这里我采用了第三方模块的架包,requests.requests是python实现的简单易 ...

  2. node爬虫快速入门

    node爬虫 初入前端,刚刚接触node,对于耳闻已久的node爬虫非常神往,所以有了这篇文章,项目代码在文章末尾 需求 抓取天涯论坛重庆地区板块的文章列表信息. 使用工具 node.js super ...

  3. python爬虫简单实例-最简单的Python爬虫案例,看得懂说明你已入门,附赠教程

    原标题:最简单的Python爬虫案例,看得懂说明你已入门,附赠教程 这是最简单的Python爬虫案例,如果你能看懂,那么请你保持信心,因为你已经入门Python爬虫,只要带着信心和努力,你的技术能力在 ...

  4. 苹果回应巴西政府禁止销售不附赠充电器的iPhone;TikTok否认用户数据源代码泄露|极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  5. 实战|Python轻松实现动态网页爬虫(附详细源码)

    用浅显易懂的语言分享爬虫.数据分析及可视化等干货,希望人人都能学到新知识. 项目背景 事情是这样的,前几天我公众号写了篇爬虫入门的实战文章,叫做<实战|手把手教你用Python爬虫(附详细源码) ...

  6. beautifulsoup解析动态页面div未展开_实战|Python轻松实现动态网页爬虫(附详细源码)...

    用浅显易懂的语言分享爬虫.数据分析及可视化等干货,希望人人都能学到新知识.项目背景事情是这样的,前几天我公众号写了篇爬虫入门的实战文章,叫做<实战|手把手教你用Python爬虫(附详细源码)&g ...

  7. JD京东爬虫-商品评论爬虫-----附源码

    JD京东爬虫-商品评论爬虫 附源码 本教程适合初学者. 分析开始--------------- 打开京东商品链接,打开抓包工具(加载网页后打开抓包工具,发现没有抓到数据包,刷新网页就行),这边直接筛选 ...

  8. 15个小时彻底搞懂NLP自然语言处理(2021最新版附赠课件笔记资料)【LP自然语言处理涉及到深度学习和神经网络的介绍、 Pytorch、 RNN自然语言处理】 笔记

    15个小时彻底搞懂NLP自然语言处理(2021最新版附赠课件笔记资料)[LP自然语言处理涉及到深度学习和神经网络的介绍. Pytorch. RNN自然语言处理] 笔记 教程与代码地址 P1 机器学习与 ...

  9. node爬虫进阶之——登录

    转载自:http://www.jianshu.com/p/87867f325184 在之前的文章node入门场景之--爬虫已经介绍过最简单的node爬虫实现,本文在原先的基础上更进一步,探讨一下如何绕 ...

最新文章

  1. JavaScript- The Good Parts CHAPTER 2
  2. 关于Session的使用和优化
  3. [python opencv 计算机视觉零基础到实战] 一 opencv的helloworld
  4. springCloud五大组件--Eureka
  5. chm 转 html 带索引,chm 的项目文件中包含创建 chm 文件所需的HTML文件信息、目录表文件信息、索引文件信息、窗口属 - 试题答案网问答...
  6. 机刷实名认证软件_代刷网已上架抖音代实名认证和抖音音乐人认证
  7. 深入浅出MFC:动态创建控件
  8. openmp 并行 速度更慢_OpenMP和C并行for循环:为什么我的代码在使用OpenMP时会变慢?...
  9. 分享一份软件测试项目实战(web+app+h5+小程序)
  10. NetSarang旗下网络通讯系列产品v5版本更新合集丨附下载
  11. 小爱同学app安卓版_小爱同学app下载_小爱同学官网版手机客户端下载 安卓版 V2.8.60 - 罐头安卓网...
  12. 智能车竞赛技术报告-单车赛题组-同济大学
  13. Nvidia NX平台控制台调试串口修改调试记录
  14. java设置随机数_java设置随机数教程
  15. 华硕笔记本屏幕亮度怎么调节?屏幕亮度调节方法
  16. 网络安全基本属性和STRIDE
  17. Silvaco TCAD仿真5——process simulation(Athena)
  18. 很齐全的测试用例设计方法
  19. K8S使用教程(详细)
  20. facebooks项目aria是您一生的Google地图

热门文章

  1. 在创业的路上,关于预设的期待,一般人经常会犯什么错误?
  2. 写个app, 性能很捉急
  3. 数字经济浪潮澎湃,怎样赢得下一个十年?
  4. python画图marker显示_python画图(标记、marker、设置标记大小、marker符号大全)(图文详细入门教程五)...
  5. 三菱四节传送带控制梯形图_基于三菱FX-2N系列PLC的四节传送带模拟控制设计
  6. 插件启动so库加载原理及实现
  7. ld --whole-archive 和 --no-whole-archive学习记录
  8. 声网把七年无全网事故的实时传输网络SD-RTN全面开放了——这就是FPA
  9. vue noVNC实现远程桌面连接
  10. 试卷自动生成系统(JSP+MySQL)