-
글쓴이글
-
2021년 7월 27일 19:03 #12207
이영호참가자안녕하세요. 죄송하지만 한가지만 더 질문 드리겠습니다..
node js가 자바스크립트다 보니, 이게 다른 언어와는 (c java python)과는 다르게 비동기적으로 작동을 하는거 같더라구요.
그래서 문제도 확인했고, promise나 async await를 사용하면 된다고 까지 파악했습니다.
문제가 되는건 웹사이트에서 코인과 관련된 정보를 크롤링 한 후에(이것이 콜백 함수에서 이루어집니다) 그것을 외부 변수에다 저장하려고 했는데 원리랑 개념은 알겠는데, 이게 크롤러가 내부에 콜백함수로 선언되어 있어서 어디부분을 동기화를 시켜주어야 되는지 정확하게 파악이 안되서 혹시나 하는 마음에 질문드립니다.
크롤러는 "crawler": "^1.3.0", 을 사용했고, 호출한 함수는
async function get_fleta_formulator()
{
var Crawler = require("crawler");
const newsList = [];
const newsList2 = [];
const newsList3 = [];
var c = new Crawler({
maxConnections : 10,
// This will be called for each crawled page
callback : function (error, res, done) { //문제의 콜백함수
if(error){
console.log(error);
}else{
var $ = res.$;
// $ is Cheerio by default
//a lean implementation of core jQuery designed specifically for the server
console.log($("title").text());
const $bodyList = $("#formulatorList li ").children(".split_box ").children(".split.f_table_row2.no_padding");
const $bodyList2 = $("#formulatorList li ").children(".split_box ").children(".split.f_table_row1.no_padding");
const $bodyList3 = $("#formulatorList li ").children(".split_box ").children(".split.f_table_row3.no_padding");
//내부 함수에서 저장 시작, 인자로 넘겨주지 않아도 문제가 없는건 위에서 선언한 let을 알고있는것 같습니다. 인자로 넘겨주 어도 결과에는 변화는 없네요..
$bodyList.each(function(i, elem) {
newsList[i] = $(this).text();
});
$bodyList2.each(function(i, elem) {
newsList2[i] = $(this).text();
});
$bodyList3.each(function(i, elem) {
newsList2[i] = $(this).find('span').text();
});
}
done();
}
});c.queue('https://fportal.fleta.io/');
return([newsList,newsList2,newsList3]); // 이렇게 밖으로 빼서 밖에서 해당 값들을 사용하려고 했는데, 데이터들이 날라가서 출력하면 [ [], [], [] ] 으로 나오게 됩니다}
입니다 여기에서
콜백함수에서 외부에서 사용하려고(클라이언트 응답이 들어오면 뿌려주려고) 변수를 뺄려고 했는데,
콜백 함수가 끝나는 뒤로 newlist를 호출하면 해당 저장된 값들이 전부 날아가게 됩니다.
c나 java같은건 그냥 인자 받아서 다시 뱉어만 내주면 구현이 가능한데 이건 정말 모르겠네요....
혹시라도 답변 받을수 있을까 싶어서 질문합니다. 너무 질문내용이 길고 그래서 좀 그러시면 힌트만 던져주셔도 확인후에 맞게 고쳐보겠습니다.
감사합니다.
2021년 7월 27일 20:43 #12214
이영호참가자지금 보니 var c = new Crawler({ 부분이 따로 스레드인지..어떤것이든 방법으로 따로 돌아가는 것 처럼 보이는데요
그래서 저 크롤링 후 -> 밑에 작업 실행 생각했던게
밑에 작업속도가 빨라서
밑에 작업 실행 -> 크롤링 의 순서를 반복하고 있고, 그래도 두세번 똑같이 반복되면 데이터가 담길법도 한데, 담기지가 않네요.
제가 생각했던 방식은 set interval( 크롤링 함수 실행 -> 크롤링 함수안에서 데이터 값 변수에다 저장후 리턴) )
이후에 client 요청이 들어오면 해당 값 전해주기 로 생각했었는데저 크롤러 방식으로 이게 어려운거면 다른 사이트에 request를 이용한 크롤링도 있더라구요, 이런걸 알아보는게 좋을까요?
너무 질문이 지저분하네요..죄송합니다 저걸 잘 쓰고 싶은데 어렵네요
-
글쓴이글
- 답변은 로그인 후 가능합니다.