Node实战-----爬取网页图片

在本篇博文中我将实现一个完整的实例:主要使用Node.js爬取一个网页,需要通过第三方模块cheerio.js分析这个网页的内容,最后将这个网页的图片保存个在本地。

一、项目目录与思路

新建一个项目名为:project_01,输入命令在控制台,使其生成package.json文件:

命令:

npm init

在控制台输入npm install命令下载需要的模块,在本项目中需要的request和cheerio模块,将使用命令进行下载到本地:

命令:

npm install request cheerio -S

此时项目的文件夹的目录为:

  • img文件夹用来存储图片文件
  • node_modules文件夹是模块默认的保存位置
  • index.js文件是整个项目的入口文件。
  • config.js文件是配置文件,用来存放网页地址和图片文件夹的路径,这样做的目的是使整个项目的可拓展性增强。
  • analyze.js文件用来存储分析DOM的方法。
  • package.json文件是包的描述文件。

打开node_modules文件夹可以看到相应的模块:

整体的思路:通过第三方模块request的请求网页地址,从而得到整个网页的DOM结构,根据DOM结构利用cheerio模块分析出图片文件的地址,再次请求这个地址,再次请求这个地址,最后将得到的图片数据存储在本地。

二、   配置网页地址及图片存放的文件夹

配置内容:config.js中,在文件中通过exports导出这些配置内容,从而使其它文件可以使用

以爬码农网为例

代码:

config.js

const url=‘http://www.codeceo.com/‘;//填写自己请求的具体的网址

const path=require(‘path‘);
const imgDir=path.join(__dirname,‘img‘);

module.exports.url=url;
module.exports.imgDir=imgDir;

三、解析DOM得到的图片地址

得到DOM结构之后,将分析DOM部分代码写入analyze.js文件中,通过cheerio得到每一张图片的地址,最后利用一个回调函数callback处理这个地址(这里的回调函数callback是发送请求):

代码:

analyze.js:

const cheerio=require(‘cheerio‘);
const fs=require(‘fs‘);
function findImg(dom,Callback){

    let $=cheerio.load(dom);
    $(‘img‘).each(function(i,elem){

        let imgSrc=$(this).attr(‘src‘);
           Callback(imgSrc,i);
    });

}
module.exports.findImg=findImg;

cheerio模块可以像jQuery一样操作DOM,这里得到的是请求网页中每一张图片的文件地址

四、请求图片的地址以及图片文件的保存

请求图片的的地址:

将请求的操作放在主模块index.js文件中,将config.js和analyze.js文件引入这个模块,利用request模块请求图片的地址,得到DOM结构,将DOM结构给analyze的findImg方法处理,代码:

const http=require(‘http‘);
const fs=require(‘fs‘);
const request=require(‘request‘);
const path=require(‘path‘);
const config=require(‘./config‘);
const analyze=require(‘./analyze‘);

function start(){

    request(config.url,function(err,res,body){

        console.log(‘start‘);
        if(!err && res){

            console.log(‘start‘);
            analyze.findImg(body);
        }
    })
}

图片文件的保存:

通过分析DOM结构得到图片地址后,利用request再次发送请求,将请求得到的数据写入本地即可,这里也将其封装为一个函数,追加在index.js文件中:

代码:

function downLoad(imgUrl,i){
    let ext=imgUrl.split(‘.‘).pop();

    request(imgUrl).pipe(fs.createWriteStream(path.join(config.imgDir,i+‘.‘+ext),{

        ‘enconding‘:‘binary‘
    }))

    console.log(i);
}

注意:所获取的数据的二进制数据,所以一定要设置编码格式为binary,因为writeFile的默认编码格式为utf-8,否则保存的图片无法打开。

同时,我们需要将这个download函数作为参数传递给analyze模块的findImg方法,最后运行这个项目的主函数start(),这样项目才会运行起来

index.js

const http=require(‘http‘);
const fs=require(‘fs‘);
const request=require(‘request‘);
const path=require(‘path‘);
const config=require(‘./config‘);
const analyze=require(‘./analyze‘);

function start(){

    request(config.url,function(err,res,body){

        console.log(‘start‘);
        if(!err && res){

            console.log(‘start‘);
            analyze.findImg(body,downLoad);
        }
    })
}

function downLoad(imgUrl,i){
    let ext=imgUrl.split(‘.‘).pop();

    request(imgUrl).pipe(fs.createWriteStream(path.join(config.imgDir,i+‘.‘+ext),{

        ‘enconding‘:‘binary‘
    }))

    console.log(i);
}
start();

最终的结果显示:

运行代码不到5秒钟,就抓取完了并命名好了,这相对于我们手动保存,速度非常快

你想抓取哪个网站的图片就抓取哪个网站的图片(当然除了那些做了防爬虫处理的)。

原文地址:https://www.cnblogs.com/jiguiyan/p/11212387.html

时间: 2024-07-30 15:35:42

Node实战-----爬取网页图片的相关文章

一个咸鱼的Python爬虫之路(三):爬取网页图片

学完Requests库与Beautifulsoup库我们今天来实战一波,爬取网页图片.依照现在所学只能爬取图片在html页面的而不能爬取由JavaScript生成的图.所以我找了这个网站http://www.ivsky.com 网站里面有很多的图集,我们就找你的名字这个图集来爬取 http://www.ivsky.com/bizhi/yourname_v39947/ 来看看这个页面的源代码: 可以看到我们想抓取的图片信息在<li> 里面然后图片地址在img里面那么我们这里可以用Beautifu

Python3批量爬取网页图片

所谓爬取其实就是获取链接的内容保存到本地.所以爬之前需要先知道要爬的链接是什么. 要爬取的页面是这个:http://findicons.com/pack/2787/beautiful_flat_icons 里面有很多不错的图标,目标就是把这些文件图片爬下来,保存成本地图片. 用python3怎么做呢? 第一步:获取要爬取的母网页的内容 import urllib.request import re url = "http://findicons.com/pack/2787/beautiful_f

python爬取网页图片

在Python中使用正则表达式,一个小小的爬虫,抓取百科词条网页的jpg图片.下面就是我的代码,作为参考: #coding=utf-8 # __author__ = 'Hinfa' import re import os from urllib import request as req url='https://baike.baidu.com/item/%E5%B9%BF%E5%B7%9E/72101?fr=aladdin' path='Test//百科广州图片2' os.mkdir(path

python爬虫初学之:爬取网页图片

#!/usr/bin/env python3.5 # -*-coding:utf-8 -*- """ 作者:MR RaoJL 日期:'Sun Dec 25 12:28:08 2016' 用途:爬 www.aitaotu.com/guonei 网站的图片地址 运行环境:Python3.5(widows或linux都可以)主要在linux下测试的 现有的问题:爬取速度太慢 初学者,问题估计太多 """ from itertools import ch

简单的爬取网页图片

import reimport urllib.request # ------ 获取网页源代码的方法 ---def getHtml(url): page = urllib.request.urlopen(url) html = page.read() return html # ------ getHtml()内输入任意帖子的URL ------html = getHtml("http://tieba.baidu.com/p/3205263090")# ------ 修改html对象内

使用JAVA爬取网页图片

经过之前的HttpURLConnection还有各种流的结束,已经可以开始理解怎么下载网页上的一张图片了. 对各种流不理解的话,可以翻翻前面的随笔,讲得都比较详细.在此就不细讲了. 主要流程: 1.HttpURLConnection连接上图片的网址,打开一个InputStream. 2.把InputStream的内容读取到ByteArrayOutputStream中,此时ByteArrayOutputStream存储了图片数据的byte数组. 3.通过文件流,把byte数据填充到一个jpg文件中

Python爬虫爬取网页图片

没想到python是如此强大,令人着迷,以前看见图片总是一张一张复制粘贴,现在好了,学会python就可以用程序将一张张图片,保存下来. 今天逛贴吧看见好多美图,可是图片有点多,不想一张一张地复制粘贴,怎么办呢?办法总是有的,即便没有我们也可以创造一个办法. 下面就看看我今天写的程序: #coding=utf-8 #urllib模块提供了读取Web页面数据的接口 import urllib #re模块主要包含了正则表达式 import re #定义一个getHtml()函数 def getHtm

python3爬取女神图片,破解盗链问题

title: python3爬取女神图片,破解盗链问题 date: 2018-04-22 08:26:00 tags: [python3,美女,图片抓取,爬虫, 盗链] comments: true 前言 其实,抓取图片和抓取小说内容没有任何本质的区别,步骤都是一样的. 但是图片读取的时候,会遇到一个盗链问题.这个问题是花的解决时间最长的. 环境 语言: python3 操作系统: mac 10.12.16 自定义工具包:soup_tool 其依赖工具如下: from urllib import

Node批量爬取头条视频并保存方法

简介 一般批量爬取视频或者图片的套路是,使用爬虫获得文件链接集合,然后通过 writeFile 等方法逐个保存文件.然而,头条的视频,在需要爬取的 html 文件(服务端渲染输出)中,无法捕捉视频链接.视频链接是页面在客户端渲染时,通过某些 js 文件内的算法或者解密方法,根据视频的已知 key 或者 hash 值,动态计算出来并添加到 video 标签的.这也是网站的一种反爬措施. 我们在浏览这些页面时,通过审核元素,可以看到计算后的文件地址.然而在批量下载时,逐个手动的获取视频链接显然不可取