nodejs爬虫获取漫威超级英雄电影海报

昨天去看了《复联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吧!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏日常学python

使用requests+BeautifulSoup的简单爬虫练习

这是日常学python的第17篇原创文章 上篇文章说了BeautifulSoup库之后,今篇文章就是利用上篇的知识来爬取我们今天的主题网站:猫眼电影top100...

2566
来自专栏CDA数据分析师

如何用 Python 爬取天气预报

? 大家好,我是Victor 278,由于本人是做前端的,Python学来作知识扩充的,看到非常多的小伙伴高呼着想从0开始学爬虫,这里开始写定向爬虫从0开始,...

31810
来自专栏bdcn

Flask学习笔记-使用bootstrap-datepicker实现页面日期选择 顶

这个插件的样式个人觉得还是很不错,而且可以功能也是比较全的,多语言的支持也很全面,中文化很方便。

1112
来自专栏Petrichor的专栏

GFM操作 & 遇到的问题及解决方案

  GitHub 使用的是 “ GitHub Flavored Markdown ” ,简称GFM,有site-in issues,comments,pull ...

523
来自专栏GopherCoder

Django:web框架的学习(4:番外篇)

1153
来自专栏一“技”之长

AppleWatch开发入门九——Watch帧动画的实现

        动画一直是iOS系统的一大亮点,CoreAnimation和粒子效果的支持,开发者可以很容易的做出效果炫酷的动画特效。在watchOS中,由于性...

712
来自专栏一“技”之长

Xcode创建可复用的代码块 原

        在各种程序开发中,编写代码的效率是非常重要的一个问题,各种优秀的编译器也都有相应的插件用于提高程序员的编码速度。在xcode中,可以通过定义代码...

932
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第十六天 EasyUI【悟空教程】

使用easyui你不需要写很多代码,你只需要通过编写一些简单HTML标记,就可以定义用户界面。

1442
来自专栏Alan's Lab

如何编写一个 jQuery 插件

https://github.com/zcfan/sket... 重写了本文的初步功能实现,支持一个页面多个画图板。但为简单起见,本文保持不变。

864
来自专栏xingoo, 一个梦想做发明家的程序员

基于ELK的数据分析实践——满满的干货送给你

很多人刚刚接触ELK都不知道如何使用它们来做分析,经常会碰到下面的问题: 安装完ELK不知从哪下手 拿到数据样本不知道怎么分解数据 导入到elastics...

2877

扫码关注云+社区