From 0f5800441a4e35152a971f2f4f6e91fe48197c23 Mon Sep 17 00:00:00 2001 From: michael1986 Date: Fri, 28 Nov 2025 05:54:30 +0100 Subject: [PATCH] start --- cache/page_cache.db | Bin 12173312 -> 15179776 bytes .../auction/TroostwijkAuctionExtractor.java | 15 +- .../java/com/auction/TroostwijkScraper.java | 313 ++++++++++++++---- .../com/auction/TroostwijkScraperTest.java | 5 + 4 files changed, 268 insertions(+), 65 deletions(-) diff --git a/cache/page_cache.db b/cache/page_cache.db index 1631f99992938b09d67448a2be0a6cb57fb40f50..62a5c7e48ad8615391fdb81bb0de9864726132fd 100644 GIT binary patch delta 113991 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

VZRfgFdXPefMq)Y)Apg4 z7mni5{yU7r?}%5HA@HpFaWG0>e6#YBJ=1UK+B>CzeALt-2JMr)==zE~yIs_G>iBAE ze8yV29CK_xdk-+*r%sK1FPC5RVQuQ{SZy{?igFRASm_( zi7Gus{>dNtE#1;3Kc!uM$Tx|GtGeSNYA~(M>W?P7R8{jR@>T25nlz7@=rC2Ex7q*M z=`us9`LT9Y3`PFRFX?3dUA{=0v`UMFBp`;Fk)A6)ud~{4*Bb5^#3By8U_o!hqYwHb z0amEcV1u9^`eOhFVh{!+5koK(!!R64uww*9A{h>h!f1@aSd7DXOu$5>U=k+7iBzOv z3eu5*Ok`myron~jn1Pv?h1r;cxtNEZ@AHw31z3nhSd1me!BXU68J1%OR$>)aV-40~ z9oAz5@~{z`uo+vh72B{K`PhM-C_o{0VK??*FN#o%5|m;e%CH{?a1e)Z7#*Ki#-a1&nmPzOJ5!N6_Y!Cl discoverDutchAuctions() { - List saleIds = new ArrayList<>(); - try { - // Fetch the auctions overview page - Document doc = Jsoup.connect(AUCTIONS_PAGE).get(); - - // Select all anchor elements that link to auction pages - // The URL pattern is: /a/auction-title-A1-xxxxx or /a/auction-title-A7-xxxxx - Elements auctionLinks = doc.select("a[href^='/a/']"); - - System.out.println("Found " + auctionLinks.size() + " potential auction links"); - - for (Element link : auctionLinks) { - // Get the href to extract the auction ID - String href = link.attr("href"); - - // Check if this link contains location text with ", NL" - String linkText = link.text(); - - // Look for location in any div inside the link - Elements divs = link.select("div"); - boolean isDutch = false; - for (Element div : divs) { - String text = div.text(); - if (text.contains(", NL")) { - isDutch = true; - break; - } + Set saleIds = new HashSet<>(); + + // Check if browser is initialized + if (browser == null) { + initializeBrowser(); + } + + int pageNumber = 1; + boolean hasMorePages = true; + + System.out.println("Starting Dutch auction discovery from " + AUCTIONS_PAGE); + + while (hasMorePages) { + System.out.println("\n[Page " + pageNumber + "] Fetching auctions..."); + + // Check cache first + String html = loadFromCache(pageNumber); + + if (html != null) { + System.out.println(" ✓ Loaded from cache"); + } else { + // Fetch with Playwright + html = fetchPageWithPlaywright(pageNumber); + + if (html == null || html.isEmpty()) { + System.out.println(" ⚠️ Failed to fetch page, stopping pagination"); + break; } - - if (isDutch) { - // Extract auction ID from URL - // Format: /a/title-A1-38375 or /a/title-A7-12345 - // We want the number after A1- or A7- - java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("A[17]-(\\d+)"); - java.util.regex.Matcher matcher = pattern.matcher(href); - - if (matcher.find()) { - try { - int saleId = Integer.parseInt(matcher.group(1)); - if (!saleIds.contains(saleId)) { - saleIds.add(saleId); - System.out.println(" Found Dutch auction: " + saleId + " - " + href); - } - } catch (NumberFormatException e) { - // Skip invalid IDs - } - } + + System.out.println(" ✓ Fetched from website"); + + // Save to cache + if (useCache) { + saveToCache(pageNumber, html); + } + + // Rate limiting + try { + Thread.sleep(RATE_LIMIT_MS); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; } } - } catch (IOException e) { - System.err.println("Failed to discover auctions: " + e.getMessage()); - e.printStackTrace(); + + // Parse auctions from HTML + int foundOnPage = parseAuctionsFromHtml(html, saleIds); + + if (foundOnPage == 0) { + System.out.println(" ⚠️ No Dutch auctions found on page, stopping pagination"); + hasMorePages = false; + } else { + System.out.println(" ✓ Found " + foundOnPage + " Dutch auctions"); + pageNumber++; + } } - return saleIds; + + System.out.println("\n✓ Total Dutch auctions discovered: " + saleIds.size()); + return new ArrayList<>(saleIds); + } + + /** + * Fetches a single page using Playwright + */ + private String fetchPageWithPlaywright(int pageNumber) { + String url = pageNumber == 1 + ? AUCTIONS_PAGE + : AUCTIONS_PAGE + "?page=" + pageNumber; + + try { + Page page = browser.newPage(); + + // Set user agent + page.setExtraHTTPHeaders(Map.of( + "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" + )); + + // Navigate to page + page.navigate(url, new Page.NavigateOptions() + .setTimeout(30000) + .setWaitUntil(WaitUntilState.NETWORKIDLE)); + + // Wait for auction listings to appear + try { + page.waitForSelector("a[href^='/a/']", new Page.WaitForSelectorOptions() + .setTimeout(10000)); + } catch (Exception e) { + // Continue even if selector not found + System.out.println(" ⚠️ Auction selector not found"); + } + + // Get HTML content + String html = page.content(); + page.close(); + + return html; + + } catch (Exception e) { + System.err.println(" ⚠️ Playwright error: " + e.getMessage()); + return null; + } + } + + /** + * Parses auctions from HTML and adds Dutch auctions to the set + * @return number of Dutch auctions found on this page + */ + private int parseAuctionsFromHtml(String html, Set saleIds) { + int foundCount = 0; + + // Simple regex-based parsing for auction links + java.util.regex.Pattern linkPattern = java.util.regex.Pattern.compile( + "href=\"(/a/[^\"]+A[17]-(\\d+)[^\"]*)\""); + java.util.regex.Matcher linkMatcher = linkPattern.matcher(html); + + while (linkMatcher.find()) { + String href = linkMatcher.group(1); + int auctionId = Integer.parseInt(linkMatcher.group(2)); + + // Avoid duplicates + if (saleIds.contains(auctionId)) { + continue; + } + + // Check if this auction is Dutch (location contains ", NL") + if (isDutchAuction(html, href)) { + saleIds.add(auctionId); + foundCount++; + System.out.println(" Found Dutch auction: " + auctionId + " - " + href); + } + } + + return foundCount; + } + + /** + * Checks if an auction is located in the Netherlands + */ + private boolean isDutchAuction(String html, String href) { + int hrefPos = html.indexOf(href); + if (hrefPos == -1) return false; + + // Look at 1000 characters before and after the href for location info + int startPos = Math.max(hrefPos - 500, 0); + int endPos = Math.min(hrefPos + 1000, html.length()); + String context = html.substring(startPos, endPos); + + // Look for ", NL" pattern + return context.contains(", NL"); + } + + /** + * Loads cached HTML for a page + */ + private String loadFromCache(int pageNumber) { + if (!useCache || cacheDb == null) return null; + + String url = pageNumber == 1 + ? AUCTIONS_PAGE + : AUCTIONS_PAGE + "?page=" + pageNumber; + + return cacheDb.get(url); + } + + /** + * Saves HTML to cache + */ + private void saveToCache(int pageNumber, String html) { + if (!useCache || cacheDb == null) return; + + String url = pageNumber == 1 + ? AUCTIONS_PAGE + : AUCTIONS_PAGE + "?page=" + pageNumber; + + cacheDb.put(url, html, CACHE_EXPIRATION_HOURS); } /** diff --git a/src/test/java/com/auction/TroostwijkScraperTest.java b/src/test/java/com/auction/TroostwijkScraperTest.java index 4bb4344..df9362c 100644 --- a/src/test/java/com/auction/TroostwijkScraperTest.java +++ b/src/test/java/com/auction/TroostwijkScraperTest.java @@ -55,6 +55,11 @@ public class TroostwijkScraperTest { @AfterEach public void tearDown() { + // Clean up browser and cache + if (scraper != null) { + scraper.close(); + } + // Clean up test database File dbFile = new File(testDatabasePath); if (dbFile.exists()) {