File size: 3,288 Bytes
72a036c fa728fc 72a036c fa728fc 72a036c fa728fc 72a036c fa728fc 72a036c bec2194 72a036c fa728fc 72a036c fa728fc 72a036c fa728fc 72a036c 81c46e0 fa728fc 81c46e0 72a036c fa728fc 72a036c fa728fc 72a036c fa728fc 72a036c fa728fc 72a036c fa728fc 72a036c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
const express = require("express");
const { chromium } = require("playwright-core");
const cheerio = require("cheerio");
const prettify = require("express-prettify"); // Auto-pretty JSON
const prettyjson = require("prettyjson"); // Human-readable formatting
const chalk = require("chalk"); // Colorful console output
const app = express();
const PORT = 7860;
// Use prettify middleware for JSON responses
app.use(prettify({ query: "pretty" }));
async function scrapeMatches() {
const browser = await chromium.launch({
headless: true,
executablePath: "/usr/bin/chromium",
args: ["--no-sandbox", "--disable-setuid-sandbox"]
});
const page = await browser.newPage();
// Set headers to bypass bot detection
await page.setExtraHTTPHeaders({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9",
"Referer": "https://www.google.com/"
});
// Block unnecessary requests (images, CSS, etc.)
await page.route("**/*", (route) => {
return ["image", "stylesheet", "font", "media"].includes(route.request().resourceType())
? route.abort()
: route.continue();
});
// Navigate to main draw predictions page
const baseURL = "https://www.windrawwin.com/predictions/today/all-games/large-stakes/draws/";
await page.goto(baseURL, { waitUntil: "domcontentloaded", timeout: 60000 });
const html = await page.content();
const $ = cheerio.load(html);
let allMatches = [];
// Extract matches from all competitions
$(".wtcont").each((_, competitionElement) => {
const competitionName = $(competitionElement).find(".ptleag").text().trim();
$(competitionElement).find(".wttr").each((_, element) => {
const homeTeam = $(element).find(".wtteam .wtmoblnk").eq(0).text().trim();
const awayTeam = $(element).find(".wtteam .wtmoblnk").eq(1).text().trim();
const stake = $(element).find(".wttd.wtstk").text().trim();
const prediction = $(element).find(".wttd.wtprd").text().trim();
const score = $(element).find(".predscore").text().trim();
if (homeTeam && awayTeam) {
allMatches.push({
competition: competitionName,
homeTeam,
awayTeam,
stake,
prediction,
score
});
}
});
});
await browser.close();
return allMatches;
}
// Express API route with beautified response
app.get("/draw", async (req, res) => {
try {
const matches = await scrapeMatches();
// Beautify response
console.log(chalk.green("\nFetched Matches:"));
console.log(prettyjson.render(matches));
res.json({
success: true,
data: matches
});
} catch (error) {
console.error(chalk.red("Error fetching matches:"), error);
res.status(500).json({ success: false, message: "Failed to fetch data" });
}
});
app.listen(PORT, () => {
console.log(chalk.blue(`\nServer running at http://localhost:${PORT}/draw\n`));
}); |