Phantomjs+Nodejs+Mysql数据抓取(2.抓取图片)

概要 这篇博客是在上一篇博客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));

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

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏移动开发之家

Flutter完整开发实战详解(二、 快速开发实战篇)

 作为系列文章的第二篇,继《Flutter完整开发实战详解(一、Dart语言和Flutter基础)》之后,本篇将为你着重展示:如何搭建一个通用的Flutter ...

1133
来自专栏郭霖

Android ListView异步加载图片乱序问题,原因分析及解决方案

在Android所有系统自带的控件当中,ListView这个控件算是用法比较复杂的了,关键是用法复杂也就算了,它还经常会出现一些稀奇古怪的问题,让人非常头疼。比...

28010
来自专栏双十二技术哥

深入Weex系列(六)Weex渲染流程分析

在前两篇文章中我们结合源码学习了Module、Component的注册、调用、回调等流程,相信大家一定收获颇多,对Weex的理解也一定愈加深入。

835
来自专栏守望轩

html页面表格导出到excel总结

最近一个项目需要把报表的表格导入excel,在网上找了一些方法,比较研究了一下,记在这里,备忘。 表格例子如下: <table id="tableExcel" ...

2009
来自专栏移动开发面面观

Glide缓存探密Glide的缓存策略

762
来自专栏技术小讲堂

ASP.NET AJAX(12)__浏览器兼容功能判断浏览器的类型和版本Sys.Browser针对DOM元素的兼容操作针对DOM事件的兼容操作

目前,常见的浏览器IE(6,8,9),chrome,firefox,safari等,还有国内的一些曾经靠恐吓用户来提高使用率的某浏览器(河蟹社会),这些浏览器对...

3609
来自专栏技术小讲堂

ASP.NET AJAX(3)__UpdatePanel

今天也不知道写不写的完了,最近闲下来了,却感冒了,早上起来都不会说话了,不过幸亏咱不是靠嘴皮子过活了,哎~~~~窃喜吧 上一篇简单写到UpdatePanel的一...

3015
来自专栏腾讯IVWEB团队的专栏

React + Redux 组件化方案

在介绍组件化方案之前,先对 react 和 redux 做一个简单介绍。理想中的组件化,第一步应该就是组件的标签化, 例如有一个 Header 组件,无需关注...

5740
来自专栏何俊林

FFmpeg实现多段小视频合成

1412
来自专栏信安之路

绕过内容安全策略总结

今年的 0CTF 预选赛 6 道 web 题,其中三道都涉及 CSP 的知识点,简直可怕。。。这次趁着空闲时间就稍稍总结一下 CSP 绕过方面的知识,无论是对以...

1030

扫描关注云+社区