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.
Antes mesmo de escrever seu código de scraping, sempre reserve um tempo para entender a página da web.
Neste caso, com base na visualização do código-fonte da página e na análise da aba de rede nas ferramentas de desenvolvimento, não há nada dinâmico aqui.
Meu primeiro instinto foi usar solicitações HTTP simples com um agente de usuário, mas elas são bloqueadas pelo servidor, então o Playwright é uma opção razoável.
Mas como os dados são estáticos, não há necessidade de hibernar , e você também pode usar o headless (com um agente de usuário ), desabilitar o JS e usar o predicado de navegação mais rápido
"commit"
.Aqui está uma reescrita inicial:
Hora original:
Tempo de reescrita:
Temos uma aceleração de 13x. A maior melhoria foi remover os sleeps desnecessários.
Se você estiver raspando mais páginas do que isso, adicionar uma fila de tarefas para aumentar o paralelismo pode ajudar. Mas para apenas 10 páginas, a sobrecarga e a complexidade do código de adicionar paralelismo não valem a pena, então vou pular isso por enquanto.
Além disso, você pode ter adicionado sleeps para evitar limitação de taxa do servidor. Esse é um bom motivo para sleep, mas então você não conseguirá obter um speedup. Usar um cluster de proxy residencial contornaria isso, mas é muito trabalhoso de configurar, também fora do escopo da questão.
Acho que isso resolverá seu problema.
Não se esqueça de inserir o caminho para o arquivo CSV (linhas 9 e 68)