File size: 3,026 Bytes
72a036c ed00dcb 72a036c ed00dcb fa728fc 72a036c ed00dcb 72a036c ed00dcb 72a036c bec2194 72a036c f564b1b 72a036c f564b1b ed00dcb f564b1b 72a036c f564b1b 72a036c 81c46e0 72a036c f564b1b 72a036c f564b1b 72a036c ed00dcb 72a036c ed00dcb 72a036c ed00dcb 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 |
const express = require("express");
const pretty = require("express-pretty"); // Import express-pretty
const { chromium } = require("playwright-core");
const cheerio = require("cheerio");
const app = express();
const PORT = 7860;
app.use(pretty()); // Enable express-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 });
// Get all league URLs
const leagueLinks = await page.evaluate(() => {
return Array.from(document.querySelectorAll("select#predregion option"))
.map(option => option.value)
.filter(link => link.includes("/predictions/today/"));
});
let allMatches = [];
for (let link of leagueLinks) {
await page.goto(link, { waitUntil: "domcontentloaded", timeout: 60000 });
const html = await page.content();
const $ = cheerio.load(html);
$(".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({
homeTeam,
awayTeam,
stake,
prediction,
score
});
}
});
}
await browser.close();
return allMatches;
}
// Express API route
app.get("/draw", async (req, res) => {
try {
const matches = await scrapeMatches();
res.json({ success: true, data: matches });
} catch (error) {
console.error("Error:", error);
res.status(500).json({ success: false, message: "Failed to fetch data" });
}
});
app.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}/draw`);
}); |