File size: 4,330 Bytes
e84fb4f
d92c861
462e814
a6e8718
cb2cabb
 
 
 
 
 
a6e8718
462e814
d92c861
9ba3ade
 
 
 
 
 
 
d92c861
 
 
 
 
 
 
 
accd0f3
92199f9
0f0c7dc
 
ef24fee
92199f9
 
ef24fee
 
0f0c7dc
cb2cabb
 
 
1d74e32
cb2cabb
1d74e32
 
 
 
 
 
 
 
 
 
 
 
 
 
cb2cabb
 
 
 
1d74e32
cb2cabb
 
 
1d74e32
cb2cabb
 
1d74e32
cb2cabb
 
1d74e32
 
 
 
 
 
 
 
 
cb2cabb
 
 
1d74e32
 
c0bee13
 
1d74e32
c0bee13
 
1d74e32
 
cb2cabb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1d74e32
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from scraper import Scraper
#import nest_asyncio
import asyncio
from playwright.async_api import async_playwright
from fastapi import FastAPI
import random

# Allow nested use of asyncio.run() in Jupyter
#nest_asyncio.apply()


try: from pip._internal.operations import freeze
except ImportError: # pip < 10.0
    from pip.operations import freeze

pkgs = freeze.freeze()
for pkg in pkgs: print(pkg)

app = FastAPI()
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)
import time

@app.get("/get_scraped_data")
async def get_data(url: str):
        try:
            data = await Scraper.scrape(url)
            return data
        except:
            return {"title": "error", "URL": url, "Content": "none"}


# FastAPI route to scrape the website
@app.get("/scrape")
async def scrape_website(url: str):
    async with async_playwright() as p:
        # Launch browser in headless mode with custom args to bypass detection
        browser = await p.chromium.launch(
            headless=True,
            args=[
                "--disable-blink-features=AutomationControlled",  # Disable automation features
                "--no-sandbox",
                "--disable-dev-shm-usage",
                "--disable-web-security",
                "--disable-setuid-sandbox",
                "--disable-features=IsolateOrigins,site-per-process"
            ]
        )

        # Create a new browser context
        context = await browser.new_context(
            user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
        )

        # Set additional headers to mimic real browsing
        await context.set_extra_http_headers({
            "Accept-Language": "en-US,en;q=0.9",
            "Upgrade-Insecure-Requests": "1",
            "Referer": "https://www.nasdaq.com"
        })

        # Create a new page
        page = await context.new_page()

        # Hide WebDriver and other automation-related properties
        await page.add_init_script("""
            Object.defineProperty(navigator, 'webdriver', {get: () => undefined});
            window.navigator.chrome = { runtime: {} };
            Object.defineProperty(navigator, 'plugins', {get: () => [1, 2, 3, 4, 5]});
            Object.defineProperty(navigator, 'languages', {get: () => ['en-US', 'en']});
        """)

        # Block unnecessary resources (images, media, etc.)
        await page.route("**/*", lambda route: route.abort() if route.request.resource_type in ["image", "media", "stylesheet", "font", "xhr"] else route.continue_())

        try:
            # Navigate to the page with random delays
            await asyncio.sleep(random.uniform(1, 5))  # Random delay
            await page.goto(url, wait_until='domcontentloaded', timeout=60000)

            # Randomized mouse movement and scrolling to mimic human interaction
            await page.mouse.move(random.uniform(0, 100), random.uniform(0, 100))
            await page.mouse.wheel(0, random.uniform(200, 400))
            await asyncio.sleep(random.uniform(1, 5))  # Another random delay

            # Get the title of the page
            title = await page.title()

            # Get all links on the page
            links = await page.evaluate("""() => {
                return Array.from(document.querySelectorAll('a')).map(a => a.href);
            }""")

            # Get page content (text from paragraphs and headers)
            content = await page.evaluate("""() => {
                let elements = Array.from(document.querySelectorAll('body *'));
                return elements
                    .filter(element => element.tagName.match(/^(P|H1|H2|H3|H4|H5|H6|LI|DIV|SPAN)$/i) && element.innerText.trim().length > 0)
                    .map(element => element.innerText.trim())
                    .join('\\n');
            }""")

            # Close the browser
            await browser.close()

            return {
                "title": title,
                "links": links,
                "content": content
            }

        except Exception as e:
            return {"error": str(e)}