96 lines
2.3 KiB
Python
Executable File
96 lines
2.3 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
import sys
|
|
import subprocess
|
|
import time
|
|
import random
|
|
|
|
|
|
def ensure_package(pkg):
|
|
try:
|
|
__import__(pkg)
|
|
except ImportError:
|
|
subprocess.check_call([sys.executable, "-m", "pip", "install", pkg])
|
|
|
|
|
|
for pkg in ("bs4", "requests"):
|
|
ensure_package(pkg)
|
|
|
|
from bs4 import BeautifulSoup
|
|
import requests
|
|
import argparse
|
|
|
|
|
|
def create_session():
|
|
session = requests.Session()
|
|
session.headers.update({
|
|
"User-Agent": "Mozilla/5.0"
|
|
})
|
|
return session
|
|
|
|
|
|
def fetch(session, method, url, **kwargs):
|
|
for _ in range(3):
|
|
try:
|
|
response = session.request(method, url, timeout=10, **kwargs)
|
|
if response.status_code == 200:
|
|
return response
|
|
time.sleep(5)
|
|
except requests.RequestException:
|
|
time.sleep(5)
|
|
return None
|
|
|
|
|
|
def recherche_duckduckgo(session, query, n):
|
|
url = "https://html.duckduckgo.com/html/"
|
|
response = fetch(session, "POST", url, data={"q": query})
|
|
|
|
if not response:
|
|
return []
|
|
|
|
soup = BeautifulSoup(response.text, "html.parser")
|
|
|
|
results = []
|
|
for result in soup.select("a.result__a")[:n]:
|
|
title = result.get_text(strip=True)
|
|
link = result.get("href")
|
|
if link:
|
|
results.append((title, link))
|
|
|
|
return results
|
|
|
|
|
|
def extract_text(session, url, max_chars):
|
|
response = fetch(session, "GET", url)
|
|
|
|
if not response:
|
|
return "[Erreur: accès impossible]"
|
|
|
|
soup = BeautifulSoup(response.text, "html.parser")
|
|
text = soup.get_text(separator=" ", strip=True)
|
|
|
|
return (text[:max_chars] + "...") if len(text) > max_chars else text
|
|
|
|
|
|
def main(argc, argv):
|
|
parser = argparse.ArgumentParser(description="Recherche + extraction de texte")
|
|
parser.add_argument("query", type=str)
|
|
parser.add_argument("-n", "--number", type=int, default=5)
|
|
parser.add_argument("--chars", type=int, default=1000)
|
|
|
|
args = parser.parse_args(argv[1:])
|
|
|
|
session = create_session()
|
|
results = recherche_duckduckgo(session, args.query, args.number)
|
|
|
|
for i, (title, link) in enumerate(results, 1):
|
|
print(f"\n{i}. {title}")
|
|
print(f"URL: {link}")
|
|
snippet = extract_text(session, link, args.chars)
|
|
print(f"Extrait: {snippet}")
|
|
time.sleep(random.uniform(1.5, 3.5))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main(len(sys.argv), sys.argv)
|