Showing
1 changed file
with
26 additions
and
16 deletions
... | @@ -14,9 +14,10 @@ exports.run = async (client, msg, args, prefix) => { | ... | @@ -14,9 +14,10 @@ exports.run = async (client, msg, args, prefix) => { |
14 | 14 | ||
15 | // 1. bestpen | 15 | // 1. bestpen |
16 | console.log("bestpen crawling"); | 16 | console.log("bestpen crawling"); |
17 | - await page .goto('http://www.bestpen.kr/index.html'); | 17 | + await page .goto('http://www.bestpen.kr'); |
18 | 18 | ||
19 | // 검색창으로 이동 & search 검색 | 19 | // 검색창으로 이동 & search 검색 |
20 | + await page.waitForSelector('#header > div.headerBtm > div > p.searchOpen > i'); | ||
20 | await page .click('#header > div.headerBtm > div > p.searchOpen > i'); | 21 | await page .click('#header > div.headerBtm > div > p.searchOpen > i'); |
21 | await page .type('#keyword', search); | 22 | await page .type('#keyword', search); |
22 | await page .keyboard.press( "Enter" ); | 23 | await page .keyboard.press( "Enter" ); |
... | @@ -33,9 +34,13 @@ exports.run = async (client, msg, args, prefix) => { | ... | @@ -33,9 +34,13 @@ exports.run = async (client, msg, args, prefix) => { |
33 | var link = await page.waitForSelector('#searchWrap > div > div.item-wrap > div:nth-child(2) > dl:nth-child('+i+') > dt > a'); | 34 | 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 | var bestpen_link = await page.evaluate( link => link.href, link ); |
35 | // console.log("베스트펜 검색 링크 : ", bestpen_link); | 36 | // console.log("베스트펜 검색 링크 : ", bestpen_link); |
37 | + | ||
38 | + // 링크 구조상 &search 뒷부분은 제품 링크를 띄우는데 영향을 미치지 않음 | ||
39 | + // -> 글자수 제한(1024)도 있으므로 제거 | ||
40 | + bestpen_link = bestpen_link.slice(0, bestpen_link.indexOf('&search')) | ||
36 | 41 | ||
37 | try { | 42 | 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' ); | 43 | + 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 ); | 44 | var bestpen_data = await page.evaluate( price => price.textContent, price ); |
40 | // console.log("베스트펜 검색 결과 가격 : ", bestpen_data); | 45 | // console.log("베스트펜 검색 결과 가격 : ", bestpen_data); |
41 | } catch { | 46 | } catch { |
... | @@ -47,11 +52,7 @@ exports.run = async (client, msg, args, prefix) => { | ... | @@ -47,11 +52,7 @@ exports.run = async (client, msg, args, prefix) => { |
47 | } catch { | 52 | } catch { |
48 | if (i == 1) { | 53 | if (i == 1) { |
49 | // 제품 정보가 아예 없을 경우 "검색결과 없음"으로 표시 | 54 | // 제품 정보가 아예 없을 경우 "검색결과 없음"으로 표시 |
50 | - bestpen_title = "검색결과 없음"; | 55 | + bestpen += "검색결과 없음" + '\n' |
51 | - bestpen_link = ""; | ||
52 | - bestpen_data = ""; | ||
53 | - | ||
54 | - bestpen += `[${bestpen_title}](${bestpen_link}) - ${bestpen_data}` + '\n' | ||
55 | break; | 56 | break; |
56 | } else { | 57 | } else { |
57 | // 제품 개수가 4개 이하인 경우 | 58 | // 제품 개수가 4개 이하인 경우 |
... | @@ -62,9 +63,10 @@ exports.run = async (client, msg, args, prefix) => { | ... | @@ -62,9 +63,10 @@ exports.run = async (client, msg, args, prefix) => { |
62 | 63 | ||
63 | // 2. 펜카페 | 64 | // 2. 펜카페 |
64 | console.log("pencafe crawling"); | 65 | console.log("pencafe crawling"); |
65 | - await page .goto('http://www.pencafe.co.kr/'); | 66 | + await page .goto('http://www.pencafe.co.kr'); |
66 | 67 | ||
67 | // search 검색 | 68 | // search 검색 |
69 | + await page.waitForSelector('#header > div.hd_mib > div.hd_sch.f_left > form > fieldset > input'); | ||
68 | await page .type('#header > div.hd_mib > div.hd_sch.f_left > form > fieldset > input', search); | 70 | await page .type('#header > div.hd_mib > div.hd_sch.f_left > form > fieldset > input', search); |
69 | await page .keyboard.press( "Enter" ); | 71 | await page .keyboard.press( "Enter" ); |
70 | // await page.screenshot({ path : "screenshot.png" }); | 72 | // await page.screenshot({ path : "screenshot.png" }); |
... | @@ -76,13 +78,22 @@ exports.run = async (client, msg, args, prefix) => { | ... | @@ -76,13 +78,22 @@ exports.run = async (client, msg, args, prefix) => { |
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'); | 78 | var title = await page.waitForSelector('#searchWrap > div > div.item-wrap > div:nth-child(2) > dl:nth-child('+i+') > dd > ul > li.prd-name > a'); |
77 | var pencafe_title = await page.evaluate( title => title.textContent, title ); | 79 | var pencafe_title = await page.evaluate( title => title.textContent, title ); |
78 | // console.log("펜카페 검색 결과 제품명 : ", pencafe_title); | 80 | // console.log("펜카페 검색 결과 제품명 : ", pencafe_title); |
81 | + | ||
82 | + // 펜카페 구조상 제품명 앞에 할인률(ex. 17%)이 붙는 경우가 많음 -> 제거 | ||
83 | + if (pencafe_title.indexOf('(') != -1) { pencafe_title = pencafe_title.slice(pencafe_title.indexOf('%')+1) } | ||
84 | + // 펜카페 구조상 제품명 뒤에 사족(ex. (색상선택/금장~~~))이 붙는 경우가 많음 -> 제거 | ||
85 | + if (pencafe_title.indexOf('(') != -1) { pencafe_title = pencafe_title.slice(0, pencafe_title.lastIndexOf('(')) } | ||
79 | 86 | ||
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'); | 87 | 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 ); | 88 | var pencafe_link = await page.evaluate( link => link.href, link ); |
82 | // console.log("펜카페 검색 링크 : ", pencafe_link); | 89 | // console.log("펜카페 검색 링크 : ", pencafe_link); |
90 | + | ||
91 | + // 링크 구조상 &search 뒷부분은 제품 링크를 띄우는데 영향을 미치지 않음 | ||
92 | + // -> 글자수 제한(1024)도 있으므로 제거 | ||
93 | + pencafe_link = pencafe_link.slice(0, pencafe_link.indexOf('&search')) | ||
83 | 94 | ||
84 | try { | 95 | 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' ); | 96 | + 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 ); | 97 | var pencafe_data = await page.evaluate( price => price.textContent, price ); |
87 | // console.log("펜카페 검색 결과 가격 : ", pencafe_data); | 98 | // console.log("펜카페 검색 결과 가격 : ", pencafe_data); |
88 | } catch { | 99 | } catch { |
... | @@ -94,11 +105,7 @@ exports.run = async (client, msg, args, prefix) => { | ... | @@ -94,11 +105,7 @@ exports.run = async (client, msg, args, prefix) => { |
94 | } catch { | 105 | } catch { |
95 | if (i == 1) { | 106 | if (i == 1) { |
96 | // 제품 정보가 아예 없을 경우 "검색결과 없음"으로 표시 | 107 | // 제품 정보가 아예 없을 경우 "검색결과 없음"으로 표시 |
97 | - pencafe_title = "검색결과 없음"; | 108 | + pencafe += "검색결과 없음" + '\n' |
98 | - pencafe_link = ""; | ||
99 | - pencafe_data = ""; | ||
100 | - | ||
101 | - pencafe += `[${pencafe_title}](${pencafe_link}) - ${pencafe_data}` + '\n' | ||
102 | break; | 109 | break; |
103 | } else { | 110 | } else { |
104 | // 제품 개수가 4개 이하인 경우 | 111 | // 제품 개수가 4개 이하인 경우 |
... | @@ -116,11 +123,14 @@ exports.run = async (client, msg, args, prefix) => { | ... | @@ -116,11 +123,14 @@ exports.run = async (client, msg, args, prefix) => { |
116 | .setTitle(`${search}에 대한 검색 결과`) | 123 | .setTitle(`${search}에 대한 검색 결과`) |
117 | .setColor("E5D49A") | 124 | .setColor("E5D49A") |
118 | // 베스트펜 검색 결과 (ex. 제품명(링크) - 금액) | 125 | // 베스트펜 검색 결과 (ex. 제품명(링크) - 금액) |
119 | - .addField('베스트펜', `${bestpen}`) | 126 | + .addField('베스트펜', `${bestpen.slice(0, 1023)}`) |
120 | // 펜카페 검색 결과 | 127 | // 펜카페 검색 결과 |
121 | - .addField('펜카페', `${pencafe}`) | 128 | + .addField('펜카페', `${pencafe.slice(0, 1023)}`) |
122 | msg.reply({ embeds: [Commands] }); | 129 | msg.reply({ embeds: [Commands] }); |
123 | }); | 130 | }); |
131 | + | ||
132 | + // 검색 대기 시간이 길어질 수 있으므로 사용자에게 진행상황을 알려줄 필요가 있다 | ||
133 | + msg.reply("검색중 ..."); | ||
124 | } else { | 134 | } else { |
125 | msg.reply("검색어가 없습니다. 검색어를 추가해서 다시 입력해주세요."); | 135 | msg.reply("검색어가 없습니다. 검색어를 추가해서 다시 입력해주세요."); |
126 | } | 136 | } | ... | ... |
-
Please register or login to post a comment