Ignore:
Timestamp:
01/11/25 01:23:10 (5 days ago)
Author:
Kristijan <kristijanzafirovski26@…>
Branches:
master
Children:
0a7426e
Parents:
1c51912
Message:

Added info scraping for escape travel

Location:
backend/GlobeGuru-backend/src/main
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • backend/GlobeGuru-backend/src/main/java/DatabaseUtil.java

    r1c51912 rcd64b06  
    151151                "FROM options o " +
    152152                "LEFT JOIN optionDetails od ON o.id = od.optionId " +
    153                 "WHERE (o.country LIKE ? OR o.hotelName LIKE ?)";
     153                "WHERE (o.country LIKE ? OR o.hotelName LIKE ?) " +
     154                "AND od.type IS NOT NULL " +
     155                "AND od.board IS NOT NULL " +
     156                "AND od.price > 0";
    154157
    155158        if (dateQuery != null && !dateQuery.isEmpty() && !dateFlag) {
     
    200203        return options;
    201204    }
     205
    202206
    203207
  • backend/GlobeGuru-backend/src/main/java/FrontendHandler.java

    r1c51912 rcd64b06  
    130130            return;
    131131        }
    132 
    133132        Server.sendResponse(exchange, 200, mapper.writeValueAsString(options));
    134133    }
  • backend/GlobeGuru-backend/src/main/java/ScraperThread.java

    r1c51912 rcd64b06  
    9696                            } else if (optionSet.add(option)) {
    9797                                uniqueOptions.add(option);
    98                                 DatabaseUtil.saveOptionToDatabase(option);
     98                                option.setId(DatabaseUtil.saveOptionToDatabase(option));
     99                                scrapeOptionInfo(option);
    99100                                System.out.println("Parsed " + option);
    100101                            }
     
    149150
    150151             String board = roomOption.select(".rezervacija-objekt").text();
    151              if(board.length() > 2){
    152                  board = board.substring(0,2);
     152             if(board.length() > 2) {
     153                 board = board.substring(0, 2);
    153154             }
    154              if(board.isEmpty() || type.isEmpty()){
    155                  continue;
    156              }
     155             if(board.isEmpty() || type.isEmpty()) continue;
     156
    157157             Elements amenityElement = roomOption.select(".objekt-opis");
    158158             String amenity = (amenityElement != null ? amenityElement.text() : "");
     
    166166             DatabaseUtil.saveOptionDetails(option.getId(), type,board,amenity, price);
    167167         }
     168        }
     169        else if(url.contains("booking.escapetravel.mk")){
     170            System.out.println("Scraping info for " + url);
     171
     172            driver.get(url);
     173            try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } //data fetch
     174            String pageSource = driver.getPageSource();
     175            Document doc = Jsoup.parse(pageSource);
     176            Elements roomOptions = doc.select("#hotel-rooms-container .hotel-room-row");
     177            for(Element roomOption : roomOptions){
     178                String type = roomOption.select("td.align-middle").first().text();
     179                String board = roomOption.select("td.align-middle.text-primary.lead").text();
     180                if (board.isEmpty() || type.isEmpty())  continue;
     181                String priceText = roomOption.select("td.align-middle.text-end .text-success.d-block.lead").text().replace("€", "").trim();
     182                float price;
     183                if (!priceText.isEmpty()) {
     184                    price = Float.parseFloat(priceText.replace(",", ""));
     185                } else continue;
     186
     187                Elements amenityElements = doc.select("div.row > div.col-6.col-md-3.col-xl-2");
     188                StringBuilder amenities = new StringBuilder();
     189                for (Element amenityElement : amenityElements) {
     190                    amenities.append(amenityElement.text()).append(", ");
     191                }
     192                if (!amenities.isEmpty()) {
     193                    amenities.setLength(amenities.length() - 2);
     194                }
     195                System.out.println(type + board + price + amenities);
     196                DatabaseUtil.saveOptionDetails(option.getId(), type, board, amenities.toString(), price);
     197            }
     198
    168199        }
    169200    }
  • backend/GlobeGuru-backend/src/main/java/Server.java

    r1c51912 rcd64b06  
    196196
    197197    public static void sendResponse(HttpExchange exchange, int statusCode, String response) throws IOException {
     198        byte[] responseBytes = response.getBytes(StandardCharsets.UTF_8);
    198199        exchange.getResponseHeaders().add("Cross-Origin-Opener-Policy", "unsafe-none");
    199200        exchange.getResponseHeaders().add("Cross-Origin-Embedder-Policy", "require-corp");
    200201        exchange.getResponseHeaders().add("Content-Type", "application/json");
    201         exchange.sendResponseHeaders(statusCode, response.length());
    202         exchange.getResponseBody().write(response.getBytes());
    203         exchange.getResponseBody().close();
    204     }
    205 
     202        exchange.getResponseHeaders().add("Transfer-Encoding", "chunked");
     203        exchange.sendResponseHeaders(statusCode, 0);
     204        try (OutputStream os = exchange.getResponseBody()) {
     205            os.write(responseBytes);
     206        }
     207    }
    206208}
    207209
  • backend/GlobeGuru-backend/src/main/resources/URLsJSON.json

    r1c51912 rcd64b06  
    22  "agencyurls":
    33          [
    4             "https://magelantravel.mk/"
    5 
     4            "https://magelantravel.mk/",
     5            "https://booking.escapetravel.mk/"
    66          ]
    77}
Note: See TracChangeset for help on using the changeset viewer.