Download server.js from ReikerXx/Pred: direct link, hf CLI and curl.
- Browser
- Download file 2.91 kB
-
https://huggingface.co/spaces/ReikerXx/Pred/resolve/main/server.js
- Command line
-
hf download hf://spaces/ReikerXx/Pred/server.js
-
curl -L -o server.js https://huggingface.co/spaces/ReikerXx/Pred/resolve/main/server.js
2.91 kB
| 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`); | |
| }); |