File size: 2,969 Bytes
5eba174
 
 
 
 
 
 
72a036c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ed00dcb
 
 
72a036c
 
 
ed00dcb
 
 
72a036c
 
 
bec2194
72a036c
5eba174
72a036c
5eba174
 
 
 
 
534f172
72a036c
5eba174
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ce5241a
534f172
f564b1b
72a036c
 
 
ba40d17
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
89
90
91
92
Space each matches like paragraphs but in json

{


}

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 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`);
});