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
Und ist wie gesagt nur ein Test
Mit nicht allzu viel Verwirrung entsteht entfernt, siehe meine spaeteren Beitraege.
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
Joa, habe es jetzt um zirka 99% verschnellert - Ist aber irgendwie immer noch sehr lahm
(4-5 Sek pro Link
) 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
) oder auch in PHP.
Soweit ich gesehen habe gibt es in diesem Programm keinen Webrequest
Es nimmt nur eine Liste von URLs zu DeviantArt entgegen und nimmt diese auseinander.
Das es C# ist kann auch gut sein
Deswegen ließ sich das Ding mit Java net kompilieren
Also gleich mal die Express runterladen (weil C# kann ich
)
URLs
Pro URL eine Zeile
Und sobald man convert eingibt gehts los.
Lazy du hast es fast erfasst
Statt HTML Quellcode läuft aber da nur eine URL rein
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
Gruß
Saij
(Hab nur die ersten 2-3 Beiträge nachher gelesen, also bitte nicht hauen falls etwas dazwischen gekommen ist
)
Der Quellcode ist schon längst veraltet
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 Deswegen ließ sich das Ding mit Java net kompilieren
, bei mir läuft es auch in Java.
Nur hab ich erstens kein Plan was er jetzt einlesen will.
Getestet mit :
http://meatshop-tattoo.deviantart.com/art/The-tree-of-paradise-349712369
Und das stimmt mit dem Code nicht überein!
String autor = s.split("_by_")[1].split("-")[0];
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
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
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
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
!
Ächz.. Endlich ist es auf GitHub 'drauf
..
*Klick mich*
Sorry für die späte Meldung, früher war ich jedoch nicht an diesem PC.