pal-crawl 1.6.1 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +389 -4
- package/dist/config.d.ts +2 -0
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/pal.d.ts +90 -27
- package/dist/pal.js +229 -172
- package/dist/pal.js.map +1 -1
- package/dist/pal.test.js +611 -171
- package/dist/pal.test.js.map +1 -1
- package/dist/parser.d.ts +40 -0
- package/dist/parser.js +210 -0
- package/dist/parser.js.map +1 -0
- package/package.json +3 -2
package/dist/pal.js
CHANGED
|
@@ -1,201 +1,172 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
35
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
6
|
exports.PalCrawl = void 0;
|
|
37
7
|
const url_1 = require("url");
|
|
38
|
-
const
|
|
8
|
+
const puppeteer_1 = __importDefault(require("puppeteer"));
|
|
39
9
|
const config_1 = require("./config");
|
|
40
10
|
const http_client_1 = require("./http-client");
|
|
11
|
+
const parser_1 = require("./parser");
|
|
41
12
|
class PalCrawl {
|
|
42
13
|
constructor(config) {
|
|
14
|
+
this.browser = null;
|
|
43
15
|
this.httpClient = new http_client_1.HttpClient({
|
|
44
16
|
userAgent: config?.userAgent ?? config_1.Config.UserAgent,
|
|
45
17
|
timeout: config?.timeout ?? 10000,
|
|
46
18
|
retryCount: config?.retryCount ?? 3,
|
|
47
19
|
customHeaders: config?.customHeaders ?? {},
|
|
48
20
|
});
|
|
21
|
+
this.parser = new parser_1.PalParser();
|
|
22
|
+
this.screenshotConfig = {
|
|
23
|
+
enabled: config?.screenshot?.enabled ?? false,
|
|
24
|
+
fullPage: config?.screenshot?.fullPage ?? true,
|
|
25
|
+
width: config?.screenshot?.width ?? 1920,
|
|
26
|
+
height: config?.screenshot?.height ?? 1080,
|
|
27
|
+
format: config?.screenshot?.format ?? 'png',
|
|
28
|
+
quality: config?.screenshot?.quality ?? 80,
|
|
29
|
+
};
|
|
49
30
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Initialize the Puppeteer browser instance.
|
|
33
|
+
* Call this before taking screenshots if not already initialized.
|
|
34
|
+
*/
|
|
35
|
+
async initBrowser() {
|
|
36
|
+
if (!this.browser) {
|
|
37
|
+
this.browser = await puppeteer_1.default.launch({
|
|
38
|
+
headless: true,
|
|
39
|
+
args: ['--no-sandbox', '--disable-setuid-sandbox'],
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Close the Puppeteer browser instance.
|
|
45
|
+
* Call this when done to free up resources.
|
|
46
|
+
*/
|
|
47
|
+
async closeBrowser() {
|
|
48
|
+
if (this.browser) {
|
|
49
|
+
await this.browser.close();
|
|
50
|
+
this.browser = null;
|
|
51
|
+
}
|
|
53
52
|
}
|
|
54
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Take a screenshot of a URL and return it as a Buffer.
|
|
55
|
+
* Initializes browser if not already done.
|
|
56
|
+
*/
|
|
57
|
+
async takeScreenshot(urlStr) {
|
|
58
|
+
if (!this.screenshotConfig.enabled) {
|
|
59
|
+
throw new Error('Screenshot feature is not enabled. Enable it in the config.');
|
|
60
|
+
}
|
|
61
|
+
await this.initBrowser();
|
|
62
|
+
if (!this.browser) {
|
|
63
|
+
throw new Error('Failed to initialize browser');
|
|
64
|
+
}
|
|
65
|
+
const page = await this.browser.newPage();
|
|
55
66
|
try {
|
|
56
|
-
|
|
57
|
-
|
|
67
|
+
await page.setViewport({
|
|
68
|
+
width: this.screenshotConfig.width ?? 1920,
|
|
69
|
+
height: this.screenshotConfig.height ?? 1080,
|
|
70
|
+
});
|
|
71
|
+
await page.goto(urlStr, { waitUntil: 'networkidle0', timeout: 30000 });
|
|
72
|
+
const screenshotBuffer = await page.screenshot({
|
|
73
|
+
fullPage: this.screenshotConfig.fullPage ?? true,
|
|
74
|
+
type: this.screenshotConfig.format,
|
|
75
|
+
quality: this.screenshotConfig.format === 'jpeg'
|
|
76
|
+
? (this.screenshotConfig.quality ?? 80)
|
|
77
|
+
: undefined,
|
|
78
|
+
});
|
|
79
|
+
return screenshotBuffer;
|
|
58
80
|
}
|
|
59
|
-
|
|
60
|
-
|
|
81
|
+
finally {
|
|
82
|
+
await page.close();
|
|
61
83
|
}
|
|
62
84
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
if (link) {
|
|
78
|
-
boardLink = config_1.Config.DOMAIN + link;
|
|
79
|
-
}
|
|
80
|
-
const pdfFile = $(el).find('td:nth-child(6) > a:nth-child(3)').attr('href') ?? null;
|
|
81
|
-
const hwpFile = $(el).find('td:nth-child(6) > a:nth-child(2)').attr('href') ?? null;
|
|
82
|
-
const attachments = {
|
|
83
|
-
pdfFile,
|
|
84
|
-
hwpFile,
|
|
85
|
-
};
|
|
86
|
-
const contentId = boardLink ? this.extractContentId(boardLink) : null;
|
|
87
|
-
output.push({
|
|
88
|
-
num,
|
|
89
|
-
subject,
|
|
90
|
-
proposerCategory,
|
|
91
|
-
committee,
|
|
92
|
-
numComments,
|
|
93
|
-
link: boardLink,
|
|
94
|
-
contentId,
|
|
95
|
-
attachments,
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
return output;
|
|
100
|
-
}
|
|
101
|
-
normalizeText(text) {
|
|
102
|
-
return text
|
|
103
|
-
.replace(/\u00a0/g, ' ')
|
|
104
|
-
.replace(/\r/g, '')
|
|
105
|
-
.split('\n')
|
|
106
|
-
.map((line) => line.replace(/\s+/g, ' ').trim())
|
|
107
|
-
.filter(Boolean)
|
|
108
|
-
.join('\n');
|
|
109
|
-
}
|
|
110
|
-
extractTableCellText($, cell) {
|
|
111
|
-
const clonedCell = cell.clone();
|
|
112
|
-
clonedCell.find('.m_subject, script, style').remove();
|
|
113
|
-
clonedCell.find('a.btn_sm').remove();
|
|
114
|
-
return this.normalizeText($(clonedCell).text());
|
|
115
|
-
}
|
|
116
|
-
parseBillInfoTable($) {
|
|
117
|
-
const table = $('.board-added table').first();
|
|
118
|
-
const row = table.find('tbody > tr').first();
|
|
119
|
-
if (!table.length || !row.length) {
|
|
120
|
-
return {
|
|
121
|
-
billNumber: null,
|
|
122
|
-
proposer: null,
|
|
123
|
-
proposalDate: null,
|
|
124
|
-
committee: null,
|
|
125
|
-
referralDate: null,
|
|
126
|
-
noticePeriod: null,
|
|
127
|
-
proposalSession: null,
|
|
128
|
-
};
|
|
85
|
+
/**
|
|
86
|
+
* Get a screenshot of the bill list page.
|
|
87
|
+
*/
|
|
88
|
+
async getPalScreenshot() {
|
|
89
|
+
const url = new url_1.URL(config_1.Config.LIST_URL, config_1.Config.DOMAIN);
|
|
90
|
+
return this.takeScreenshot(url.toString());
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get a screenshot of a specific bill content page.
|
|
94
|
+
*/
|
|
95
|
+
async getContentScreenshot(id) {
|
|
96
|
+
const normalizedId = id.trim();
|
|
97
|
+
if (!normalizedId) {
|
|
98
|
+
throw new Error('id is required');
|
|
129
99
|
}
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
100
|
+
const url = new url_1.URL(config_1.Config.CONTENT_URL, config_1.Config.DOMAIN);
|
|
101
|
+
url.searchParams.set('lgsltPaid', normalizedId);
|
|
102
|
+
url.searchParams.set('lgsltPaId', normalizedId);
|
|
103
|
+
return this.takeScreenshot(url.toString());
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get a screenshot of the done bills list page.
|
|
107
|
+
*/
|
|
108
|
+
async getDoneScreenshot() {
|
|
109
|
+
const url = new url_1.URL(config_1.Config.DONE_LIST_URL, config_1.Config.DOMAIN);
|
|
110
|
+
return this.takeScreenshot(url.toString());
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get a screenshot of a specific done bill content page.
|
|
114
|
+
*/
|
|
115
|
+
async getDoneContentScreenshot(id) {
|
|
116
|
+
const normalizedId = id.trim();
|
|
117
|
+
if (!normalizedId) {
|
|
118
|
+
throw new Error('id is required');
|
|
119
|
+
}
|
|
120
|
+
const url = new url_1.URL(config_1.Config.DONE_CONTENT_URL, config_1.Config.DOMAIN);
|
|
121
|
+
url.searchParams.set('lgsltPaid', normalizedId);
|
|
122
|
+
url.searchParams.set('lgsltPaId', normalizedId);
|
|
123
|
+
return this.takeScreenshot(url.toString());
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Update screenshot configuration.
|
|
127
|
+
*/
|
|
128
|
+
updateScreenshotConfig(config) {
|
|
129
|
+
this.screenshotConfig = {
|
|
130
|
+
...this.screenshotConfig,
|
|
131
|
+
...config,
|
|
153
132
|
};
|
|
154
133
|
}
|
|
155
|
-
|
|
156
|
-
const
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
134
|
+
buildListUrl(base, query) {
|
|
135
|
+
const url = new url_1.URL(base, config_1.Config.DOMAIN);
|
|
136
|
+
const entries = [
|
|
137
|
+
['pageIndex', query.pageIndex],
|
|
138
|
+
['pageUnit', query.pageUnit],
|
|
139
|
+
['committeeId', query.committeeId],
|
|
140
|
+
['billName', query.billName],
|
|
141
|
+
['represent', query.represent],
|
|
142
|
+
['proposers', query.proposers],
|
|
143
|
+
['ppslRsonMnCn', query.ppslRsonMnCn],
|
|
144
|
+
['sortCol', query.sortCol],
|
|
145
|
+
['sortGbn', query.sortGbn],
|
|
146
|
+
['fromAge', query.fromAge],
|
|
147
|
+
['toAge', query.toAge],
|
|
148
|
+
['billNo', query.billNo],
|
|
149
|
+
];
|
|
150
|
+
for (const [key, value] of entries) {
|
|
151
|
+
if (value !== undefined && value !== null && value !== '') {
|
|
152
|
+
url.searchParams.set(key, String(value));
|
|
168
153
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
: null;
|
|
182
|
-
const billInfo = this.parseBillInfoTable($);
|
|
183
|
-
return {
|
|
184
|
-
title,
|
|
185
|
-
proposalReason,
|
|
186
|
-
billNumber: billInfo.billNumber,
|
|
187
|
-
proposer: billInfo.proposer,
|
|
188
|
-
proposalDate: billInfo.proposalDate,
|
|
189
|
-
committee: billInfo.committee,
|
|
190
|
-
referralDate: billInfo.referralDate,
|
|
191
|
-
noticePeriod: billInfo.noticePeriod,
|
|
192
|
-
proposalSession: billInfo.proposalSession,
|
|
193
|
-
};
|
|
154
|
+
}
|
|
155
|
+
return url;
|
|
156
|
+
}
|
|
157
|
+
async getPalHTML() {
|
|
158
|
+
const url = new url_1.URL(config_1.Config.LIST_URL, config_1.Config.DOMAIN);
|
|
159
|
+
return this.httpClient.get(url);
|
|
160
|
+
}
|
|
161
|
+
parseTable(html) {
|
|
162
|
+
return this.parser.parseTable(html);
|
|
163
|
+
}
|
|
164
|
+
parseContent(html) {
|
|
165
|
+
return this.parser.parseContent(html);
|
|
194
166
|
}
|
|
195
167
|
async get() {
|
|
196
168
|
const html = await this.getPalHTML();
|
|
197
|
-
|
|
198
|
-
return table;
|
|
169
|
+
return this.parser.parseTable(html);
|
|
199
170
|
}
|
|
200
171
|
async getContentHTML(id) {
|
|
201
172
|
const normalizedId = id.trim();
|
|
@@ -210,7 +181,93 @@ class PalCrawl {
|
|
|
210
181
|
}
|
|
211
182
|
async getContent(id) {
|
|
212
183
|
const html = await this.getContentHTML(id);
|
|
213
|
-
return this.parseContent(html);
|
|
184
|
+
return this.parser.parseContent(html);
|
|
185
|
+
}
|
|
186
|
+
async getDoneHTML() {
|
|
187
|
+
const url = new url_1.URL(config_1.Config.DONE_LIST_URL, config_1.Config.DOMAIN);
|
|
188
|
+
return this.httpClient.get(url);
|
|
189
|
+
}
|
|
190
|
+
async getDone() {
|
|
191
|
+
const html = await this.getDoneHTML();
|
|
192
|
+
return this.parser.parseTable(html);
|
|
193
|
+
}
|
|
194
|
+
async getDoneContentHTML(id) {
|
|
195
|
+
const normalizedId = id.trim();
|
|
196
|
+
if (!normalizedId) {
|
|
197
|
+
throw new Error('id is required');
|
|
198
|
+
}
|
|
199
|
+
const url = new url_1.URL(config_1.Config.DONE_CONTENT_URL, config_1.Config.DOMAIN);
|
|
200
|
+
url.searchParams.set('lgsltPaid', normalizedId);
|
|
201
|
+
url.searchParams.set('lgsltPaId', normalizedId);
|
|
202
|
+
return this.httpClient.get(url);
|
|
203
|
+
}
|
|
204
|
+
async getDoneContent(id) {
|
|
205
|
+
const html = await this.getDoneContentHTML(id);
|
|
206
|
+
return this.parser.parseContent(html);
|
|
207
|
+
}
|
|
208
|
+
// ── Search / Filter ──────────────────────────────────────────────────────────
|
|
209
|
+
/** Fetch ongoing notices with optional filters and return parsed result with metadata. */
|
|
210
|
+
async search(query = {}) {
|
|
211
|
+
const url = this.buildListUrl(config_1.Config.LIST_URL, { pageIndex: 1, ...query });
|
|
212
|
+
const html = await this.httpClient.get(url);
|
|
213
|
+
return this.parser.parseSearchResult(html);
|
|
214
|
+
}
|
|
215
|
+
/** Fetch done notices with optional filters and return parsed result with metadata. */
|
|
216
|
+
async searchDone(query = {}) {
|
|
217
|
+
const url = this.buildListUrl(config_1.Config.DONE_LIST_URL, {
|
|
218
|
+
pageIndex: 1,
|
|
219
|
+
...query,
|
|
220
|
+
});
|
|
221
|
+
const html = await this.httpClient.get(url);
|
|
222
|
+
return this.parser.parseSearchResult(html);
|
|
223
|
+
}
|
|
224
|
+
// ── Explicit page access ─────────────────────────────────────────────────────
|
|
225
|
+
/** Fetch a specific page of ongoing notices. */
|
|
226
|
+
async getPage(pageIndex, pageUnit) {
|
|
227
|
+
const result = await this.search({ pageIndex, pageUnit });
|
|
228
|
+
return result.items;
|
|
229
|
+
}
|
|
230
|
+
/** Fetch a specific page of done notices. */
|
|
231
|
+
async getDonePage(pageIndex, pageUnit) {
|
|
232
|
+
const result = await this.searchDone({ pageIndex, pageUnit });
|
|
233
|
+
return result.items;
|
|
234
|
+
}
|
|
235
|
+
// ── Bulk / pagination helpers ────────────────────────────────────────────────
|
|
236
|
+
async *_getAllPagesImpl(searchFn, query, options) {
|
|
237
|
+
const delayMs = options.delayMs ?? 500;
|
|
238
|
+
const concurrency = Math.max(1, options.concurrency ?? 1);
|
|
239
|
+
const first = await searchFn({ ...query, pageIndex: 1 });
|
|
240
|
+
yield first;
|
|
241
|
+
if (first.totalPages <= 1 || first.items.length === 0)
|
|
242
|
+
return;
|
|
243
|
+
const maxPages = Math.min(first.totalPages, options.maxPages ?? first.totalPages);
|
|
244
|
+
for (let start = 2; start <= maxPages; start += concurrency) {
|
|
245
|
+
if (delayMs > 0) {
|
|
246
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
247
|
+
}
|
|
248
|
+
const end = Math.min(start + concurrency - 1, maxPages);
|
|
249
|
+
const pageNums = Array.from({ length: end - start + 1 }, (_, i) => start + i);
|
|
250
|
+
const results = await Promise.all(pageNums.map((p) => searchFn({ ...query, pageIndex: p })));
|
|
251
|
+
for (const result of results) {
|
|
252
|
+
yield result;
|
|
253
|
+
if (result.items.length === 0)
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Async generator that yields every page of ongoing notices.
|
|
260
|
+
* Respects `IBulkOptions` for rate-limiting and concurrency.
|
|
261
|
+
*/
|
|
262
|
+
getAllPages(query, options) {
|
|
263
|
+
return this._getAllPagesImpl((q) => this.search(q), query ?? {}, options ?? {});
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Async generator that yields every page of done notices.
|
|
267
|
+
* Respects `IBulkOptions` for rate-limiting and concurrency.
|
|
268
|
+
*/
|
|
269
|
+
getAllDonePages(query, options) {
|
|
270
|
+
return this._getAllPagesImpl((q) => this.searchDone(q), query ?? {}, options ?? {});
|
|
214
271
|
}
|
|
215
272
|
}
|
|
216
273
|
exports.PalCrawl = PalCrawl;
|
package/dist/pal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pal.js","sourceRoot":"","sources":["../src/pal.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pal.js","sourceRoot":"","sources":["../src/pal.ts"],"names":[],"mappings":"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"}
|