test_camoufox.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import argparse
  2. import os
  3. import random
  4. from pathlib import Path
  5. from urllib.parse import urlparse
  6. from dotenv import load_dotenv
  7. from camoufox.sync_api import Camoufox
  8. BASE_DIR = Path(__file__).resolve().parent
  9. ENVIRONMENT = os.getenv("ENVIRONMENT", "develop")
  10. ENV_FILE = BASE_DIR / f".env.{ENVIRONMENT}"
  11. if ENV_FILE.exists():
  12. load_dotenv(dotenv_path=ENV_FILE)
  13. else:
  14. load_dotenv()
  15. def _load_rotating_proxy_list() -> list[str]:
  16. raw = os.getenv("ROTATING_PROXY_LIST", "")
  17. if not raw:
  18. return []
  19. return [proxy.strip() for proxy in raw.split(",") if proxy.strip()]
  20. ROTATING_PROXY_LIST = _load_rotating_proxy_list()
  21. DEFAULT_URL = "https://example.com"
  22. def make_proxy_config(proxy: str) -> dict:
  23. proxy_url = urlparse(f"http://{proxy}")
  24. return {
  25. "server": f"http://{proxy_url.hostname}:{proxy_url.port}",
  26. }
  27. def get_screenshot_filename(url: str) -> str:
  28. domain = urlparse(url).netloc
  29. if domain.startswith("www."):
  30. domain = domain[4:]
  31. if not domain:
  32. domain = "screenshot"
  33. return f"{domain}.png"
  34. def try_visit(url: str, proxy: str | None = None) -> None:
  35. kwargs = {
  36. "headless": True,
  37. }
  38. if proxy:
  39. print(f"Usando proxy: {proxy}")
  40. kwargs["proxy"] = make_proxy_config(proxy)
  41. kwargs["geoip"] = True
  42. else:
  43. print("No se usará proxy")
  44. screenshot_path = get_screenshot_filename(url)
  45. with Camoufox(**kwargs) as browser:
  46. page = browser.new_page()
  47. page.goto(url, timeout=120000)
  48. page.wait_for_load_state("networkidle", timeout=120000)
  49. page.screenshot(path=screenshot_path)
  50. print(f"Screenshot guardado como {screenshot_path}")
  51. def main() -> None:
  52. parser = argparse.ArgumentParser(description="Visita una URL con Camoufox")
  53. parser.add_argument(
  54. "url",
  55. nargs="?",
  56. default=DEFAULT_URL,
  57. help="URL a visitar (por defecto: página de Mercado Libre)",
  58. )
  59. parser.add_argument(
  60. "--use-proxy",
  61. action="store_true",
  62. help="Usar un proxy aleatorio de ROTATING_PROXY_LIST",
  63. )
  64. args = parser.parse_args()
  65. if args.use_proxy:
  66. max_attempts = 5
  67. for attempt in range(1, max_attempts + 1):
  68. proxy = random.choice(ROTATING_PROXY_LIST)
  69. try:
  70. try_visit(args.url, proxy=proxy)
  71. break
  72. except Exception as exc:
  73. print(f"Intento {attempt} falló: {exc}")
  74. if attempt == max_attempts:
  75. raise
  76. else:
  77. try_visit(args.url)
  78. if __name__ == "__main__":
  79. main()