internal/eusupply replaces the old Node scraper (eu-supply.js) for uk.eu-supply.com. The site has no API, so it posts the public search form, which now needs the form's current defaults and reads the HTML with golang.org/x/net/html. Each tender not stored yet has its own page read too, for its description, contract type, CPV codes and buyer address. Tenders are stored with the source "EU Supply - UK" as eusupply-uk-<tender id>, with one release holding the tender as read. The site publishes no rate limit, so the client sets its own: one request at a time, with a random wait between sources.eu_supply.request_min_gap and request_max_gap (2s to 10s). The source has the same 7-day backfill as Find a Tender's. Most of its tenders are also on Find a Tender, so a new one is stored Hidden and Skipped when another source's opportunity released within 30 days has a title at least 90% alike, and its buyer or description matches too (80% of the shorter one's significant words).
46 lines
3.1 KiB
HTML
46 lines
3.1 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<body>
|
|
<form action="/ctm/Supplier/PublicTenders" id="searchForm" method="post">
|
|
<div id="searchResultContainer">
|
|
<table class="table table-striped">
|
|
<thead>
|
|
<tr><th>Quote/tender Id</th><th>Reference</th><th>Name</th><th>Date of publication</th><th>Response deadline (UK time)</th><th>Process</th><th>Buyers</th><th>Countries</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td> <div data-toggle="tooltip" class="js-tooltip-content" title="100114946"> 100114946 </div> </td>
|
|
<td> <div data-toggle="tooltip" class="js-tooltip-content" title="Proc2852"> Proc2852 </div> </td>
|
|
<td> <span data="OLD URL: /app/rfq/publicpurchase_frameset.asp?PID=109912&PP=ctm/Supplier/PublicTenders&B=UK,&PS=1&NR=1"></span> <a href="/app/rfq/rwlentrance_s.asp?PID=109912&PP=ctm/Supplier/PublicTenders&B=UK&PS=1" target="_blank">Jisc Google for Education Reseller Framework Agreement</a> </td>
|
|
<td> <div data-toggle="tooltip" class="js-tooltip-content" title="21/10/2026 12:45:00"> 21/10/2026 </div> </td>
|
|
<td> <div data-toggle="tooltip" class="js-tooltip-content" title="04/11/2026 12:00:00"> 04/11/2026 12:00 </div> </td>
|
|
<td> <div data-toggle="tooltip" class="js-tooltip-content" title="PA23 - Competitive Flexible "> PA23 - Competitive Flexible </div> </td>
|
|
<td> <div data-toggle="tooltip" class="js-tooltip-content" title="Jisc"> Jisc </div> </td>
|
|
<td> <div data-toggle="tooltip" class="js-tooltip-content" title="United Kingdom"> United Kingdom </div> </td>
|
|
</tr>
|
|
<tr>
|
|
<td> <div data-toggle="tooltip" class="js-tooltip-content" title="100115168"> 100115168 </div> </td>
|
|
<td> <div data-toggle="tooltip" class="js-tooltip-content"> </div> </td>
|
|
<td> <a href="/app/rfq/rwlentrance_s.asp?PID=110143&PP=ctm/Supplier/PublicTenders&B=UK&PS=1" target="_blank">​​York and North Yorkshire Transport Sub-strategies</a> </td>
|
|
<td> <div data-toggle="tooltip" class="js-tooltip-content" title="20/10/2026 12:34:00"> 20/10/2026 </div> </td>
|
|
<td> <div data-toggle="tooltip" class="js-tooltip-content"> </div> </td>
|
|
<td> <div data-toggle="tooltip" class="js-tooltip-content" title="PA23 - Preliminary Market Engagement"> PA23 - Preliminary Market Engagement </div> </td>
|
|
<td> <div data-toggle="tooltip" class="js-tooltip-content" title="York and North Yorkshire Combined Authority"> York and North Yorkshire Combined Authority </div> </td>
|
|
<td> <div data-toggle="tooltip" class="js-tooltip-content" title="United Kingdom"> United Kingdom </div> </td>
|
|
</tr>
|
|
<tr>
|
|
<td> <div class="js-tooltip-content" title="100115999"> 100115999 </div> </td>
|
|
<td> <div class="js-tooltip-content"> </div> </td>
|
|
<td> A row with no link </td>
|
|
<td> <div class="js-tooltip-content" title="20/10/2026 09:00:00"> 20/10/2026 </div> </td>
|
|
<td></td><td></td><td></td><td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<ul class="ctm-pager-info"><li><span><label for="SearchFilter_PagingInfo_PageNumber">Page</label></span></li><li><span class="ctm-pager-input"><input id="SearchFilter_PagingInfo_PageNumber" name="SearchFilter.PagingInfo.PageNumber" type="text" value="1" /></span></li><li><span>of 2</span></li></ul>
|
|
<ul class="ctm-pager-info pull-right"><li><span>items per page</span></li></ul>
|
|
</div>
|
|
</form>
|
|
</body>
|
|
</html>
|