File size: 2,771 Bytes
72a036c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81c46e0
 
72a036c
 
 
81c46e0
 
 
72a036c
81c46e0
72a036c
 
 
 
 
 
 
81c46e0
 
 
 
 
 
 
 
72a036c
 
81c46e0
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
const express = require("express");
const { chromium } = require("playwright-core");
const cheerio = require("cheerio");

const app = express();
const PORT = 7860;

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 the 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, including competition names
    $(".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
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`);
});