Estou tentando extrair dados deste site usando Python e Playwright, mas estou encontrando alguns problemas. O navegador roda em modo não headless, e o processo é muito lento. Quando tentei outras abordagens, como usar requests e BeautifulSoup, tive problemas de acesso, incluindo erros 403 Forbidden e 404 Not Found. Meu objetivo é extrair todas as páginas de forma eficiente e salvar os dados em um arquivo CSV.
Aqui está o código que estou usando atualmente:
import asyncio
from playwright.async_api import async_playwright
import pandas as pd
from io import StringIO
URL = "https://www.coingecko.com/en/coins/1/markets/spot"
async def fetch_page(page, url):
print(f"Fetching: {url}")
await page.goto(url)
await asyncio.sleep(5)
return await page.content()
async def scrape_all_pages(url, max_pages=10):
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False, slow_mo=2000)
context = await browser.new_context(viewport={"width": 1280, "height": 900})
page = await context.new_page()
markets = []
for page_num in range(1, max_pages + 1):
html = await fetch_page(page, f"{url}?page={page_num}")
dfs = pd.read_html(StringIO(html)) # Parse tables
markets.extend(dfs)
await page.close()
await context.close()
await browser.close()
return pd.concat(markets, ignore_index=True)
def run_async(coro):
try:
loop = asyncio.get_running_loop()
except RuntimeError:
loop = None
if loop and loop.is_running():
return asyncio.create_task(coro)
else:
return asyncio.run(coro)
async def main():
max_pages = 10
df = await scrape_all_pages(URL, max_pages)
df = df.dropna(how='all')
print(df)
run_async(main())
Os principais problemas são a velocidade lenta de scraping e os erros de acesso ao usar alternativas ao Playwright. Estou procurando conselhos sobre como melhorar essa abordagem, seja otimizando o código atual, lidando com restrições de acesso como spoofing de user-agent ou proxies, ou mudando para uma biblioteca completamente diferente. Quaisquer sugestões sobre como tornar o processo mais rápido e confiável seriam muito apreciadas. Obrigado.