C# tekst van een website krijgen

Status
Niet open voor verdere reacties.
de source van de website. In de browser van VS kan ik de site ook niet goed openen, dan komt er gewoon het logo van de site te staan en veder een donkerblauw scherm

nu kan ik de site ook in google chrome niet meer openen , dat kon eerst nog wel
 
Laatst bewerkt:
Voordat de site offline was werd de source ook al niet goed gedownload. Dus het lag niet daaraan

Eerst kon ik de site wel nog gewoon zien in de browser van VS (de site werd wel niet goed weergegeven, alleen een donkerblauw scherm en een logo van de site). Nu kan ik de site helemaal niet meer openen

Als de site over een paar dagen het weer doet kun je zien wat ik bedoel
 
Laatst bewerkt:
En dan kan ik gewoon de data downloaden net zoals ik eerder heb gedaan? Of moet ik iets anders doen omdat het met JSON is
 
Ja, en nee

Als je nu de 'source' download krijg je dus die lap json die je ziet als je naar http://csgo-stats.com/han_tom/?ajax&_=1404672279845 gaat. Deze moet je parsen of deserializen naar een object (zie een aantal pagina's terug waar dat xml/json serializen ook van toepassing was).

(zelf gebruik ik JSON.NET nuget package)

Misschien moet je eens kijken hoe deze data wordt opgehaald, er is vast een steam API ofzo die je zelf ook zou kunnen gebruiken. Aan de hand van de username wordt dit opgehaald. Zie network traffic in browser, dan zie je wat er gebeurt als je naar de site gaat, zo kom ik ook aan de url).
 
Wat moet ik dan precies aan de code aan passen die ik normaal gesproken gebruik om data te downloaden?
 
Gewoon eens proberen ;)

Je zult zien dat het downloaden precies hetzelfde is, je krijgt dan gewoon de json data als string binnen zoals je normaal html krijgt.

Vanaf dit punt moet je even kijken hoe de json die je krijgt is opgebouwd, property name etc (zoals je met xml in een andere app hebt gedaan). Dan kun je de data parsen of (zoals ik zou doen) een class maken met properties zoals die in de json voorkomen en dan de json string deserializen. (dit concept werkt ongeveer zoals je met xml al hebt gedaan. Properties een attribute geven etc.)
 
Kan ik dit er nog wel voor gebruiken?

[CPP] var ProfileNode = SelectNode(doc.DocumentNode, "section", "id", "profile");

var PlayerNode = ProfileNode.Descendants("h1").First();
var Player = SelectContent(PlayerNode);
var LastSeenNode = SelectNode(ProfileNode, "div", "class", "status");
var LastSeen = SelectContent(LastSeenNode);

var StatsNode = SelectNode(doc.DocumentNode, "ul", "id", "stats-total");

var KillsNode = StatsNode.Descendants("em").First();
var Kills = SelectContent(KillsNode);
var TimeNode = StatsNode.Descendants("em").Skip(1).First();
var Time = SelectContent(TimeNode);
var kdratioNode = StatsNode.Descendants("em").Skip(2).First();
var kdratio = SelectContent(kdratioNode);
var HeadshotNode = StatsNode.Descendants("em").Skip(3).First();
var Headshot = SelectContent(HeadshotNode);
var AccuracyNode = StatsNode.Descendants("em").Skip(6).First();
var Accuracy = SelectContent(AccuracyNode);[/CPP]

Dit heb ik nu

[CPP]Info info = JsonConvert.DeserializeObject<Info>(source);[/CPP]
 
Laatst bewerkt:
Waarschijnlijk kun je dat straks gebruiken op de 'content' data van het json object want dat gedeelte is HTML.
Werkt DeserializeObject al? Hoe ziet je info class eruit?
 
[CPP]using System.Runtime.Serialization;

namespace CSGO_stats
{
[DataContract]
public class Info
{
[DataMember]
public string Player { get; set; }
[DataMember]
public string Lastseen { get; set; }
[DataMember]
public string Kills { get; set; }
[DataMember]
public string Time { get; set; }
[DataMember]
public string Kdratio { get; set; }
[DataMember]
public string Headshot { get; set; }
[DataMember]
public string Accuracy { get; set; }

public Info(string player, string lastseen, string kills, string time, string kd, string headshot, string accuracy)
{
Player = player;
Lastseen = lastseen;
Kills = kills;
Time = time;
Kdratio = kd;
Headshot = headshot;
Accuracy = accuracy;
}
}
}
[/CPP]

wat moet die deserializer doen?
 
Laatst bewerkt:
De deserializer maakt van het tekstbestand een object. (zoals je favoriten in de bier app)
(zie voorbeeldjes op website http://james.newtonking.com/json handig om even door te lezen wat json is en hoe het is opgebouwd)

Je kunt niet zomaar een Info class gebruiken om te deserializen want deze weet helemaal niet wat die moet doen en zal niets doen of een foutmelding geven.


Als je de json data bekijkt zie je voornamelijk 3 dingen; "meta", "profile" en "content".
De "meta" is weer een collectie van wat andere data, "profile" is dit ook en "content" is gewoon een string met html.

Dus als we met het eenvoudige beginnen krijg je:

[CPP]public class StatisticsJsonObject
{
[JsonProperty("content")]
public string Content { get; set; }
}[/CPP]

De string value in [JsonProperty("content")] komt overeen met die in de data, dus dan weet de deserializer wat je wilt hebben.


Dit is al voldoende om de html content uit de json data te halen met de simpele methodes die je al eerder hebt gebruikt:
[CPP]
private async Task DownloadAsync()
{
using (var filter = new HttpBaseProtocolFilter())
{
using (var client = new HttpClient(filter))
{
var json = await client.GetStringAsync(new Uri("http://csgo-stats.com/han_tom/?ajax&_=1404672279845"));
var statistics = JsonConvert.DeserializeObject<StatisticsJsonObject>(json);

var source = statistics.Content;


}
}
}[/CPP]


Vanuit hier kun je de source weer in een htmldocument laden en data parsen.
 
Als ik op internet de pagina bezoek dan staan er nog oude statistieken en dan moet de pagina nog even updaten, in de app download ie de oude statistieken voordat ze upgedate zijn. Dus dan moet je eerst naar de site gaan om de statistieken te updaten om de goede statistieken te downloaden in de app. Hoe kan ik dat oplossen?
 
Even naar het netwerk verkeer kijken als je op de knop drukt, dan zal het waarschijnlijk eenvoudig een GET of POST op een bepaalde url zijn.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan