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개)
26 + var bestpen = '';
27 + for (var i = 1; i <= 4; i++) {
25 try { 28 try {
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'); 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');
27 var bestpen_title = await page.evaluate( title => title.textContent, title ); 30 var bestpen_title = await page.evaluate( title => title.textContent, title );
28 // console.log("베스트펜 검색 결과 제품명 : ", bestpen_title); 31 // console.log("베스트펜 검색 결과 제품명 : ", bestpen_title);
29 32
30 - var link = await page.waitForSelector('#searchWrap > div > div.item-wrap > div:nth-child(2) > dl:nth-child(1) > dt > a'); 33 + var link = await page.waitForSelector('#searchWrap > div > div.item-wrap > div:nth-child(2) > dl:nth-child('+i+') > dt > a');
31 var bestpen_link = await page.evaluate( link => link.href, link ); 34 var bestpen_link = await page.evaluate( link => link.href, link );
32 // console.log("베스트펜 검색 링크 : ", bestpen_link); 35 // console.log("베스트펜 검색 링크 : ", bestpen_link);
33 36
34 try { 37 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" ); 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' );
36 var bestpen_data = await page.evaluate( price => price.textContent, price ); 39 var bestpen_data = await page.evaluate( price => price.textContent, price );
37 // console.log("베스트펜 검색 결과 가격 : ", bestpen_data); 40 // console.log("베스트펜 검색 결과 가격 : ", bestpen_data);
38 } catch { 41 } catch {
39 // 품절이라서 금액정보가 없을 경우 "SOLD OUT"으로 표시 42 // 품절이라서 금액정보가 없을 경우 "SOLD OUT"으로 표시
40 - bestpen_data = "SOLD OUT" 43 + bestpen_data = "SOLD OUT";
41 } 44 }
45 +
46 + bestpen += `[${bestpen_title}](${bestpen_link}) - ${bestpen_data}` + '\n'
42 } catch { 47 } catch {
48 + if (i == 1) {
43 // 제품 정보가 아예 없을 경우 "검색결과 없음"으로 표시 49 // 제품 정보가 아예 없을 경우 "검색결과 없음"으로 표시
44 - bestpen_title = "검색결과 없음" 50 + bestpen_title = "검색결과 없음";
45 - bestpen_link = "" 51 + bestpen_link = "";
46 - bestpen_data = "" 52 + bestpen_data = "";
53 +
54 + bestpen += `[${bestpen_title}](${bestpen_link}) - ${bestpen_data}` + '\n'
55 + break;
56 + } else {
57 + // 제품 개수가 4개 이하인 경우
58 + break;
59 + }
60 + }
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개)
73 + var pencafe = '';
74 + for (var i = 1; i <= 4; i++) {
58 try { 75 try {
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'); 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');
60 var pencafe_title = await page.evaluate( title => title.textContent, title ); 77 var pencafe_title = await page.evaluate( title => title.textContent, title );
61 - console.log("펜카페 검색 결과 제품명 : ", pencafe_title); 78 + // console.log("펜카페 검색 결과 제품명 : ", pencafe_title);
62 79
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'); 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');
64 var pencafe_link = await page.evaluate( link => link.href, link ); 81 var pencafe_link = await page.evaluate( link => link.href, link );
65 - console.log("펜카페 검색 링크 : ", pencafe_link); 82 + // console.log("펜카페 검색 링크 : ", pencafe_link);
66 83
67 try { 84 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" ); 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' );
69 var pencafe_data = await page.evaluate( price => price.textContent, price ); 86 var pencafe_data = await page.evaluate( price => price.textContent, price );
70 - console.log("펜카페 검색 결과 가격 : ", pencafe_data); 87 + // console.log("펜카페 검색 결과 가격 : ", pencafe_data);
71 } catch { 88 } catch {
72 // 품절이라서 금액정보가 없을 경우 "SOLD OUT"으로 표시 89 // 품절이라서 금액정보가 없을 경우 "SOLD OUT"으로 표시
73 - pencafe_data = "SOLD OUT" 90 + pencafe_data = "SOLD OUT";
74 } 91 }
92 +
93 + pencafe += `[${pencafe_title}](${pencafe_link}) - ${pencafe_data}` + '\n'
75 } catch { 94 } catch {
95 + if (i == 1) {
76 // 제품 정보가 아예 없을 경우 "검색결과 없음"으로 표시 96 // 제품 정보가 아예 없을 경우 "검색결과 없음"으로 표시
77 - pencafe_title = "검색결과 없음" 97 + pencafe_title = "검색결과 없음";
78 - pencafe_link = "" 98 + pencafe_link = "";
79 - pencafe_data = "" 99 + pencafe_data = "";
100 +
101 + pencafe += `[${pencafe_title}](${pencafe_link}) - ${pencafe_data}` + '\n'
102 + break;
103 + } else {
104 + // 제품 개수가 4개 이하인 경우
105 + break;
106 + }
107 + }
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 {
......