Bronies.de

Normale Version: Auslesen und splitten von Strings verschnellern?
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Guten Abend!

Wie kann man auslesen von Quellcode einer Internet-Seite, Splitten von Strings, und all das Zeugs verschnellern?
Ich habe ein kleines Programm geschrieben, welches Deviantart Links konvertiert, allerdings dauert das berechnen pro Bild fast bis zu 5Sekunden.. -.-
Quellcode:
Bitte nicht für den Code hauen, ich weiß selbst dass es schlecht geschrieben ist RD laugh Und ist wie gesagt nur ein Test FS grins
Spoiler (Öffnen)

Ich versteh einfach nicht, wieso es solange dauert...

MfG
Bist du bisher alleine weiter gekommen?
Ansonsten schau ich mir das morgen mal an und versuche dir zu helfen, sofern ich da überhaupt ne Hilfe bin RD salute
Joa, habe es jetzt um zirka 99% verschnellert - Ist aber irgendwie immer noch sehr lahm RD laugh (4-5 Sek pro Link Twilight: No, Really? ) Liegt aber wahrscheinlich an meiner Internet-Verbindung, keine Ahnung wieso. Bzw, der Code da oben trifft schon lange nicht mehr zu ^^ Kann danach ja den richtigen posten.
Ich würde statt einem Split das ganze mal mit Regular Expressions versuchen.

Code:
/_by_(.*?)-(.*?)\./

In Capture Group 1 ist der Autor und in Capture Group 2 die ID des Bildes.

Geb keine Garantie das der Regexp so funktioniert. Hab ihn eben ausm Kopf raus geschrieben.
Auf alle Fälle sollte die Rechenzeit damit um einiges schneller geworden sein.

Kann nachher gerne auch mal versuchen das ganze in Perl abzubilden (Kann kein Java so direkt Twilight happy) oder auch in PHP.
Deadend
Soweit ich gesehen habe gibt es in diesem Programm keinen Webrequest Twilight happy
Es nimmt nur eine Liste von URLs zu DeviantArt entgegen und nimmt diese auseinander.

Das es C# ist kann auch gut sein Twilight happy Deswegen ließ sich das Ding mit Java net kompilieren Twilight happy
Also gleich mal die Express runterladen (weil C# kann ich Twilight happy)
Deadend
URLs
Pro URL eine Zeile
Und sobald man convert eingibt gehts los.
Deadend
Lazy du hast es fast erfasst Twilight happy
Statt HTML Quellcode läuft aber da nur eine URL rein Twilight happy
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Collections;
using System.Net;
using System.IO;

namespace DeviantLinker
{
    class Program
    {
        protected List<string> _urlList = new List<string>();

        static void Main(string[] args)
        {
            Program self = new Program();
            self.run();
        }

        public void run()
        {
            while (this._printMenu() != 0)
            {
                Console.WriteLine("Processing URLs...");
                Console.WriteLine("");

                foreach (string url in this._urlList)
                {
                    this._processUrl(url);
                }

                this._urlList.Clear();

                Console.WriteLine("");
                Console.WriteLine("");
            }

            Console.WriteLine("Exiting");
        }

        protected bool _isUrl(string url)
        {
            Uri result;
            Regex regexpDeviantCheck = new Regex("\\.deviantart\\.net", RegexOptions.Compiled | RegexOptions.IgnoreCase);
            
            if (Uri.TryCreate(url, UriKind.Absolute, out result))
            {
                return regexpDeviantCheck.IsMatch(url);
            }

            return false;
        }

        protected string _getTitle(string url)
        {
            byte[] buf = new byte[8192];
            string siteCode = "";
            WebRequest request = WebRequest.Create(url);
            WebResponse response = request.GetResponse();
            Stream resStream = response.GetResponseStream();
            Regex regexObj = new Regex("<title>(.*) by (.*?)</title>", RegexOptions.Compiled | RegexOptions.IgnoreCase);

            string tempString = null;
            int count = 0;

            do
            {
                count = resStream.Read(buf, 0, buf.Length);

                if (count != 0)
                {
                    tempString = Encoding.ASCII.GetString(buf, 0, count);
                    siteCode += tempString;

                    if (regexObj.IsMatch(siteCode))
                    {
                        return regexObj.Match(siteCode).Groups[1].Value;
                    }
                }
            }
            while (count > 0);

            return "";
        }

        protected void _processUrl(string url)
        {
            Regex regexObj = new Regex(@"http://(.*)/(.*?)_by_(.*?)-(.*?)\.(.*)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
            Match matches = regexObj.Match(url);

            string autor = matches.Groups[3].Value;
            string id = matches.Groups[4].Value;
            string link = "http://fav.me/" + id;

            string code = "[spoiler=" + this._getTitle(link) + "]\n";
            code += "[img]" + url + "[/img]\n";
            code += "[url=" + link + "]Source[/url]\n";
            code += "By [url=http://" + autor + ".deviantart.com]" + autor + "[/url]\n";
            code += "[/spoiler]";

            Console.WriteLine(code);

            // Sleep a second cause we won't get locked out of deviantart
            System.Threading.Thread.Sleep(1000);
        }

        protected int _printMenu()
        {
            string input;

            Console.WriteLine("DeviantArt URL to Bronies.de Converter");
            Console.WriteLine("======================================");
            Console.WriteLine("");
            Console.WriteLine("Enter a valid DeviantArt URL or any of the following numbers.");
            Console.WriteLine("(1) Convert the given URLs to Bronies.de BBCode");
            Console.WriteLine("(2) Clear the already given URLs");
            Console.WriteLine("(X) Exit the program");

            while (true)
            {
                Console.WriteLine("->");
                input = Console.ReadLine();

                // Exit the program
                if (input.Equals("x", StringComparison.OrdinalIgnoreCase))
                {
                    return 0;
                }
                
                // Convert the URLs
                if (input.Equals("1", StringComparison.OrdinalIgnoreCase))
                {
                    return 1;
                }

                // Clear the list
                if (input.Equals("2", StringComparison.OrdinalIgnoreCase))
                {
                    this._urlList.Clear();
                }

                // This must be an URL
                if (input.Length > 0)
                {
                    if (this._isUrl(input))
                    {
                        this._urlList.Add(input);
                        Console.WriteLine("OK");
                    }
                    else
                    {
                        Console.WriteLine("Not an URL!");
                    }
                }
            }
        }
    }
}

Das ganze mal in C# mit Regular Expressions gebaut.

Btw sorry Lazy, in dem Code ist doch ein WebRequest drinne. Nämlich da wo der Titel geholt wird.
Deswegen wird man es nie unter 5 Sekunden pro URL bekommen können. DeviantArt braucht da schon ne Weile um nen Response zu schicken. Und die Sekunde Pause nach dem Verarbeiten der URL sollte man auch drinne haben damit man keinen Flood fährt.

Soviel dazu Twilight happy
Gruß
Saij
(Hab nur die ersten 2-3 Beiträge nachher gelesen, also bitte nicht hauen falls etwas dazwischen gekommen ist Tongue)

Der Quellcode ist schon längst veraltet Tongue Der richtige kommt wie gesagt wenn ich am PC bin; Denn den ich da oben gepostet hatte war nur ein 5Minuten-Test. Auch an dem "richtigem" Code habe ich nicht lange gearbeitet, dazu fehlt mir die Zeit, aber er ist doch etwas ausgereifter als dieser hier.
(21.01.2013)Lazy Dream schrieb: [ -> ]Das sieht mir eher nach C# aus.

(21.01.2013)Saij schrieb: [ -> ]Das es C# ist kann auch gut sein Twilight happy Deswegen ließ sich das Ding mit Java net kompilieren Twilight happy

AJ hmm, bei mir läuft es auch in Java.

Nur hab ich erstens kein Plan was er jetzt einlesen will.
Getestet mit :
Spoiler (Öffnen)

Und das stimmt mit dem Code nicht überein!
Spoiler (Öffnen)
Schließlich erwartet er mindestens zweimal den String "_by_".
Er will die Grafik URL haben. Nicht die eigentlich URL zu der Seite.
(21.01.2013)Saij schrieb: [ -> ]Er will die Grafik URL haben. Nicht die eigentlich URL zu der Seite.

Hab ich grade auch gemerkt Twilight: No, Really?
Twilight happy

Habs getestet und es läuft in 1,145466205 Sekunden. (3000 DSL)
Optimierung würde eben Threading bringen, aber das halt nur bei mehreren Links.
Ich schätze es liegt an deiner Internetverbindung.

[EDIT]
http://zoranphoto.deviantart.com/art/Sleepy-heads-349713697
Hier stimmt die Bild URL nicht mit seinem Muster überein.
Oder irre ich mich?
@Jaco Du irrst nicht Twilight happy Jedoch haben alle "neueren" Bilder das richtige Format. Mit meinen jetzigem Code ist so eine URL aber auch nicht weiterhin tragisch; Ich kann entweder
- Nichts machen (Oder ne Fehlermeldung auswerfen)
- Oder mein Programm so umstellen, dass es nicht den BildLink sondern den "Deviation" Link erfordert. Also den Link, der mit dem altem Code aus der URL ausgelesen wurde. Wie gesagt war das oben nur ein Test Tongue Mein jetziger Versuch ist auch nicht so viel besser, und ich werde in naechster Zeit auch nicht dazu kommen weiterzuarbeiten, jedoch koennte ich den Code heute Abend, falls ich Zeit habe, posten.



Edit: Was zum.. 1,5 Sekunden ?! Dabn liegts wirklich an meiner Leitung RD laugh!
Ächz.. Endlich ist es auf GitHub 'drauf Twilight: No, Really?..
*Klick mich*
Sorry für die späte Meldung, früher war ich jedoch nicht an diesem PC.