#!/usr/bin/env python import sys import subprocess # Vérifie et installe les dépendances si nécessaire def ensure_package(pkg): try: __import__(pkg) except ImportError: print(f"{pkg} non trouvé, installation...") subprocess.check_call([sys.executable, "-m", "pip", "install", pkg]) ensure_package("bs4") ensure_package("requests") from bs4 import BeautifulSoup import requests import argparse def recherche_duckduckgo(query, n=5): url = "https://html.duckduckgo.com/html/" headers = {"User-Agent": "Mozilla/5.0"} response = requests.post(url, data={"q": query}, headers=headers) soup = BeautifulSoup(response.text, "html.parser") results = [] for result in soup.find_all("a", class_="result__a", limit=n): title = result.get_text() link = result.get("href") results.append((title, link)) return results def extract_text(url, max_chars=300): try: headers = {"User-Agent": "Mozilla/5.0"} response = requests.get(url, headers=headers, timeout=5) soup = BeautifulSoup(response.text, "html.parser") # Récupère le texte brut text = soup.get_text(separator=" ", strip=True) return text[:max_chars] + "..." except Exception as e: return f"[Erreur lors de l'accès au site: {e}]" def main(): parser = argparse.ArgumentParser(description="Recherche + extraction de texte") parser.add_argument("query", type=str, help="Terme de recherche") parser.add_argument("-n", "--number", type=int, default=3, help="Nombre de résultats") parser.add_argument("--chars", type=int, default=300, help="Nombre de caractères à extraire") args = parser.parse_args() results = recherche_duckduckgo(args.query, args.number) for i, (title, link) in enumerate(results, 1): print(f"\n{i}. {title}") print(f"URL: {link}") snippet = extract_text(link, args.chars) print(f"Extrait: {snippet}") if __name__ == "__main__": main()