使用nodeJs从汽车之家爬取汽车外观图片
最近在做毕业设计的时候需要用到大量的汽车图片作为数据集进行训练,一开始尝试从两个渠道获取图片:
一是去找ImageNet 中的汽车分类的图片,结果发现这里面的汽车图片总量比较少,且不同车种差异较大(我只想要一般的私家车图片)。还有一个问题是访问ImageNet 需要外网,从别人那里接了一台能翻墙的服务器,选了合适的种类,折腾半天,好不容易下载下来,再清洗一下,能用的只剩五千张左右;
二是从百度图片上以汽车为关键词爬取图片,这个方案的问题在于爬到的图片各式各样,虽然关键词是汽车,但是什么图片都可能爬得到,而且图片重复率高,质量差,清洗的成本非常高。
于是开始思考从汽车之家上爬取图片,去看了一下,汽车之家上的图片质量都很高,而且数量非常多,就用nodeJs 写个脚本开始爬。本文主要记录了在写脚本过程中的思考和尝试过程,并给出了最终的代码。为了使整个过程看起来逻辑更清晰,把这个完整的任务分成图片Url 获取和图片获取两部分来实现。Url 获取的结果是一个或若干个写满了图片Url 地址的txt 文件(在线传输成本低),图片获取的结果是根据Url 文件中的内容爬到的图片。
1、图片Url 获取
所有的图片Url 都是从汽车之家的网页上拿到的,所以首先需要对包含汽车外观图片的页面进行分析,以便搞清楚我们要怎么拿到网页中图片的Url,这里以如下页面为例进行分析:
https://car.autohome.com.cn/pic/series/2288-1.html#pvareaid=2042220
页面图片如下所示:
从图中可以看到series 系列网页中所有车身外观的图片都位于具有.uibox-con.carpic-list03 类名的一个div 下,其具体位置可以表示如下:
div.uibox-con.carpic-list03 ul li a img
从图中可以看到的另个一问题是img 的src 属性有点异常,不是以http 开头的,而是以// 开头,因此拿到这个值之后,需要将// 替换为http://.
下面一个问题是如果该页面有很多张图片,需要翻页怎么办?针对这个问题,同样可以分两步来解决,一是弄清楚有无翻页,有翻页的话一共有多少页;二是获取到每页的Url。怎么样得到这两个问题的答案呢,操作步骤跟上面就类似,要去看页面两个地方是怎么写的:
分析完了,从技术层面的角度来讲,nodeJs 中的包https 和cheerio 分别可以帮我们请求到页面和解析页面的DOM 结构,具体细节不再进行描述,获取图片Url 的代码如下所示:
var https = require('https');
var request = require('request');
var cheerio = require('cheerio');
var fs = require('fs'); //用来操作文件
var urlBase = 'https://car.autohome.com.cn/pic/series/'
var url = 'https://car.autohome.com.cn/pic/series/2288-1-p1.html' //定义要爬的页面saveDir = ''function getAllHtml(urlBase, startIndex, maxIndex, txt) {var nowIndex = startIndex;saveDir = txtvar intId = setInterval(function() {getHtmlAllPagesImg(urlBase, nowIndex)nowIndex++;if(nowIndex > maxIndex) {clearInterval(intId);}}, 4000)
}// 获取一个html 下所有分页的img
function getHtmlAllPagesImg(url, nowIndex) {fullUrl = url + nowIndex + '-1' + '.html';console.log(fullUrl);https.get(fullUrl, function(res){var html = '',titles = [];res.setEncoding('utf-8') //防止中文乱码res.on('data', function(chunk){html += chunk; //监听data事件 每次取一块数据})res.on('end', function() {var allStr = '';var $ = cheerio.load(html); //获取数据完成后,解析html// console.log(nowIndex + ' box length: ' + $('.uibox-con.carpic-list03').length);// 如果存在车身外观图片则继续进行if($('.uibox-con.carpic-list03').length > 0) {console.log('Series_' + nowIndex + ' 有车身图片box,哈哈哈...')// 如果需要翻页的话if($('.pagecont .page').length > 0) {// 当前显示的图片总页数var pageNum = $('.pagecont .page').children().length - 2;// console.log(pageNum)if(pageNum > 0) {console.log('Series_' + nowIndex + '需要翻页...')for (var i = 1; i <= pageNum; i++) {getSinglePageImg(url + nowIndex + '-1' + '-p' + i + '.html');}} else {getSinglePageImg(fullUrl);}} else {getSinglePageImg(fullUrl);}}else {console.log('Series_' + nowIndex + '无车身图片box!');console.log('================')return;}})})
}// 获取某个html 下单页的图片src
function getSinglePageImg(url) {https.get(url, function(res){var html = '',titles = [];res.setEncoding('utf-8') //防止中文乱码res.on('data', function(chunk){html += chunk; //监听data事件 每次取一块数据})res.on('end', function() {var nowImgStr = '';var $ = cheerio.load(html); //获取数据完成后,解析html// console.log(url + '......' + $('.uibox-con.carpic-list03 ul li').length)$('.uibox-con.carpic-list03 ul li').each(function(index, val) {nowImgStr += 'http:' + $(this).children('a').children('img').attr('src') + '\n'});if (nowImgStr) {console.log(url + ' 成功获取到图片...');fs.writeFile(saveDir, nowImgStr, { 'flag': 'a' }, function(err, data) {if(err) {console.log('Failure.');} else {console.log('Saved.')}console.log('****************************')})} else {console.log(url + ' 没有获取到图片!');console.log('----------------------')}})})
}module.exports = { getAllHtml }
2、图片获取
拿到图片的Url 之后,第二步就很简单了,只要遍历一下txt 文件中的Url,挨个获取,就能拿到所有的相关图片,代码如下:
var fs = require('fs');
const { runCmd } = require('./cmd')function getImg(txt, dir) {fs.readFile(txt, 'utf-8', function (err, data) {var imgList = data.split('\n');var imgNum = imgList.length;for(var i = 1; i <= imgNum; i++) {if(imgList[i]) {runCmd('start img_' + i,'cd ' + dir + ' && wget ' + imgList[i] + ' -O img_' + i + '.jpg' ,'done img_' + i,i * 10)}}})
}module.exports = { getImg };
此处的runCmd 实际上是用node-cmd 模块写的一个简单的工具类,用来执行shell 命令,完整代码可以去github 看。
3、Github
Github 地址:https://github.com/TerminatorSd/carCrawler
在网上找一些简单工具或者算法的开源实现时经常遇到的一个问题是,由于环境或者其他各种问题,代码根本跑步起来(大部分情况是因为很多人都不写readme),然后在博客上留言或者github 上提issue 之后都没有人回复。这种情况时常让我觉得非常苦恼,所以我在github 上放东西的时候一般都会写readme。代码或者内容有问题的话,直接博客留言,或者提issue,也基本可以回复,因为每天都要上博客和github,希望这样能够让信息流通的快一点。
使用nodeJs从汽车之家爬取汽车外观图片相关推荐
- python爬取汽车之家_python爬虫实战之爬取汽车之家网站上的图片
随着生活水平的提高和快节奏生活的发展.汽车开始慢慢成为人们的必需品,浏览各种汽车网站便成为购买合适.喜欢车辆的前提.例如汽车之家网站中就有最新的报价和图片以及汽车的相关内容,是提供信息最快最全的中国汽 ...
- python3爬虫系列16之多线程爬取汽车之家批量下载图片
python3爬虫系列16之多线程爬取汽车之家批量下载图片 1.前言 上一篇呢,python3爬虫系列14之爬虫增速多线程,线程池,队列的用法(通俗易懂),主要介绍了线程,多线程,和两个线程池的使用. ...
- Python 爬虫实战入门——爬取汽车之家网站促销优惠与经销商信息
在4S店实习,市场部经理让我写一个小程序自动爬取汽车之家网站上自家品牌的促销文章,因为区域经理需要各店上报在网站上每一家经销商文章的露出频率,于是就自己尝试写一个爬虫,正好当入门了. 一.自动爬取并输 ...
- python爬虫(二十四)爬取汽车之家某品牌图片
爬取汽车之家某品牌图片 需求 爬取汽车之家某品牌的汽车图片 目标url https://car.autohome.com.cn/photolist/series/52880/6957393.html# ...
- python爬虫利用Scrapy框架爬取汽车之家奔驰图片--实战
先看一下利用scrapy框架爬取汽车之家奔驰A级的效果图 1)进入cmd命令模式下,进入想要存取爬虫代码的文件,我这里是进入e盘下的python_spider文件夹内 C:\Users\15538&g ...
- 使用scrapy框架爬取汽车之家的图片(高清)
使用scrapy框架爬取汽车之家的图片(高清) 不同于上一篇的地方是,这篇要爬取的是高清图片,而不仅仅是缩略图. 先来看一下要爬取的页面:https://car.autohome.com.cn/pic ...
- 爬取汽车之家北京二手车信息
爬取汽车之家北京二手车信息 经测试,该网站:https://www.che168.com/beijing/list/ 反爬机制较低,仅需要伪造请求头设置爬取速率,但是100页之后需要登录,登录之后再爬 ...
- python3 爬取汽车之家所有车型数据操作步骤(更新版)
题记: 互联网上关于使用python3去爬取汽车之家的汽车数据(主要是汽车基本参数,配置参数,颜色参数,内饰参数)的教程已经非常多了,但大体的方案分两种: 1.解析出汽车之家某个车型的网页,然后正则表 ...
- 爬取汽车之家图片 - scrapy - crawlspider - python爬虫案例
爬取汽车之家图片 需求:爬取汽车之家某一个汽车的图片 一. 普通scrapy 第一步 页面分析 目标url: https://car.autohome.com.cn/photolist/serie ...
最新文章
- Git error: Unable to negotiate with X.X.X.X : no matching host key type found . their offer: ssh-dss
- 建校仅11年就入选“双一流” ,这所高校是凭什么做到的?
- plsql动态的sql
- python读书笔记2000_流畅的Python读书笔记
- JS-面向对象-创建具有私有属性的构造函数(2种方法)
- activiti操作流程的几个demo
- 基于visual Studio2013解决C语言竞赛题之0203格式化输出
- 技术无价,“悟”有所值——UCan下午茶这一年
- 阻塞与非阻塞都是什么呢?
- mysql循环遍历获取_mysql存储过程之循环遍历查询结果集
- java窗口图标怎么换_如何更改Swing窗口的默认图标?
- class path resource [applicationContext.xml] cannot be opened because it does not exist,jar包缺失
- Python——字典类型理论及应用实例
- 山狮系统_苹果操作系统OSX10.8山狮/美洲狮Mountain Lion怎么安装
- QQ 空间备份神器,一键备份你所有的青春!
- 7、中置、一元、赋值、结合、apply和update、unapply提取器
- 香农费诺编码 c语言实现,信息论课程设计(香农、费诺编码)
- 如果使代码更加合理更加有条理
- template or fragment could not be resolved
- 确定期货开户保证金是否合理
热门文章
- 【零散知识】受限波兹曼机(restricted Boltzmann machine,RBM)和深度置信网络(deep belief network,DBN)
- 计算机学院社会实践,计算机学院、软件学院暑期社会实践
- js全屏操作之判断全屏
- 哪些行业的“饭碗”最容易受区块链的影响?
- 2021年年终总结之叙事篇
- 查找算法【哈希表】 - 散列查找及性能分析
- C程序:计算矩形体积
- 美国留学生研究生计算机专业,美国研究生计算机专业排名
- 海洛因(Heroin)服务器
- PCN-224,PCN-224(H),CAS:1476810-88-4,金属有机骨架材料PCN-224(H)