Wer kennt das nicht? Sie müssen Schulungsunterlagen oder andere Dokumente aus dem Internet herunterladen und werden mit einer Flut von Dateilinks konfrontiert. Das manuelle Anklicken jedes einzelnen Links, besonders wenn Sie beispielsweise alle PDF-Dateien einer Webseite herunterladen wollen, kann schnell mühselig und zeitaufwendig werden.
In der Vergangenheit habe ich ein praktisches Chrome-Plugin namens “Link Grabber” verwendet, um solche Massendownloads zu vereinfachen. Es hat zwar gut funktioniert, aber wenn man es regelmäßig benötigt, merkt man schnell, dass es immer noch etwas mühsam ist, insbesondere wenn man spezifische Links aus der gesammelten Liste filtern möchte.
Daher habe ich beschlossen, den Prozess mit einem maßgeschneiderten Python-Skript zu optimieren.
Das Herzstück meines Skripts ist die Funktion find_links_in_html
, die den HTML-Inhalt einer Webseite analysiert und Links extrahiert, die einem vordefinierten regulären Ausdruck entsprechen:
Diese Funktion nutzt die Power von regulären Ausdrücken, um die Links gezielt zu filtern. Als Beispiel habe ich sie so konfiguriert, dass sie alle PDF-Links extrahiert:
links_to_search_for = [r’https?://[^”]+\.pdf’]Um das Ganze noch benutzerfreundlicher zu gestalten, wird jeder gefundene Link automatisch zurück in die Zwischenablage kopiert. Dies wird durch die Zeile pyperclip.copy(link)
innerhalb der Hauptfunktion ermöglicht. So kann ich den Link leicht mit einem Download-Manager meiner Wahl herunterladen.
Außerdem speichert das Skript alle extrahierten Links in einer Datei. Das hat den Vorteil, dass ich vor jedem neuen Download überprüfen kann, ob der Link bereits heruntergeladen wurde, um doppelte Downloads zu vermeiden:
with open(output_file_path, ‘a’) as file: file.write(f“{current_time} | {clipboard_content} | {link}\n“)Mit diesem Skript ist der Download-Prozess nun nicht nur schneller, sondern auch strukturierter und effizienter. Wenn Sie auch solch wiederkehrende Aufgaben haben, kann ein bisschen Automatisierung mit Python Wunder wirken!
""" | |
Zwischenablage-Link-Monitor | |
Dieses Skript überwacht die Zwischenablage nach neuen HTTP- oder HTTPS-Links. | |
Wenn ein Link erkannt wird, wird sein HTML-Inhalt analysiert und nach Links gesucht, | |
die einem Satz von regulären Ausdrücken entsprechen. | |
Gefundene Links werden entweder in die Zwischenablage kopiert oder in eine Datei geschrieben, | |
abhängig von den festgelegten Einstellungen. | |
Zum Beispiel kann dieses Skript verwendet werden, um alle PDF-Links auf einer Webseite zu finden. | |
Usage: | |
1. Setzen Sie die gewünschten regulären Ausdrücke in der Liste links_to_search_for. | |
2. Wählen Sie den gewünschten Ausgabemodus (Zwischenablage oder Datei). | |
3. Starten Sie das Skript und kopieren Sie die zu überwachenden Links in die Zwischenablage. | |
Author: Erhard Rainer | |
Version 0.1 | |
Datum: 29.08.2023 | |
""" | |
import pyperclip | |
import requests | |
import time | |
import re | |
from datetime import datetime | |
def find_links_in_html(html_content, regex_patterns): | |
"""Suche nach Links im HTML-Inhalt basierend auf regulären Ausdrücken.""" | |
found_links = [] | |
for pattern in regex_patterns: | |
# Für jeden regulären Ausdruck suchen wir nach Übereinstimmungen im HTML-Inhalt. | |
found_links.extend(re.findall(pattern, html_content)) | |
return list(set(found_links)) # Entferne Duplikate | |
def link_already_exists_in_file(link, file_path): | |
""" | |
Überprüfe, ob ein Link bereits in einer Datei existiert. | |
Parameters: | |
- link: Der zu überprüfende Link. | |
- file_path: Pfad zur Datei, in der überprüft werden soll. | |
Returns: | |
- True, wenn der Link in der Datei gefunden wird, sonst False. | |
""" | |
try: | |
with open(file_path, 'r') as file: | |
for line in file: | |
if link in line: | |
return True | |
return False | |
except FileNotFoundError: | |
# Wenn die Datei nicht gefunden wird, geben wir False zurück. | |
return False | |
def monitor_clipboard_for_links(link_starts, output_file_path, output='clipboard', print_html=False, check_file_before_copying=True): | |
""" | |
Überwache die Zwischenablage nach Links und handle entsprechend der Einstellungen. | |
Parameters: | |
- link_starts: Eine Liste von Link-Startstrings zum Suchen im HTML-Inhalt. | |
- output_file_path: Pfad zur Ausgabedatei. | |
- output: Entweder 'clipboard' (um Links in die Zwischenablage zu kopieren) oder 'file' (um Links in eine Datei zu schreiben). | |
- print_html: Wenn True, wird der HTML-Inhalt ausgegeben. | |
- check_file_before_copying: Wenn True, wird überprüft, ob ein Link bereits in der Ausgabedatei existiert, bevor er kopiert wird. | |
""" | |
last_clipboard_content = '' | |
while True: | |
# Hole den aktuellen Inhalt der Zwischenablage. | |
clipboard_content = pyperclip.paste() | |
# Prüfe auf neue Links in der Zwischenablage. | |
if clipboard_content != last_clipboard_content and re.match(r'https?://', clipboard_content): | |
print(f"Detected new link: {clipboard_content}") | |
try: | |
# Versuche, den Inhalt der URL zu holen. | |
response = requests.get(clipboard_content) | |
if print_html: | |
print("HTML Content:") | |
print(response.text) | |
# Finde alle Links im HTML-Inhalt, die mit den gegebenen Startstrings beginnen. | |
found_links = find_links_in_html(response.text, link_starts) | |
if found_links: | |
print(f"Number of links found: {len(found_links)}") | |
for link in found_links: | |
# Überspringe den Link, wenn er bereits in der Datei ist und überprüft werden soll. | |
if check_file_before_copying and link_already_exists_in_file(link, output_file_path): | |
continue | |
current_time = datetime.now().strftime('%Y-%m-%d-%H-%M-%S') | |
# Speichere den gefundenen Link in der Datei. | |
with open(output_file_path, 'a') as file: | |
file.write(f"{current_time} | {clipboard_content} | {link}\n") | |
# Kopiere den Link in die Zwischenablage, wenn gewünscht. | |
if output == 'clipboard': | |
pyperclip.copy(link) | |
print(f"Found link: {link}") | |
except requests.RequestException as e: | |
print(f"Error fetching {clipboard_content}. Reason: {e}") | |
except Exception as e: | |
print(f"Unexpected error occurred. Reason: {e}") | |
last_clipboard_content = clipboard_content | |
time.sleep(1) | |
if __name__ == '__main__': | |
# Hier können Sie reguläre Ausdrücke festlegen, um z.B. alle PDF-Links zu finden: | |
links_to_search_for = [r'https?://[^"]+\.pdf'] | |
output_mode = 'clipboard' | |
output_file_path = 'links_output.txt' | |
monitor_clipboard_for_links(links_to_search_for, output_file_path, output_mode, print_html=True, check_file_before_copying=True) |