String15

Update crawling method to search 1->n

...@@ -2,8 +2,8 @@ const Discord = require("discord.js"); ...@@ -2,8 +2,8 @@ const Discord = require("discord.js");
2 exports.run = async (client, msg, args, prefix) => { 2 exports.run = async (client, msg, args, prefix) => {
3 if (args[0]) { // 명령어 뒤에 입력값이 있을 경우 (ex. !<명령어> <채팅>) 3 if (args[0]) { // 명령어 뒤에 입력값이 있을 경우 (ex. !<명령어> <채팅>)
4 // 검색어 한 문장으로 합치기 4 // 검색어 한 문장으로 합치기
5 - const search = args.join(' ') 5 + const search = args.join(' ');
6 - // console.log(search) 6 + // console.log(search);
7 7
8 // 각 사이트별 제품 검색 8 // 각 사이트별 제품 검색
9 const puppeteer = require('puppeteer'); //include Puppeteer Library 9 const puppeteer = require('puppeteer'); //include Puppeteer Library
...@@ -13,70 +13,98 @@ exports.run = async (client, msg, args, prefix) => { ...@@ -13,70 +13,98 @@ exports.run = async (client, msg, args, prefix) => {
13 console.log('Open Browser'); 13 console.log('Open Browser');
14 14
15 // 1. bestpen 15 // 1. bestpen
16 - await page .goto('http://www.bestpen.kr/html/mainm.html'); 16 + console.log("bestpen crawling");
17 + await page .goto('http://www.bestpen.kr/index.html');
17 18
18 // 검색창으로 이동 & search 검색 19 // 검색창으로 이동 & search 검색
19 - await page .click('#header > div.headerBtm > div > p.searchOpen > i') 20 + await page .click('#header > div.headerBtm > div > p.searchOpen > i');
20 - await page .type('#keyword', search) 21 + await page .type('#keyword', search);
21 await page .keyboard.press( "Enter" ); 22 await page .keyboard.press( "Enter" );
22 - // await page.screenshot({ path : "screenshot.png" }) 23 + // await page.screenshot({ path : "screenshot.png" });
23 24
24 - // 검색 결과 가져오기 25 + // 검색 결과 가져오기 (최대 4개)
25 - try { 26 + var bestpen = '';
26 - var title = await page.waitForSelector('#searchWrap > div > div.item-wrap > div:nth-child(2) > dl:nth-child(1) > dd > ul > li.prd-name > a'); 27 + for (var i = 1; i <= 4; i++) {
27 - var bestpen_title = await page.evaluate( title => title.textContent, title );
28 - // console.log("베스트펜 검색 결과 제품명 : ", bestpen_title);
29 -
30 - var link = await page.waitForSelector('#searchWrap > div > div.item-wrap > div:nth-child(2) > dl:nth-child(1) > dt > a');
31 - var bestpen_link = await page.evaluate( link => link.href, link );
32 - // console.log("베스트펜 검색 링크 : ", bestpen_link);
33 -
34 try { 28 try {
35 - var price = await page.waitForSelector( "#searchWrap > div > div.item-wrap > div:nth-child(2) > dl:nth-child(1) > dd > ul > li.prd-price > p:nth-child(2) > span.price" ); 29 + var title = await page.waitForSelector('#searchWrap > div > div.item-wrap > div:nth-child(2) > dl:nth-child('+i+') > dd > ul > li.prd-name > a');
36 - var bestpen_data = await page.evaluate( price => price.textContent, price ); 30 + var bestpen_title = await page.evaluate( title => title.textContent, title );
37 - // console.log("베스트펜 검색 결과 가격 : ", bestpen_data); 31 + // console.log("베스트펜 검색 결과 제품명 : ", bestpen_title);
32 +
33 + var link = await page.waitForSelector('#searchWrap > div > div.item-wrap > div:nth-child(2) > dl:nth-child('+i+') > dt > a');
34 + var bestpen_link = await page.evaluate( link => link.href, link );
35 + // console.log("베스트펜 검색 링크 : ", bestpen_link);
36 +
37 + try {
38 + var price = await page.waitForSelector( '#searchWrap > div > div.item-wrap > div:nth-child(2) > dl:nth-child('+i+') > dd > ul > li.prd-price > p:nth-child(2) > span.price' );
39 + var bestpen_data = await page.evaluate( price => price.textContent, price );
40 + // console.log("베스트펜 검색 결과 가격 : ", bestpen_data);
41 + } catch {
42 + // 품절이라서 금액정보가 없을 경우 "SOLD OUT"으로 표시
43 + bestpen_data = "SOLD OUT";
44 + }
45 +
46 + bestpen += `[${bestpen_title}](${bestpen_link}) - ${bestpen_data}` + '\n'
38 } catch { 47 } catch {
39 - // 품절이라서 금액정보가 없을 경우 "SOLD OUT"으로 표시 48 + if (i == 1) {
40 - bestpen_data = "SOLD OUT" 49 + // 제품 정보가 아예 없을 경우 "검색결과 없음"으로 표시
50 + bestpen_title = "검색결과 없음";
51 + bestpen_link = "";
52 + bestpen_data = "";
53 +
54 + bestpen += `[${bestpen_title}](${bestpen_link}) - ${bestpen_data}` + '\n'
55 + break;
56 + } else {
57 + // 제품 개수가 4개 이하인 경우
58 + break;
59 + }
41 } 60 }
42 - } catch {
43 - // 제품 정보가 아예 없을 경우 "검색결과 없음"으로 표시
44 - bestpen_title = "검색결과 없음"
45 - bestpen_link = ""
46 - bestpen_data = ""
47 } 61 }
48 62
49 // 2. 펜카페 63 // 2. 펜카페
64 + console.log("pencafe crawling");
50 await page .goto('http://www.pencafe.co.kr/'); 65 await page .goto('http://www.pencafe.co.kr/');
51 66
52 // search 검색 67 // search 검색
53 - await page .type('#header > div.hd_mib > div.hd_sch.f_left > form > fieldset > input', search) 68 + await page .type('#header > div.hd_mib > div.hd_sch.f_left > form > fieldset > input', search);
54 await page .keyboard.press( "Enter" ); 69 await page .keyboard.press( "Enter" );
55 - // await page.screenshot({ path : "screenshot.png" }) 70 + // await page.screenshot({ path : "screenshot.png" });
56 71
57 - // 검색 결과 가져오기 72 + // 검색 결과 가져오기 (최대 4개)
58 - try { 73 + var pencafe = '';
59 - var title = await page.waitForSelector('#searchWrap > div > div.item-wrap > div:nth-child(2) > dl:nth-child(1) > dd > ul > li.prd-name > a'); 74 + for (var i = 1; i <= 4; i++) {
60 - var pencafe_title = await page.evaluate( title => title.textContent, title );
61 - console.log("펜카페 검색 결과 제품명 : ", pencafe_title);
62 -
63 - var link = await page.waitForSelector('#searchWrap > div > div.item-wrap > div:nth-child(2) > dl:nth-child(1) > dd > ul > li.prd-name > a');
64 - var pencafe_link = await page.evaluate( link => link.href, link );
65 - console.log("펜카페 검색 링크 : ", pencafe_link);
66 -
67 try { 75 try {
68 - var price = await page.waitForSelector( "#searchWrap > div > div.item-wrap > div:nth-child(2) > dl:nth-child(1) > dd > ul > li.prd-price > span" ); 76 + var title = await page.waitForSelector('#searchWrap > div > div.item-wrap > div:nth-child(2) > dl:nth-child('+i+') > dd > ul > li.prd-name > a');
69 - var pencafe_data = await page.evaluate( price => price.textContent, price ); 77 + var pencafe_title = await page.evaluate( title => title.textContent, title );
70 - console.log("펜카페 검색 결과 가격 : ", pencafe_data); 78 + // console.log("펜카페 검색 결과 제품명 : ", pencafe_title);
79 +
80 + var link = await page.waitForSelector('#searchWrap > div > div.item-wrap > div:nth-child(2) > dl:nth-child('+i+') > dd > ul > li.prd-name > a');
81 + var pencafe_link = await page.evaluate( link => link.href, link );
82 + // console.log("펜카페 검색 링크 : ", pencafe_link);
83 +
84 + try {
85 + var price = await page.waitForSelector( '#searchWrap > div > div.item-wrap > div:nth-child(2) > dl:nth-child('+i+') > dd > ul > li.prd-price > span' );
86 + var pencafe_data = await page.evaluate( price => price.textContent, price );
87 + // console.log("펜카페 검색 결과 가격 : ", pencafe_data);
88 + } catch {
89 + // 품절이라서 금액정보가 없을 경우 "SOLD OUT"으로 표시
90 + pencafe_data = "SOLD OUT";
91 + }
92 +
93 + pencafe += `[${pencafe_title}](${pencafe_link}) - ${pencafe_data}` + '\n'
71 } catch { 94 } catch {
72 - // 품절이라서 금액정보가 없을 경우 "SOLD OUT"으로 표시 95 + if (i == 1) {
73 - pencafe_data = "SOLD OUT" 96 + // 제품 정보가 아예 없을 경우 "검색결과 없음"으로 표시
97 + pencafe_title = "검색결과 없음";
98 + pencafe_link = "";
99 + pencafe_data = "";
100 +
101 + pencafe += `[${pencafe_title}](${pencafe_link}) - ${pencafe_data}` + '\n'
102 + break;
103 + } else {
104 + // 제품 개수가 4개 이하인 경우
105 + break;
106 + }
74 } 107 }
75 - } catch {
76 - // 제품 정보가 아예 없을 경우 "검색결과 없음"으로 표시
77 - pencafe_title = "검색결과 없음"
78 - pencafe_link = ""
79 - pencafe_data = ""
80 } 108 }
81 109
82 // 브라우저 닫기 110 // 브라우저 닫기
...@@ -88,9 +116,9 @@ exports.run = async (client, msg, args, prefix) => { ...@@ -88,9 +116,9 @@ exports.run = async (client, msg, args, prefix) => {
88 .setTitle(`${search}에 대한 검색 결과`) 116 .setTitle(`${search}에 대한 검색 결과`)
89 .setColor("E5D49A") 117 .setColor("E5D49A")
90 // 베스트펜 검색 결과 (ex. 제품명(링크) - 금액) 118 // 베스트펜 검색 결과 (ex. 제품명(링크) - 금액)
91 - .addField('베스트펜', `[${bestpen_title}](${bestpen_link}) - ${bestpen_data}`) 119 + .addField('베스트펜', `${bestpen}`)
92 // 펜카페 검색 결과 120 // 펜카페 검색 결과
93 - .addField('펜카페', `[${pencafe_title}](${pencafe_link}) - ${pencafe_data}`) 121 + .addField('펜카페', `${pencafe}`)
94 msg.reply({ embeds: [Commands] }); 122 msg.reply({ embeds: [Commands] });
95 }); 123 });
96 } else { 124 } else {
......