지난 포스팅에 말했다 싶이 일정 시간마다 instagram,twitter 데이터를 크롤링 하는 스케쥴링을 구현해볼 생각이다
처음에는 간단하게 twitter api,instagram api 만을 이용해서 가져오면되지않을까?
라는 별거아닌 생각으로 프로그램 작성을 했다..
트위터는 api 를 무난하게 사용해 작성을하였는데.. 아뿔사...
인스타그램은 .. 정책이변경되서 권한이 얻기가 ... 드릅게 빡세다 ...
어쩔수없이 페이지 자체를 크롤링 하는 방향으로 포커스를 맞췄다 아 내시간 ㅁ느아ㅣㅡㅁ니ㅏㅇ
#트위터 ,인스타그램 페이지 크롤링
트위터 홈페이지에서 #블랙베리 라는 태그를 가지고 검색을 한 화면 이다
트위터 나 인스타그램 같은경우는 화면을 최하단으로 스크롤 할경우 자동으로 다음페이지를 불러오게 되어있다
이런문제때문에 생각해볼게 좀많아서 이걸 어찌하나 했는데
http://blog.nundefined.com 이 글의 도움을 많이 받았다
우선 크롤링을 하기위해서는
PhantomJS,CasperJS,SpookyJS 가 필요하다
설치하는 방법은 구글에 많이있으니 참고해서 설치하시기 바랍니다..
간단하게 설명하자면
PhantomJS/CasperJS 같은경우는 webkit 기반의 headless browser 이다 즉, 단독브라우저로 웹테스트 할떄 많이들 사용한다고 하더라
SpookyJS 위의 CasperJS,PhantomJs같은 경우는 node 와 관계없이동작하기때문에 이를 컨트롤 하기 위해서 사용을한다
function.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | scheduletwitter: function(count) { var searchquery = config.schedule.hashtag[count]; //앞서 저장되어있던 수집태그 var id = config.schedule.name[count]; //앞서 저장되어있던 id값 var encsearchquery = encodeURIComponent(searchquery); var url = 'https://twitter.com/search?f=tweets&vertical=default&q=%23'+encsearchquery+'&src=typd'; var Spooky = require('spooky'); var spooky = new Spooky({ casper: { logLevel: 'debug', verbose: false, options: { clientScripts: ['https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js'] }, viewportSize: { width: 1440, height: 768 }, pageSettings: { webSecurityEnabled: false, userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11" // Spoof being Chrome on a Mac (https://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx) } } }, function (err) { if (err) { e = new Error('Failed to initialize SpookyJS'); e.details = err; throw e; } spooky.start(url); var twitter = function() { spooky.then(function(){ this.scrollToBottom(); this.wait(1000); var newScrolleds = this.evaluate(function() { return window.scrollY; }); var newScrolled = this.evaluate(function() { return window.document.body.scrollTop = document.body.scrollHeight; }); }); spooky.then(function(){ this.scrollToBottom(); this.wait(1000); var newScrolleds = this.evaluate(function() { return window.scrollY; }); this.emit('logs',newScrolleds) var newScrolled = this.evaluate(function() { return window.document.body.scrollTop = document.body.scrollHeight; }); this.emit('logs',newScrolled) }); } twitter() } spooky.run(); }); spooky.on('logs', function (logs) { console.log(logs); }); } | cs |
몇가지 코드를 살펴보자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | //spookyJS URL 접속 spooky.start(url) //spookyJS 다음 행동 spooky.then(function(){ //스크롤을 맨아래로 이동 this.scrollToBottom(); // 1초 wait this.wait(1000); var newScrolleds = this.evaluate(function() { //현재 윈도우 y값 return window.scrollY; }); var newScrolled = this.evaluate(function() { //현재 윈도우 x값 return window.document.body.scrollTop = document.body.scrollHeight; }); // logs 값 전송 this.emit('logs',logs) // logs 값 get spooky.on('logs', function (logs) { console.log(logs); }); | cs |
해당 코드를 실행하게되면 검색어가 입력된 페이지를 접속한후 맨아래로 이동후 그 좌표 로그값을 받는 것이다
이런식으로 찍히게 된다 (정상작동)
본격적으로 데이터를 가져와보자
가져 오게 되면
| Userid = this.evaluate(function() { var elements = __utils__.findAll('#stream-items-id > li > div > div > div > a > span.username.js-action-profile-name'); return elements.map(function(e) { return e.innerText }); }); this.emit('dbinsert', Userid) | cs |
이런식으로 변수에 저장시켜주면된다
값까지 찾았으니 그후에는 db 에 입력시켜줍시다
this.emit 을 통해 node 으로 돌아와서
| spooky.on('dbinsert', function (data) { db.dummy.save(data, function(){ }); }); | cs |
디비로 전송시켜주면 끝
이제 이걸 내가원하는 시간마다 돌아가게 스케쥴링을 걸어주자
server.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | var scheduler = new Scheduler(1); scheduler.add(8000, function(done,res){ setTimeout(function() { for(var i = 0; i < config.schedule.hashtag.length; i++) { functions.scheduleinstagram(i) } }, 3000); setTimeout(function() { for(var i = 0; i < config.schedule.hashtag.length; i++) { functions.scheduletwitter(i) } }, 3000); done(); }); | cs |
자이제 결과를 살펴보자
인스타그램도 이와 유사하다 궁금하신 부분이있으면 댓글달아주세여