PowerShell: Webcomic-Download-Script

Ich lese jeden Morgen in der Frühstückspause ein paar Webcomics. Einer meiner Favoriten ist Cyanide and Happiness (oder auch explosm). Leider bin ich erst vor Kurzem auf diese Seite gestoßen und daher habe ich viele Comics nicht gelesen. Wenn ich zwischendurch mal extreme Langeweile habe (Nein, das kommt nicht vor. Ich will mich nur vorm Lernen drücken.), möchte ich dies nun nachholen. Leider hat die Seite manchmal eine recht lange Ladezeit und sooo viel Zeit habe ich ja nun auch nicht 🙂

Daher habe ich mir mal schnell ein kleines Download-Script für die PowerShell gebastelt, das die Comics für mich herunterlädt, sodass ich sie später lesen kann. Das ganze funktioniert mit Regular Expressions, da bei explosm die Comics (also die tatsächlichen Bilddateien) nicht etwa durchnummeriert sind, sondern frei vergebene Namen haben und in verschiedenen Ordnern liegen.

Das folgende Script öffnet nach Übergabe von 2 Parametern (Start- und Endnummer) die entsprechenden Comics von explosm und versucht, die URL der Bilddatei zu ermitteln. Sollte das nicht klappen, kann es sein, dass es das Comic mit der Nummer nicht gibt (nicht schlimm), oder dass die URL nicht ausgelesen werden konnte (dann muss der RegEx angepasst werden). Bei letzterem Fall wird die Nummer in die Datei errors.txt gespeichert. Ansonsten lädt das Script die Bilddatei herunter und speichert sie mit der Nummer zu Beginn des Dateinamens ab.

explosmdownloadscript.jpg

  1. if ($args.Count -ne 2)
  2. {
  3.     Write-Host "Start and end number needed" -foregroundcolor "red";
  4.     exit;
  5. }
  6. #
  7. $start = $args[0];
  8. $end = $args[1];
  9. #
  10. $path = Split-Path -Parent $MyInvocation.MyCommand.Path;
  11. $pattern = [regex] ‚img alt="Cyanide and Happiness, a daily webcomic" src="(?<url>http:\/\/www\.explosm\.net\/db\/files\/(Comics\/)?(?<author>[a-zA-Z0-9]*\/)?(?<file>[\(\) a-zA-Z0-9_-]*\.[a-zA-Z]{3,4}))"‘;
  12. $errPattern = [regex] "WAHT YOU DOEN";
  13. $clnt = New-Object System.Net.WebClient
  14. #
  15. for ($i = $start; $i -le $end; $i++)
  16. {
  17.     Write-Host "Comic No" $i.ToString("0000");
  18.     $url = "http://www.explosm.net/comics/" + $i + "/";
  19.     $html = GetUrl $url;
  20.     $m = $pattern.Match($html);
  21.     if ($m.Success)
  22.     {
  23.         $pic = $m.Groups[‚url‘].Value;
  24.         $filename = Join-Path $path ($i.ToString("0000") + "_" + $m.Groups[‚file‘].Value);
  25.         Write-Host "  Saving" $i.ToString("0000") -foregroundcolor "green";
  26.         $clnt.DownloadFile($pic, $filename);
  27.     }
  28.     else
  29.     {
  30.         $m = $errPattern.Match($html);
  31.         if ($m.Success)
  32.         {
  33.             Write-Host "  does not exist" -foregroundcolor "yellow";
  34.         }
  35.         else
  36.         {
  37.             Write-Host "  error" -foregroundcolor "red";
  38.             Add-Content "errors.txt" $i;
  39.         }
  40.     }
  41. }

Über uns Stefan

Polyglot Clean Code Developer

2 Kommentare

  1. Mhh… bei mir geht’s!?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax