编程语言很流行,并不是因为它很优秀,而是因为它很简单

作为一个程序员,经常会看到哪个编程语言最NB? 这类话题,往往会朝着语言本身的强度去考量,最终的答案毫无悬念的是C++

但在真实的开发场景下, C++的应用场景还是少的,即使是计算机专业毕业的学生,也更喜欢用Python这种用起来很方便的语言。

Python和C++比效率,肯定是被吊打,但Python简单,好用的库众多,3行代码就可以实现人脸识别。

目前比较火热的编程语言还有Node.js , Node.js的优势是语法和javascript类似,写Web前端的程序员可以快速上手Node.js,进行后端程序的编写。Node.js和Python类似,现成的库非常多,npm包管理非常强大,且有极度活跃的社区。

从后端的角度来看,Node.js算不上优秀,回调函数直接将程序员拖入回调地狱,依赖包之间相互依赖,只要有一个包被黑了,大量工程都会出问题,依赖包内甚至会出现挖矿代码。连Node.js之父都想重新创造Node.js, 推出了替代Node.js的Deno

虽然Deno理论上比Node.js先进,但无法兼容Node.js, Node.js即使有各种问题,已经线上运行的Node.js项目,也不可能用Deno重写一遍,最终比较奇妙的结果是,虽然Node.js有各种问题,但依然越滚越大,更先进的Deno却总也发展不起来,依靠风口飞起来的猪,会越飞越高。

Node.js的黄昏在哪里? 我们需要从Node.js流行的原因分析,Node.js和JavaScript语法相近,所以才流行起来,如果有一天,出现了新的Web前端语言,JavaScript变得不流行,那Node.js热度也会降低。设计更优秀新的Web或许并不难,但难在推广,除非微软,谷歌这种大厂去推动,微软的设计的TypeScript是JavaScript的超集,所以迅速流行起来,TypeScript的写法也逐步可以取代原生Node.js写法,但TypeScript最大的问题是,语法非常啰嗦,程序员又很懒,用起来不爽,平时写工程还行,如果是换成几十行代码的小程序,果断用原生Node.js

优秀的作品需要深度,流行的作品需要简单;对于一个浮躁时代的自媒体人,需要的是流行第一,深度第二。

本文永久更新地址:

https://fangyuanxiaozhan.com/p/2021-03-26-code/

Node.js爬虫获取漫威超级英雄电影海报

昨天去看了《复联3》的首映,当我提前15分钟进入影院的时候, 看到了粉丝们取票的长队, 顿时有一种跨年夜的感觉...
最近看了node爬虫的一些知识, 这里用node爬取一下漫威官网的电影海报!
marvel

// https://marvel.com/movies/all
const request = require('superagent')
const cheerio = require('cheerio')
const fs = require('fs-extra')
const path = require('path')

let url = 'https://marvel.com/movies/all'

// 获取图片url和图片名字
async function getUrlAndName(){
    // 用于存储返回值
    let imgAddrArray = []
    // 请求资源
    const res = await request.get(url)
    // 将获取的html, 转换为资源符$, 相当于python中的xpath语法的etree过程
    const $ = cheerio.load(res.text)
    // 定位资源位置, 将图片资源,和图片名字, 以数组方式, 返回给调用函数
    $('.row-item-image a').each(function(i, elem){
        let movieName = $(this).attr('href').split('/').pop()
        let imgAddr = $(this).find('img').attr('src')
        imgAddrArray.push([imgAddr, movieName])
    })
    return imgAddrArray
}
// 下载图片
async function download(imgAndName){
    // 拼接出, 当前资源的文件名
    let filename = imgAndName[1] + '.jpg'
    console.log("爬取海报:", filename);
    // 获取图片二进制数据
    const req = request.get(imgAndName[0]);
    // 保存图片
    await req.pipe(fs.createWriteStream(path.join(__dirname, 'images', filename))); 
}

// 创建文件夹, 控制整体流程
async function init(){
    let imgAddrArray = await getUrlAndName()
    // 创建文件夹
    try{
        await fs.mkdir(path.join(__dirname, 'images'));
    }
    catch(err){
        console.log("==>", err);
    }
    // 获取资源
    for (let imgAddr of imgAddrArray){
        await download(imgAddr);
    }
}

init()

运行结果

小结:

直观感受, node爬虫并没有python好用, 而且由于浏览器的同源限制, 在浏览器端跑node爬虫也会有些麻烦;node爬虫的优势:理论上讲,node默认的异步玩法, 能达到python的多线程爬虫的效果.
写爬虫, 还是老老实实用Python吧!

本文永久更新地址:

https://fangyuanxiaozhan.com/p/2021-01-25-23/