PhantomJS CapserJS를 통한 크롤링 정리 -2
bing 검색결과 가져오기
bing의 경우 검색결과를 보면 아래와 같이 DOM이 나온다 (bing에서 개발자도구)
class="b_algo" data-bm="8" class="b_title" target="_blank" href="http://casperjs.org/" h="ID=SERP,5100.1"CasperJS, a navigation scripting and testing utility … class="b_suffix b_secondaryText nowrap" target="_blank" href="http://www.microsofttranslator.com/bv.aspx?ref=SERP&br=ro&mkt=ko-KR&dl=ko&lp=EN_KO&a=http%3a%2f%2fcasperjs.org%2f" h="ID=SERP,5107.1"번역 보기 class="b_caption" class="b_attribution" u="0N|5088|4633283525150274|o_PI4ciGKG46-UTuYr8QUhAeTMF0oCpZ"casperjs.org href="#" aria-label="이 사이트에 대한 작업" aria-haspopup="true" class="c_tlbxTrg" class="c_tlbxTrgIcn sw_ddgn" class="c_tlbxH" h="BASE:CACHEDPAGEDEFAULT" k="SERP,5101.1"2017-04-25CasperJS is a browser navigation scripting & testing utility written in Javascript for PhantomJS or SlimerJS.
url 태그의 경우 b_algo 클래스 아래의 a태그가 된다.
//capserjs initalizingvar casper = require('casper').create({verbose: true,logLevel: 'error',clientScripts:[]});var links = [];function getLinks(){//b_algo 클래스 하위 dom중 a 태그를 선택var links = document.querySelectorAll('.b_algo a');return Array.prototype.map.call(links, function(e){//링크들의 href를 반환return e.getAttribute('href');})};casper.start('http://bing.com/', function(){//selector 를 통해 데이터를 채운다this.fill('form[action="/search]',{//name="q"에 casperjs인자를 넣는다q:'casperjs'}, true);});//시작casper.run();
////////////////////////// capser.start method///////////////////////casper.then(function(){//evaluate는 현재 돔에 대한 상태를 인자로 받는다.links = this.evaluate(getLinks);});//실행casper.run();
추가동작
casper.then(function(){//evaluate는 현재 돔에 대한 상태를 인자로 받는다.links = this.evaluate(getLinks);//검색이 끝난 후 이번엔 phantomjs를 검색this.fill('form[action="/search]',{//name="q"에 casperjs인자를 넣는다q:'phantomjs'}, true);})
전체소스
//capserjs initalizingvar casper = require('casper').create({verbose: true,logLevel: 'error',clientScripts:[]});var links = [];function getLinks(){//b_algo 클래스 하위 dom중 a 태그를 선택var links = document.querySelectorAll('.b_algo a');return Array.prototype.map.call(links, function(e){//링크들의 href를 반환return e.getAttribute('href');})};casper.start('http://bing.com/', function() {// search for 'casperjs' from google formthis.fill('form[action="/search"]', {q: 'casperjs'}, true);});casper.then(function() {// aggregate results for the 'casperjs' searchlinks = this.evaluate(getLinks);// now search for 'phantomjs' by filling the form againthis.fill('form[action="/search"]', {q: 'phantomjs'}, true);});casper.then(function() {// aggregate results for the 'phantomjs' searchlinks = links.concat(this.evaluate(getLinks));});//시작casper.run(function(){//echo results in a readable fashionthis.echo(links.length +'links founds:');this.echo('-' +links.join('\n - ')).exit();});
커스텀 스크립트 삽입
var casper = require('casper').create({verbose: true,logLevel: 'debug',clientScripts: ["vendor/jquery.min.js", "vendor/lodash.js"]});
위와같이 커스텀 스크립트를 삽입할 수 있다. jquery의 경우
기존 소스에서의
//b_algo 클래스 하위 dom중 a 태그를 선택var links = document.querySelectorAll('.b_algo a');return Array.prototype.map.call(links, function(e){//링크들의 href를 반환return e.getAttribute('href');})
부분을
function getLinks() {// var links = document.querySelectorAll('.b_algo a');var links = $('.b_algo a')return _.map(links, function(e) {return e.getAttribute('href');});}
위와 같이 jquery selector를 통해 사용할 수 있다.