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));

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

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

时间: 2024-12-28 06:42:01

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

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

概要: 这篇博文主要讲一下如何使用Phantomjs进行数据抓取,这里面抓的网站是太平洋电脑网估价的内容.主要是对电脑笔记本以及他们的属性进行抓取,然后在使用nodejs进行下载图片和插入数据库操作. 先进行所有页面的内容进行抓取 var page =require('webpage').create(); var address='http://product.pconline.com.cn/server/'; var fs = require('fs'); var mypath = 'ver

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

测试开发Python培训:抓取新浪微博抓取数据-技术篇 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的selenium的课程中,我们在培训的课程里讲python的语言,也是通过项目实战的方式进行讲解,前期分享了个新浪微博的登陆功能,这次在通过抓取新浪微博数据进一步讲解脚本.(大家对课程感兴趣,请加qq:564202718) 微博有发布微博功能,微博发布后需要验证内容,那么如何验证微博发布数据的正确性,首先要

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

今日头条这类的网站制作,从数据形式,CSS样式都是通过数据接口的样式来决定的,所以它的抓取方法和其他网页的抓取方法不太一样,对它的抓取需要抓取后台传来的JSON数据,先来看一下今日头条的源码结构:我们抓取文章的标题,详情页的图片链接试一下: 看到上面的源码了吧,抓取下来没有用,那么我看下它的后台数据:' 所有的数据都在后台的JSON展示中,所以我们需要通过接口对数据进行抓取 提取网页JSON数据 执行函数结果,如果你想大量抓取记得开启多进程并且存入数据库: 看下结果: 总结一下:网上好多抓取今日

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

需求: 表中同一个uid(用户)拥有多条游戏等级记录,现需要取所有用户最高等级(level)的那一条数据,且时间(time)越早排越前.这是典型的排名表 +------+-------+--------------+---------------------+ | uid | level | role | time | +------+-------+--------------+---------------------+ | 7 | 1 | 摇滚圣魔 | 2014-06-12 15:01:0

nodejs mysql 数据查询例子

1.安装nodejs 2.安装mysql  npm包 地址:https://github.com/felixge/node-mysql npm install mysql 3.相应API查看及调用: var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', user : 'me', password : 'secret' }); connection.connect();

大数据抓取采集框架(摘抄至http://blog.jobbole.com/46673/)

摘抄至http://blog.jobbole.com/46673/ 随着BIG DATA大数据概念逐渐升温,如何搭建一个能够采集海量数据的架构体系摆在大家眼前.如何能够做到所见即所得的无阻拦式采集.如何快速把不规则页面结构化并存储.如何满足越来越多的数据采集还要在有限时间内采集.这篇文章结合我们自身项目经验谈一下. 我们来看一下作为人是怎么获取网页数据的呢? 1.打开浏览器,输入网址url访问页面内容.2.复制页面内容的标题.作者.内容.3.存储到文本文件或者excel. 从技术角度来说整个过程

爬虫_快速构建实时抓取集群

定义: 首先,我们定义一下定向抓取,定向抓取是一种特定的抓取需求,目标站点是已知的,站点的页面是已知的.本文的介绍里面,主要是侧重于如何快速构建一个实时的抓取系统,并不包含通用意义上的比如链接分析,站点发现等等特性. 在本文提到的实例系统里面,主要用到linux+mysql+redis+django+scrapy+webkit,其中scrapy+webkit作为抓取端,redis作为链接库存储,mysql作为网页信息存储,django作为爬虫管理界面,快速实现分布式抓取系统的原型. 名词解析:

Python爬虫抓取技术的门道

web是一个开放的平台,这也奠定了web从90年代初诞生直至今日将近30年来蓬勃的发展.然而,正所谓成也萧何败也萧何,开放的特性.搜索引擎以及简单易学的html.css技术使得web成为了互联网领域里最为流行和成熟的信息传播媒介:但如今作为商业化软件,web这个平台上的内容信息的版权却毫无保证,因为相比软件客户端而言,你的网页中的内容可以被很低成本.很低的技术门槛实现出的一些抓取程序获取到,这也就是这一系列文章将要探讨的话题-- 网络爬虫 . 有很多人认为web应当始终遵循开放的精神,呈现在页面

hibernate抓取策略

18.抓取策略 抓取策略的意思是,在hibernate中,由一个对象如何获取其关联对象的策略,抓取策略是一种优化方式 <set name="students"  lazy="false"  cascasd="save-update"  inverse="false" fetch="select"> 抓取策略: 1.研究的主要是set集合如何提取数据 2.在Classes.hbm.xml文件中 &