openplanter 0.3.0 → 0.3.1
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenders-gov-au-scraper.d.ts","sourceRoot":"","sources":["../../src/investigation-tools/tenders-gov-au-scraper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"tenders-gov-au-scraper.d.ts","sourceRoot":"","sources":["../../src/investigation-tools/tenders-gov-au-scraper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAuCH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAYD,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,YAAY,CAAC,CAwDxB;AAmJD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAsDtD"}
|
|
@@ -11,100 +11,72 @@
|
|
|
11
11
|
* Users are solely responsible for ensuring compliance with all applicable
|
|
12
12
|
* laws, regulations, and website terms before using this tool.
|
|
13
13
|
*/
|
|
14
|
-
import { fetchHtml, isoNow, } from "./shared.js";
|
|
14
|
+
import { fetchHtml, isoNow, normalizeCompany, } from "./shared.js";
|
|
15
15
|
// ── Constants ────────────────────────────────────────────────────
|
|
16
|
-
const AUSTENDER_SEARCH_URL = "https://www.tenders.gov.au/Search/AwardedSearch";
|
|
17
|
-
const AUSTENDER_SEARCH_POST_URL = "https://www.tenders.gov.au/Search/AwardedList";
|
|
18
16
|
const AUSTENDER_BASE = "https://www.tenders.gov.au";
|
|
17
|
+
const AUSTENDER_CN_ADVANCED_URL = `${AUSTENDER_BASE}/Search/CnAdvancedSearch`;
|
|
19
18
|
const DEFAULT_DELAY = 1.5;
|
|
19
|
+
const RESULTS_PER_PAGE = 15;
|
|
20
|
+
const MAX_PAGES = 60;
|
|
21
|
+
const MAX_DAY_SPAN = 365;
|
|
22
|
+
const MONTHS = [
|
|
23
|
+
"Jan",
|
|
24
|
+
"Feb",
|
|
25
|
+
"Mar",
|
|
26
|
+
"Apr",
|
|
27
|
+
"May",
|
|
28
|
+
"Jun",
|
|
29
|
+
"Jul",
|
|
30
|
+
"Aug",
|
|
31
|
+
"Sep",
|
|
32
|
+
"Oct",
|
|
33
|
+
"Nov",
|
|
34
|
+
"Dec",
|
|
35
|
+
];
|
|
20
36
|
// ── Helpers ──────────────────────────────────────────────────────
|
|
21
37
|
function parseAuDollar(text) {
|
|
22
38
|
const cleaned = text.replace(/[^0-9.,]/g, "").replace(/,/g, "");
|
|
23
39
|
const num = parseFloat(cleaned);
|
|
24
40
|
return isNaN(num) ? null : num;
|
|
25
41
|
}
|
|
26
|
-
function formatDateForSearch(daysBack) {
|
|
27
|
-
const d = new Date();
|
|
28
|
-
d.setDate(d.getDate() - daysBack);
|
|
29
|
-
const dd = String(d.getDate()).padStart(2, "0");
|
|
30
|
-
const mm = String(d.getMonth() + 1).padStart(2, "0");
|
|
31
|
-
const yyyy = d.getFullYear();
|
|
32
|
-
return `${dd}/${mm}/${yyyy}`;
|
|
33
|
-
}
|
|
34
42
|
// ── Scraper ──────────────────────────────────────────────────────
|
|
35
43
|
export async function scrapeTenders(opts) {
|
|
36
|
-
const query = opts.query;
|
|
37
|
-
const days = opts.days ?? 30;
|
|
44
|
+
const query = opts.query?.trim() ?? "";
|
|
45
|
+
const days = sanitizeDays(opts.days ?? 30);
|
|
38
46
|
const state = opts.state ?? "AU";
|
|
39
|
-
const
|
|
47
|
+
const collected = new Map();
|
|
40
48
|
try {
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const dateStr = cells.length >= 6 ? cells.eq(4).text().trim() : "";
|
|
55
|
-
const agency = cells.length >= 7 ? cells.eq(5).text().trim() : "";
|
|
56
|
-
const category = cells.length >= 8 ? cells.eq(6).text().trim() : "";
|
|
57
|
-
const link = cells.eq(0).find("a").first();
|
|
58
|
-
const href = link.attr("href") ?? "";
|
|
59
|
-
const url = href.startsWith("http")
|
|
60
|
-
? href
|
|
61
|
-
: `${AUSTENDER_BASE}${href}`;
|
|
62
|
-
if (tender_id || description) {
|
|
63
|
-
awards.push({
|
|
64
|
-
company: company || query,
|
|
65
|
-
tender_id,
|
|
66
|
-
value: parseAuDollar(valueRaw),
|
|
67
|
-
value_raw: valueRaw,
|
|
68
|
-
award_date: dateStr,
|
|
69
|
-
description,
|
|
70
|
-
agency,
|
|
71
|
-
category,
|
|
72
|
-
url,
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
// Also try alternative page structures (card-based layouts)
|
|
77
|
-
if (awards.length === 0) {
|
|
78
|
-
$(".card, .tender-result, .search-result-item").each((_i, el) => {
|
|
79
|
-
const title = $(el).find("h3, h4, .title, .heading").first().text().trim();
|
|
80
|
-
const id = $(el).find(".cn-number, .tender-id, .id").first().text().trim();
|
|
81
|
-
const valueRaw = $(el).find(".value, .amount, .contract-value").first().text().trim();
|
|
82
|
-
const dateStr = $(el).find(".date, .award-date").first().text().trim();
|
|
83
|
-
const agencyText = $(el).find(".agency, .department").first().text().trim();
|
|
84
|
-
const link = $(el).find("a").first();
|
|
85
|
-
const href = link.attr("href") ?? "";
|
|
86
|
-
const url = href.startsWith("http")
|
|
87
|
-
? href
|
|
88
|
-
: `${AUSTENDER_BASE}${href}`;
|
|
89
|
-
if (title || id) {
|
|
90
|
-
awards.push({
|
|
91
|
-
company: query,
|
|
92
|
-
tender_id: id,
|
|
93
|
-
value: parseAuDollar(valueRaw),
|
|
94
|
-
value_raw: valueRaw,
|
|
95
|
-
award_date: dateStr,
|
|
96
|
-
description: title,
|
|
97
|
-
agency: agencyText,
|
|
98
|
-
category: "",
|
|
99
|
-
url,
|
|
100
|
-
});
|
|
49
|
+
const { start, end } = computeDateRange(days);
|
|
50
|
+
const baseParams = buildSearchParams({ query, start, end });
|
|
51
|
+
let totalPages = 1;
|
|
52
|
+
for (let page = 1; page <= totalPages && page <= MAX_PAGES; page += 1) {
|
|
53
|
+
const pageParams = new URLSearchParams(baseParams);
|
|
54
|
+
if (page > 1)
|
|
55
|
+
pageParams.set("page", String(page));
|
|
56
|
+
const url = `${AUSTENDER_CN_ADVANCED_URL}?${pageParams.toString()}`;
|
|
57
|
+
const $ = await fetchHtml(url, { delay: DEFAULT_DELAY });
|
|
58
|
+
if (page === 1) {
|
|
59
|
+
const totalRecords = extractTotalRecords($);
|
|
60
|
+
if (totalRecords != null) {
|
|
61
|
+
totalPages = Math.max(1, Math.min(MAX_PAGES, Math.ceil(totalRecords / RESULTS_PER_PAGE)));
|
|
101
62
|
}
|
|
102
|
-
}
|
|
63
|
+
}
|
|
64
|
+
const awards = parseTenderArticles($, query);
|
|
65
|
+
if (awards.length === 0)
|
|
66
|
+
break;
|
|
67
|
+
for (const award of awards) {
|
|
68
|
+
if (!award.tender_id || collected.has(award.tender_id))
|
|
69
|
+
continue;
|
|
70
|
+
collected.set(award.tender_id, award);
|
|
71
|
+
}
|
|
72
|
+
if (awards.length < RESULTS_PER_PAGE && totalPages === 1)
|
|
73
|
+
break;
|
|
103
74
|
}
|
|
104
75
|
}
|
|
105
76
|
catch (err) {
|
|
106
77
|
console.error(`[tenders_gov_au] Scrape error: ${err}`);
|
|
107
78
|
}
|
|
79
|
+
const awards = Array.from(collected.values()).filter((award) => matchesQuery(award, query));
|
|
108
80
|
return {
|
|
109
81
|
scraped_at: isoNow(),
|
|
110
82
|
query,
|
|
@@ -114,6 +86,126 @@ export async function scrapeTenders(opts) {
|
|
|
114
86
|
awards,
|
|
115
87
|
};
|
|
116
88
|
}
|
|
89
|
+
// ── Helpers ──────────────────────────────────────────────────────
|
|
90
|
+
function sanitizeDays(days) {
|
|
91
|
+
if (!Number.isFinite(days))
|
|
92
|
+
return 30;
|
|
93
|
+
return Math.min(MAX_DAY_SPAN, Math.max(1, Math.floor(days)));
|
|
94
|
+
}
|
|
95
|
+
function computeDateRange(days) {
|
|
96
|
+
const endDate = startOfDay(new Date());
|
|
97
|
+
const startDate = new Date(endDate);
|
|
98
|
+
startDate.setDate(startDate.getDate() - days);
|
|
99
|
+
return {
|
|
100
|
+
start: formatUiDate(startDate),
|
|
101
|
+
end: formatUiDate(endDate),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function startOfDay(input) {
|
|
105
|
+
const d = new Date(input);
|
|
106
|
+
d.setHours(0, 0, 0, 0);
|
|
107
|
+
return d;
|
|
108
|
+
}
|
|
109
|
+
function formatUiDate(date) {
|
|
110
|
+
const day = String(date.getDate()).padStart(2, "0");
|
|
111
|
+
const month = MONTHS[date.getMonth()];
|
|
112
|
+
const year = date.getFullYear();
|
|
113
|
+
return `${day}-${month}-${year}`;
|
|
114
|
+
}
|
|
115
|
+
function buildSearchParams(opts) {
|
|
116
|
+
const params = new URLSearchParams({
|
|
117
|
+
SearchFrom: "CnSearch",
|
|
118
|
+
Type: "Cn",
|
|
119
|
+
AgencyStatus: "-1",
|
|
120
|
+
DateType: "Publish Date",
|
|
121
|
+
DateStart: opts.start,
|
|
122
|
+
DateEnd: opts.end,
|
|
123
|
+
});
|
|
124
|
+
if (opts.query) {
|
|
125
|
+
params.set("Keyword", opts.query);
|
|
126
|
+
params.set("KeywordTypeSearch", "AllWord");
|
|
127
|
+
}
|
|
128
|
+
return params;
|
|
129
|
+
}
|
|
130
|
+
function cleanText(text) {
|
|
131
|
+
return text.replace(/\u00A0/g, " ").replace(/\s+/g, " ").trim();
|
|
132
|
+
}
|
|
133
|
+
function extractTotalRecords($) {
|
|
134
|
+
const text = cleanText($(".total-result").first().text());
|
|
135
|
+
const match = text.match(/of\s+([\d,]+)/i);
|
|
136
|
+
if (!match)
|
|
137
|
+
return null;
|
|
138
|
+
const total = Number(match[1].replace(/,/g, ""));
|
|
139
|
+
return Number.isFinite(total) ? total : null;
|
|
140
|
+
}
|
|
141
|
+
function parseTenderArticles($, fallbackQuery) {
|
|
142
|
+
const awards = [];
|
|
143
|
+
$("article").each((_i, el) => {
|
|
144
|
+
const heading = cleanText($(el).find(".boxY .lead").first().text());
|
|
145
|
+
const fields = extractFieldMap($, el);
|
|
146
|
+
const tenderId = fields.get("cn id") ?? "";
|
|
147
|
+
if (!tenderId)
|
|
148
|
+
return;
|
|
149
|
+
const valueRaw = fields.get("contract value (aud)") ?? "";
|
|
150
|
+
const supplier = fields.get("supplier name") ?? "";
|
|
151
|
+
const publishDate = fields.get("publish date") ?? "";
|
|
152
|
+
const executionDate = fields.get("execution date") ?? "";
|
|
153
|
+
const agency = fields.get("agency") ?? "";
|
|
154
|
+
const linkHref = $(el).find("a.detail").attr("href") ??
|
|
155
|
+
($(el).find(".list-desc-inner a").first().attr("href") ?? "");
|
|
156
|
+
const url = linkHref
|
|
157
|
+
? (linkHref.startsWith("http") ? linkHref : `${AUSTENDER_BASE}${linkHref}`)
|
|
158
|
+
: `${AUSTENDER_BASE}/Cn/Show/${encodeURIComponent(tenderId)}`;
|
|
159
|
+
awards.push({
|
|
160
|
+
company: supplier || fallbackQuery || "Unknown Supplier",
|
|
161
|
+
tender_id: tenderId,
|
|
162
|
+
value: parseAuDollar(valueRaw),
|
|
163
|
+
value_raw: valueRaw,
|
|
164
|
+
award_date: publishDate || executionDate,
|
|
165
|
+
description: heading || tenderId,
|
|
166
|
+
agency,
|
|
167
|
+
category: "",
|
|
168
|
+
url,
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
return awards;
|
|
172
|
+
}
|
|
173
|
+
function extractFieldMap($, el) {
|
|
174
|
+
const map = new Map();
|
|
175
|
+
$(el).find(".list-desc").each((_idx, desc) => {
|
|
176
|
+
const label = cleanText($(desc).find("span").first().text()).replace(/:$/u, "").toLowerCase();
|
|
177
|
+
const value = cleanText($(desc).find(".list-desc-inner").text());
|
|
178
|
+
if (!label || !value)
|
|
179
|
+
return;
|
|
180
|
+
map.set(label, value);
|
|
181
|
+
});
|
|
182
|
+
return map;
|
|
183
|
+
}
|
|
184
|
+
function matchesQuery(award, query) {
|
|
185
|
+
if (!query)
|
|
186
|
+
return true;
|
|
187
|
+
const needle = query.toLowerCase();
|
|
188
|
+
const normalizedNeedle = normalizeCompany(query).toLowerCase();
|
|
189
|
+
const haystacks = [
|
|
190
|
+
award.company,
|
|
191
|
+
award.description,
|
|
192
|
+
award.agency,
|
|
193
|
+
award.tender_id,
|
|
194
|
+
award.url,
|
|
195
|
+
];
|
|
196
|
+
if (haystacks.some((value) => value.toLowerCase().includes(needle))) {
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
if (normalizedNeedle) {
|
|
200
|
+
const normalizedFields = [
|
|
201
|
+
normalizeCompany(award.company),
|
|
202
|
+
normalizeCompany(award.description),
|
|
203
|
+
normalizeCompany(award.agency),
|
|
204
|
+
];
|
|
205
|
+
return normalizedFields.some((value) => value.toLowerCase().includes(normalizedNeedle));
|
|
206
|
+
}
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
117
209
|
// ── Test/sample data ─────────────────────────────────────────────
|
|
118
210
|
export function sampleData(query) {
|
|
119
211
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenders-gov-au-scraper.js","sourceRoot":"","sources":["../../src/investigation-tools/tenders-gov-au-scraper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"tenders-gov-au-scraper.js","sourceRoot":"","sources":["../../src/investigation-tools/tenders-gov-au-scraper.ts"],"names":[],"mappings":"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"}
|