Photomjs+Nodejs+Mysqlデータキャプチャ(2.キャプチャ画像)

16698 ワード

概要このブログは前のブログでPhotomjs+Nodejs+Mysqlデータをキャプチャします.
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
'
; }); 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
'
; }); 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
'
;
この中のは私達がデータをつかむ処理で、それぞれ獲得したのはタイトルで、小図の絶対住所、すでに大図の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');
このコードの用途はファイルを1行ずつ読み込むことです.
    tt = tt.replace(/\s/g,'');
    tt = tt.replace(/[^a-z\d]/ig,"");
この中では主にファイル名を処理します.特殊な記号を除いて中国語名になりました.データベースに保存しやすいです.
request(url1).pipe(fs.createWriteStream(filename1));
最後にこのコードを呼び出してファイルをダウンロードします.
以上は写真の内容を全部把握しました.ありがとうございます.