概要
 
这篇博客是在上一篇博客Phantomjs+Nodejs+Mysql数据抓取(1.抓取数据)

http://blog.csdn.net/jokerkon/article/details/50868880

后进行的第二部分,请各位读者在看这篇博客之前先浏览上一篇,因为这里面有部分代码会沿用到上一部分的抓取结果。 
好,现在开始正式的抓取图片的讲解 
首先,我们先来看看代码:

var page =require('webpage').create();
var address='http://product.pconline.com.cn/notebook/series/417764.html';
var fs = require('fs');
var mypath='version/Server/server.txt';
var stream = null;
var steams = null;
var files = null;
var K=1;
var line ='';
var cate ='';
var url = '';
var dragPath='version/Server/server_img.txt';
phantom.outputEncoding="gbk";
page.settings.userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"; function start(url){
page.open(url,function(status){
setTimeout(function(){
if(status == 'success'){
console.log('open success!');
console.log('==========begin work!=============');
stream = page.evaluate(function(){
var title = document.querySelector('.pro-info').innerText;
// title = title.replace('图片','');
var cont = document.querySelectorAll('.pics>li>a>img')[1].src;
// var imgUrls = document.querySelectorAll('.pics>li>a>img')[0].src;
var href = document.querySelector('.pics>li>a');
return title+':'+cont+':'+href+'\r\n';
});
console.log(stream);
try{
fs.write(dragPath, stream, 'a');
}catch(e){
console.log(e);
fs.write(dragPath, null, 'a');
}
}else{
console.log('page open fail!');
}
before();
}, 100);
}); } function readFile(status){
streams = fs.open(mypath,'r');
before();
} function before(){
console.log('=========work in befor==========='+K);
K++;
if(!streams.atEnd()){
console.log('=========work in befor get Next Line===========');
line = streams.readLine();
cate = line.split(',');
var imgUrl = cate[1].replace('http://product.pconline.com.cn/server/','');
var imgs = imgUrl.split('/');
var imgsUrl = imgs[1].split('.');
imgsUrl = 'http://product.pconline.com.cn/pdlib/'+imgsUrl[0]+'_picture.html';
console.log(imgsUrl);
start(imgsUrl);
}else{
console.log('end!!!!!!!!!!!!');
phantom.exit();
} } page.open(address,function(status){ readFile(status); })

这部分代码的结构和前面的都很相似,下面我们继续进行代码剖析

page.open(address,function(status){

  readFile(status);

})

与前面相似,这里是我们代码的入口,程序启动的入口。

然后会调用readFile函数

function readFile(status){
streams = fs.open(mypath,'r');
before();
}

这里使用phantomjs里面的fs请求,主要就是用来解决文件读取的问题

var fs = require('fs');

再读取到文件之后,我们将进行数据处理:

function before(){
console.log('=========work in befor==========='+K);
K++;
if(!streams.atEnd()){
console.log('=========work in befor get Next Line===========');
line = streams.readLine();
cate = line.split(',');
var imgUrl = cate[1].replace('http://product.pconline.com.cn/server/','');
var imgs = imgUrl.split('/');
var imgsUrl = imgs[1].split('.');
imgsUrl = 'http://product.pconline.com.cn/pdlib/'+imgsUrl[0]+'_picture.html';
console.log(imgsUrl);
start(imgsUrl);
}else{
console.log('end!!!!!!!!!!!!');
phantom.exit();
} }

我们可以先来看看原本数据是什么样的:

联想ThinkServer TS130 S1225/2G/500O       价格:¥5417,http://product.pconline.com.cn/server/lenovo/514943.html

上面是我们从文件中读取到的数据,这一段数据都属于这个品牌电脑的数据。在读取完之后,我们对url进行拼接。

http://product.pconline.com.cn/pdlib/514943_picture.html

这个是我们要获取到的目的url,读者可以自己研究有什么规律,我这里的拼接方法有点挫。你们可以自己改进。

function start(url){
page.open(url,function(status){
setTimeout(function(){
if(status == 'success'){
console.log('open success!');
console.log('==========begin work!=============');
stream = page.evaluate(function(){
var title = document.querySelector('.pro-info').innerText;
// title = title.replace('图片','');
var cont = document.querySelectorAll('.pics>li>a>img')[1].src;
// var imgUrls = document.querySelectorAll('.pics>li>a>img')[0].src;
var href = document.querySelector('.pics>li>a');
return title+':'+cont+':'+href+'\r\n';
});
console.log(stream);
try{
fs.write(dragPath, stream, 'a');
}catch(e){
console.log(e);
fs.write(dragPath, null, 'a');
}
}else{
console.log('page open fail!');
}
before();
}, 100);
}); }

最后调用数据抓取的函数,

var title = document.querySelector('.pro-info').innerText;
// title = title.replace('图片','');
var cont = document.querySelectorAll('.pics>li>a>img')[1].src;
// var imgUrls = document.querySelectorAll('.pics>li>a>img')[0].src;
var href = document.querySelector('.pics>li>a');
return title+':'+cont+':'+href+'\r\n';

这里面的就是我们要抓数据的处理,分别获取到的是标题,小图的绝对地址,已经大图的url。

联想ThinkServer TS130 S1225/2G/500O图片:http://img.pconline.com.cn/images/product/5149/514938/TS130-b_sn8.jpg:http://product.pconline.com.cn/pdlib/514943_bigpicture7748163.html

这部分数据就是其中一条我们抓取到的数据。再抓完之后会进行写入操作,然后再重新调用before()方法,进行循环调用,直至读取玩文件的所有内容。

以上就是我们进行图片抓取的全部过程,原本还有一份代码是用来抓取大图的,但是由于与本文的内容相似度极高,所以这里我就不列出来了。读者可以参考这篇文章进行大图的抓取。

NodeJs 图片下载 
接下来我在讲一下如何对我们刚刚抓下来的图片绝对地址进行文件下载。

先上代码:

var request = require('request');
var lineReader = require('line-reader');
var fs = require('fs');
var i=0; lineReader.eachLine('imgs.txt', {encoding: 'utf8'},function(line, last) { var cate = line.split(':');
var url1 = cate[1]; var tt = cate[0].replace(/\//g,',');
i++;
console.log(tt+'==============>'+i);
if(!(url1 == 'null')){
tt = tt.replace(/\s/g,'');
tt = tt.replace(/[^a-z\d]/ig,""); var filename1 = 'images/router_large/'+tt+'bPic.jpg'
request(url1).pipe(fs.createWriteStream(filename1)); }
});

没错代码就那么短,我们来一段一段的分析:

lineReader.eachLine('imgs.txt', {encoding: 'utf8'},function(line, last)

这里是我们下载文件的入口,使用到了nodejs里面的

var lineReader = require('line-reader');

这段代码的用处就是逐行读取文件。

  tt = tt.replace(/\s/g,'');
tt = tt.replace(/[^a-z\d]/ig,"");

这里面我主要是处理一下文件名,除去了一些特殊符号已经中文名,便于存入数据库。

request(url1).pipe(fs.createWriteStream(filename1));

最后调用这部分代码进行文件下载。

以上就是抓取图片的全部内容,谢谢观看。

Phantomjs+Nodejs+Mysql数据抓取(2.抓取图片)的更多相关文章

  1. Phantomjs+Nodejs+Mysql数据抓取(1.数据抓取)

    概要: 这篇博文主要讲一下如何使用Phantomjs进行数据抓取,这里面抓的网站是太平洋电脑网估价的内容.主要是对电脑笔记本以及他们的属性进行抓取,然后在使用nodejs进行下载图片和插入数据库操作. ...

  2. 测试开发Python培训:抓取新浪微博抓取数据-技术篇

    测试开发Python培训:抓取新浪微博抓取数据-技术篇   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的se ...

  3. 网站爬取-案例三:今日头条抓取(ajax抓取JS数据)

    今日头条这类的网站制作,从数据形式,CSS样式都是通过数据接口的样式来决定的,所以它的抓取方法和其他网页的抓取方法不太一样,对它的抓取需要抓取后台传来的JSON数据,先来看一下今日头条的源码结构:我们 ...

  4. PHP登入网站抓取并且抓取数据

    有时候需要登入网站,然后去抓取一些有用的信息,人工做的话,太累了.有的人可以很快的做到登入,但是需要在登入后再去访问其他页面始终都访问不了,因为他们没有带Cookie进去而被当做是两次会话.下面看看代 ...

  5. C#使用Selenium实现QQ空间数据抓取 说说抓取

    上一篇讲的是如何模拟真人操作登录QQ空间,本篇主要讲述一下如何抓取QQ说说数据 继续登录空间后的操作 登陆后我们发现QQ空间的菜单其实是固定的,只需要找到对应元素就可以,继续XPath 可以得到地址 ...

  6. nodejs mysql 数据查询例子

    1.安装nodejs 2.安装mysql  npm包 地址:https://github.com/felixge/node-mysql npm install mysql 3.相应API查看及调用: ...

  7. Mysql 数据分组取某字段值所有最大的记录行

    需求: 表中同一个uid(用户)拥有多条游戏等级记录,现需要取所有用户最高等级(level)的那一条数据,且时间(time)越早排越前.这是典型的排名表 +------+-------+------- ...

  8. Python3.6爬虫+Djiago2.0+Mysql --数据爬取

    1.下载对应版本的python mysql 模块 我的是:pymssql-2.2.0.dev0-cp36-cp36m-win_amd64.whl 2.手动创建table create table gr ...

  9. Golang分布式爬虫:抓取煎蛋文章|Redis/Mysql|56,961 篇文章

    --- layout: post title: "Golang分布式爬虫:抓取煎蛋文章" date: 2017-04-15 author: hunterhug categories ...

随机推荐

  1. 探索C#之6.0语法糖剖析

    阅读目录: 自动属性默认初始化 自动只读属性默认初始化 表达式为主体的函数 表达式为主体的属性(赋值) 静态类导入 Null条件运算符 字符串格式化 索引初始化 异常过滤器when catch和fin ...

  2. Xshell 连接CentOS服务器解密

    平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4822808.html Xshell生成密钥key(用于Linux 免密码登录)htt ...

  3. css中的浮动与三种清除浮动的方法

    说到浮动之前,先说一下CSS中margin属性的两种特殊现象 1, 外边距的合并现象: 如果两个div上下排序,给上面一个div设置margin-bottom,给下面一个div设置margin-top ...

  4. Android ViewPager打造3D画廊

    本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发. 网上有很多关于使用Gallery来打造3D画廊的博客,但是在关于Gallery的官方说法中表明: This cl ...

  5. 拼图小游戏之计算后样式与CSS动画的冲突

    先说结论: 前几天写了几个非常简单的移动端小游戏,其中一个拼图游戏让我郁闷了一段时间.因为要获取每张图片的位置,用`<style>`标签写的样式,直接获取计算后样式再用来交换位置,结果就悲 ...

  6. 我这么玩Web Api(二):数据验证,全局数据验证与单元测试

    目录 一.模型状态 - ModelState 二.数据注解 - Data Annotations 三.自定义数据注解 四.全局数据验证 五.单元测试   一.模型状态 - ModelState 我理解 ...

  7. BlockingCollection使用

    BlockingCollection是一个线程安全的生产者-消费者集合. 代码 public class BlockingTest { BlockingCollection<int> bc ...

  8. SharePoint 2016 入门视频教程

    之前一直有朋友让自己录一些SharePoint的入门视频,之前没有太多时间,一个巧合的机会收到CSDN学院的邮件,可以在CSDN上发布视频教程,自己就录了一些.说起录视频也是蛮辛苦的,每天下班吃完饭要 ...

  9. Eclipse使用Git教程

    A:点击Window--->Show view--->other..--->Git Repositories--->[OK] B:克隆码云上的代码仓库 C:选择对应目录存储你的 ...

  10. Ubuntu 16.04 安装 arm-linux-gcc 嵌入式交叉编译环境 问题汇总

    闲扯: 实习了将近半年一直在做硬件以及底层的驱动,最近要找工作了发现了对linux普遍要求很高,而且工作岗位也非常多,所以最近一些时间在时不时地接触linux. 正文:(我一时兴起开始写博客,准备不充 ...