Node.js 使用爬虫批量下载网络图片到本地
图片网站往往广告众多,用Node.js写个爬虫下载图片,代码不长,省事不少,比手动一张张保存简直是天与地的区别。以前用Java也做过远程图片下载,但Node.js的下载速度更让人咂舌,这也是非阻塞式变成的好处。
下面代码是一个从mtl.ttsqgs.com下载图片的程序,图片地址是看网站源码看出来的,总共有多少张也可以在网页或源码里找到,然后就是顺藤摸瓜。爬虫无外乎找规律再写代码实现的套路。
- // 内置http模块,提供了http服务器和客户端功能
- var http=require("http");
- // cheerio模块,提供了类似jQuery的功能
- var cheerio = require("cheerio");
- // 内置文件处理模块
- var fs=require('fs');
- // 请求参数JSON
- var options;
- // 请求并获得数据
- var req;
- var index=1; // 起始页码
- var endIndex=43; // 终止页码
- function downloadImg(pageNumber){
- console.log("开始读取第"+pageNumber+"页");
- // eg:http://mtl.ttsqgs.com/images/img/4527/3.jpg
- options={
- hostname:'mtl.ttsqgs.com',// 这里别加http://,否则会出现ENOTFOUND错误
- port:80,
- path:'/images/img/798/'+pageNumber+'.jpg',// 子路径
- method:'GET',
- };
- req=http.request(options,function(resp){
- var imgData = "";
- resp.setEncoding("binary");
- resp.on('data',function(chunk){
- imgData+=chunk;
- });
- resp.on('end',function(){
- var fileName="./xyyx/"+pageNumber+".jpg";
- fs.writeFile(fileName, imgData, "binary", function(err){
- if(err){
- console.log("文件"+fileName+"下载失败.");
- }
- console.log(fileName+"下载成功");
- });
- });
- });
- // 超时处理
- req.setTimeout(5000,function(){
- req.abort();
- });
- // 出错处理
- req.on('error',function(err){
- if(err.code=="ECONNRESET"){
- console.log('socket端口连接超时。');
- }else{
- console.log('请求发生错误,err.code:'+err.code);
- }
- });
- // 请求结束
- req.end();
- // 43页调完
- if(index<endIndex){
- index++;
- console.log('继续第'+index+'页');
- start(index);
- }
- }
- // 包一层函数
- function start(i){
- downloadImg(i);
- }
- // 开始
- start(index);
2017年9月30日10:43:27
Node.js 使用爬虫批量下载网络图片到本地的更多相关文章
- Node.js mm131图片批量下载爬虫1.01 增加断点续传功能
这里的断点续传不是文件下载时的断点续传,而是指在爬行页面时有时会遇到各种网络中断而从中断前的页面及其数据继续爬行的过程,这个过程和断点续传原理上相似故以此命名.我的具体做法是:在下载出现故障或是图片已 ...
- Node.js mimimn图片批量下载爬虫 1.00
这个爬虫在Referer设置上和其它爬虫相比有特殊性.代码: //====================================================== // mimimn图片批 ...
- Node.js aitaotu图片批量下载Node.js爬虫1.00版
即使是https网页,解析的方式也不是一致的,需要多试试. 代码: //====================================================== // aitaot ...
- Node.js umei图片批量下载Node.js爬虫1.00
这个爬虫在abaike爬虫的基础上改改图片路径和下一页路径就出来了,代码如下: //====================================================== // ...
- Node.js abaike图片批量下载Node.js爬虫1.01版
//====================================================== // abaike图片批量下载Node.js爬虫1.01 // 1.01 修正了输出目 ...
- Node.js abaike图片批量下载Node.js爬虫1.00版
这个与前作的差别在于地址的不规律性,需要找到下一页的地址再爬过去找. //====================================================== // abaik ...
- Node.js nvshens图片批量下载爬虫 1.00
//====================================================== // www.nvshens.com图片批量下载Node.js爬虫1.00 // 此程 ...
- Node.js meitulu图片批量下载爬虫1.06版
//====================================================== // https://www.meitulu.com图片批量下载Node.js爬虫1. ...
- Node.js meitulu图片批量下载爬虫 1.05版(Final最终版)
//====================================================== // https://www.meitulu.com图片批量下载Node.js爬虫1. ...
随机推荐
- gdrive无限网盘挂载systemd文件
我的博客新地址:www.liuquanhao.com --------------------------------------------------------------------- 首先应 ...
- DRF视图集的使用
# 原创,转载请留言联系 如果要把同一种http请求方法的多个接口放在同一个视图中,比如:查询多条数据和一条数据都是get请求,放在同一个视图里,应该怎么做呢??? 如果直接放在一起,会怎样呢? # ...
- 【C++】嵌套类、友元
黄邦勇帅 里面关于嵌套类的介绍我有疑惑.里面11.9说在创建一个外围类的对象时先执行嵌套类的构造函数然后再执行外围类的构造函数,析构函数则以相反的方式执行. 可是我编程实验了一下,创建外围类对象时并不 ...
- go语言多态接口样例
感觉比java玄幻啊~~~ package main import ( "fmt" ) type notifier interface{ notify() } type user ...
- CSS基本属性—文本属性和背景属性
一.CSS常用文本属性 [css中的颜色表示方式] 1.直接使用颜色的单词表示:red.green.blue 2.使用颜色的十六进制表示:#ff0000,#00ff00: 六位数,两两 ...
- flutter 极光推送
一.配置极光开发者 1.注册极光开发者 https://www.jiguang.cn/push 2.创建应用 二.创建APP 1.添加依赖 pubspec.yaml 添加: flutter_jpus ...
- (1)python Scrapy爬虫框架
部署 1.安装python3.6 64bit 2.下载pywin32 https://sourceforge.net/projects/pywin32/files/pywin32/ 双击安装 3.下 ...
- AtCoder Grand Contest 023 A - Zero-Sum Ranges
Time limit : 2sec / Memory limit : 256MB Score : 200 points Problem Statement We have an integer seq ...
- 22、Flask实战第22天:Flask信号
Flask中的信号使用的是一个第三方插件blinker.通过pip list看一下是否安装,如果没有,则使用如下命令安装 pip install blinker 自定义信号 自定义信号分为3步: ①定 ...
- ASP.NET Core 2.2 基础知识(二) 中间件
中间件是一种装配到应用管道以处理请求和相应的软件.每个软件都可以: 1.选择是否将请求传递到管道中的下一个组件; 2.可在调用管道中的下一个组件前后执行工作. 管道由 IApplicationBuil ...