Jag gör ett nytt försök även i detta forum! Det här kan väl inte vara så svårt? 1: Är det bara SAX indexet du är intresserad av eller hur man gör rent generellt? Om det är börskurser och sånt du är ute efter så kan jag rekommendera http://se.finance.yahoo.com/ där man kan hämta kurser etc i csv format. mycket enklare att hantera. Tack Arathorn! Det primära är hur man hämtar info från en specifik plats på en hemsida. Det var därför jag tog ett exempel enligt #0. Jag måste läsa på för att förstå din kod Arathorn. Jag vet inte om det är det som sker. Skulle vara bra ifall någon kunde lösa det exemplet som jag tog upp. ok, jag skulle nog ha kommenterat lite mer... Nytt försök, då mitt gamla försvann ? Ola, Jag har talat med Johan och hans förslag börjar klarna för mig. Men mickes förslag skulle jag också gärna vilja förstå och få att fungera. När man är nybörjare så är, som jag ser det, ett fungerande exempel det som krävs för att man ska kunna förstå koden. Vad jag kan se är mickes kod ett förslag men inte ett fungerande exempel. Skulle vilja att micke (eller någon annan) ger ett exempel med förklarande text. Det är väl det som saknas tycker jag innan jag stänger den här tråden. Ola, Kommentar: Tack Andreas och Onkelborg! Ola, Tack för svaret Andreas. Ola, OK, jag förstår. Jag försöker hämta hem data från Stockholmsbörsen men det går inte att läsa deras sida. Har försökt med ett par olika metoder men det lyckas inte. Att läsa t ex aftonbladet.se fungerar men inte: http://www.stockholmsborsen.se/index.asp Som jag beskrev via imail så måste du nog ansluta genom en socket och skicka samt ta emot datat den vägen för att det ska fungera med den servern...MSHTML
Jag tänkte jag skulle göra ett litet program i VB.net som hämtar data regelbundet t ex en gång/ minut från en speciell hemsida. I det här fallet tänkte jag hämta kursen för SAX indexet som finns till höger hos www.nordnet.nu. Hur gör man det? Det lär finnas bra sätt genom att använda MSHTML.
Skulle bli överlycklig om någon kunde få ihop ett program där jag kan se hur man gör.
Mvh Ola Sv: MSHTML
2: Mitt förslag är att du tittar på System.Net.WebRequest och System.Net.Webresponse klasserna.
<code>
Private Function GetSAX() As Double
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US")
Dim url As String = "http://se.finance.yahoo.com/d/quotes.csv?s=^SXAXPI&f=sl1d1t1c1ohgv&e=.csv"
Dim objRequest As WebRequest = WebRequest.Create(url)
Dim objResponse As WebResponse = objRequest.GetResponse()
Dim oSR As StreamReader = New StreamReader (objResponse.GetResponseStream())
Dim strContent As String = oSR.ReadToEnd()
Dim things As String = strContent.Split(New Char() {","C})
If things.Length = 9 Then
Return Double.Parse(things(1))
Else
Return -1
End If
End Function
</code>
Sen en som jag bjuder på... hur man hämtar en aktiekurs (kolla tickers på yahoo men oftast är det vanligar tickern fast med .ST i slutet. Ericsson B blir t.ex. ERICb.ST
<code>
Public Sub GetQuote(ByVal ticker As String)
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US")
Dim url As String = "http://se.finance.yahoo.com/d/quotes.csv?s=" + ticker + "&m=ST&f=sl1d1t1c1ohgv&e=.csv"
Dim objRequest As WebRequest = WebRequest.Create(url)
Dim objResponse As WebResponse = objRequest.GetResponse()
Dim oSR As StreamReader = New StreamReader (objResponse.GetResponseStream())
Dim strContent As String = oSR.ReadToEnd()
Dim things As String = strContent.Split(New Char() {","C})
If things.Length = 9 AndAlso things(0) = ticker Then
Try
Dim latest As Double = Double.Parse(things(1))
Dim date As DateTime = DateTime.Parse(things(2) + " " + things(3))
Dim increaseToday As Double = Double.Parse(things(4))
Dim buy As Double = Double.Parse(things(5))
Dim lowest As Double = Double.Parse(things(6))
Dim highest As Double = Double.Parse(things(7))
Dim volatility As Double = Double.Parse(things(8))
'här kan du använda variablerna till vad du tycker är lämpligt
Catch e As Exception
End Try
End If
End Sub
</code>
Glöm inte importera System.Threading, System.Net.
Mina erfarenheter av mshtml och .net är inte de bästa, dessutom finns väl allt i frameworket så länge du inte vill visa html sidorna grafiskt...Sv: MSHTML
Jo, det är rent generellt hur man gör. Jag ska studera dina förslag i helgen.
mvh OlaSv: MSHTML
mvh OlaSv: MSHTML
WebRequest.Create(url)'skapar en förfrågan till en webplats kan ju vara vilken som helst
Dim objRequest As WebRequest =
objRequest.GetResponse() 'hämtar svaret som servern skickar tillbaka
New StreamReader (objResponse.GetResponseStream()) 'skapar en ström så att vi lättare kan läsa innehållet
Dim strContent As String = oSR.ReadToEnd() 'stoppar in innehållet i en sträng.
Om du hade hämtat en vanlig hemsida har du alltså fått all html-kod i strContent. I mitt exempel råkar det ju vara en komma sepererad "fil" som kommer tillbaka. jag skall se om jag kan skriva ihop nåt som exakt hämtar ut det från nordnet men i praktiken så måste du ju leta rätt på den html-tagg där informationen ligger och extrakta den... problemet är ju att ta sig till rätt tagg.
EDIT: så här skulle det kunna se ut:
<code>
Private Function GetSAX() As Double
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US")
Dim url As String = "http://www.nordnet.se"
Dim objRequest As WebRequest = WebRequest.Create(url)
Dim objResponse As WebResponse = objRequest.GetResponse()
Dim oSR As StreamReader = New StreamReader (objResponse.GetResponseStream())
Dim strContent As String = oSR.ReadToEnd()
'odynamisk lösning som kräver att sidan inte ändrar på sig...
Dim pos As Integer = strContent.IndexOf("alt=""SAX""") 'hitta taggen ovanför sax-td
If pos > -1 Then
'OBS ingen error hantering... egentligen borde man kolla att all info är rätt och att pos inte är -1
pos = strContent.IndexOf("<td", pos) 'hämta positionen för nästa tagg...
pos = strContent.IndexOf(">", pos) 'hämta slutet på taggen
Dim end As Integer = strContent.IndexOf("<", pos += 1) 'hämta positionen för nästa tagg
Dim sax As String = strContent.Substring(pos, end - pos) 'hämta det mellan taggarna
sax = System.Web.HttpUtility.HtmlDecode(sax) 'städa html
Return Double.Parse(sax.Trim()) 'parsa till en double
Else
Return -1
End If
End Function
</code>Sv: MSHTML
<code>
Imports System.Net
Imports System.Text
Sub ScreenScrape(ByVal strURL As String, ByVal strFilename As String)
Dim objWebClient As New WebClient()
Dim objUTF8 As New UTF8Encoding()
Dim strScrape As String
strScrape = objUTF8.GetString(objWebClient.DownloadData(strURL))
Dim objReader = New System.IO.StreamWriter(strFilename)
objReader.Write(strScrape)
objReader.Close()
End Sub
</code>
Sök på nätet efter screenscraping
/mickeSv: MSHTML
Löste ditt problem sig eller behöver du mer hjälp? Om du är klar med detta problemet så markera inlägget som antingen löst (om du hittat en lösning - skriva gärna vad den var så andra kan ta del av både fråga och svar) eller stängd (om du inte hittat en lösning men problemet inte är aktuellt längre).
Om du inte löst problemet och vill ha mer hjälp så skriv ett inlägg som beskriver var du står idag med problemet (vad du har provat etc) så skall vi se om vi inte kan hitta en lösning.
//AndreasSv: MSHTML
Mvh OlaSv: MSHTML
Då ger vi det ett försök. Marcus lösning skiljer sig lite från Johans exempel då det visar hur man laddar ner innehållet på en webbsida till en fil. Denna fil kan du se använda för att söka efter specifik information. Johans exempel visade hur man sökte information också - utan att spara hela webbsidan. Jag ger en detaljerad beskrivning på vad Marcus gör så det inte blir några missförstånd.
Imports System.Net
Imports System.Text
Importera de namnrymder som vi kommer att behöva. Ur <b>System.Net</b> kommer vi att använda <b>WebClient</b> klassen och ut <b>System.Text</b> kommer vi att använda <b>UTF8Encoding</b> klassen.
Sub ScreenScrape(ByVal strURL As String, ByVal strFilename As String)
Skapa den funktion som vi anropar för att ladda ner webbsidan som anges av <b>strURL</b> variablen och som skall sparas i filen med namnet som anges av <b>strFilename</b> variablen.
Dim objWebClient As New WebClient()
Skapa ett WebClient objekt som vi kommer att använda för att ladda ner den angivna webbsidans innehåll (HTML kod).
Dim objUTF8 As New UTF8Encoding()
Skapa ett UTF8Encoding objekt som kommer användas för att se till att vi kan konvertera innehållet från webbsidan till en sträng med rätt teckenuppsättning.
Dim strScrape As String
Skapa en strängvariabel som vi kommer lagra webbsidans innehåll i.
strScrape = objUTF8.GetString(objWebClient.DownloadData(strURL))
Här händer ett par olika saker. Först laddas webbsidans innehåll ner med <b>DownloadData</b> metoden. Denna metod returnerar en byte-array som skickas vidare till <b>GetString</b> metoden som omvlandar den till en sträng med rätt teckenuppsättning. Slutligen sparas strängen i vår strängvariabel <b>strScrape</b>
Dim objReader = New System.IO.StreamWriter(strFilename)
Skapa en StreamWriter som gör att vi kan skriva innehåll ner till en fil med det angivna namnet.
objReader.Write(strScrape)
Skriv ut webbsidans innehåll (som lagrad i vår variabel) till filen.
objReader.Close()
Stäng filen.
End Sub
Avsluta funktionen.
//Andreas
Sv: MSHTML
<code>
Dim objUTF8 As New UTF8Encoding()
</code>
Det där är riktigt lyxigt ;) Jag skulle förslå att man kör följande:
<code>
Dim objUTF8 As UTF8Encoding
objUTF8 = UTF8Encoding.UTF8
</code>
så att om man skulle köra det här flera gånger så behöver man inte köra skapa en ny UTF8-encoding hela tiden; istället skapas den en gång och "slängs" in i en static variable. Enda nackdelen är lite minne blir "låst", men det kan ge lite högre prestanda.Sv: MSHTML
En liten fråga bara.
Om man tänker sig att man har en Web sida som ger realtidskurs för t ex, Ericsson, en för Nokia osv. för låt oss säga 100 aktier. Är det då rimligt att tänka sig att använda denna metod för att läsa av kurserna för samtliga dessa, kanske en gång i sekunden?
mvh OlaSv: MSHTML
Visst är det det om du inte kan hitta någon WebService som ervbjuder dig att läsa av denna information på ett enklare sätt. Du kanske skulle kunna använda dig av http://www.webservicex.net/WS/WSDetails.aspx?CATID=2&WSID=9 för att hämta det? Om du skall göra det själv så tänk på att du skall be ägaren av sidan som du hämtar information ifrån om tillåtelse pga av två anledningar.
(1) Materialet är upphovsrättsskyddat om det inte utryckligen står att det inte är det
(2) Det kan se lite underligt ut i deras loggar om de får en request tillsamma sida varje minut. De kan blockera dig, anmäla dig etc om de misstänker att du försöker göra något dumt (dåligt försökt till DoS attack eller vad som helst).
//AndreasSv: MSHTML
Eftersom du pekar på att det kan bli problem så är det lika bra att tala med dem alt. köpa informationen på något vis. Jag visste inte att det var så. Kan det vara olagligt att läsa info. från en sida med ett egenutvecklat program på samma sätt som explorer läser samma ínfo? Lite konstigt tycker jag. Så det var bra att du pekade på det problemet.
mvh OlaSv: MSHTML
Visst är det inte olagligt att läsa informatione, men att läsa information från sidan och sen bearbetat och återanvända den kan lämna lite att fundera på. De lägger troligen ner mycket arbete på att sammanställa korrekt och aktuell information och du skulle isf ta och använda resultatet av detta för att gynna dig själv. Det är där det börjar bli klurigt, om jag inte minns fel så hade BJ (medlem här på pellesoft) samma bekymmer för något år sedan då han hämtade väderinformation från SMHI och använde det i sitt program.
Du skulle kanske kunna använda den WebService som jag pekade dig till? De har granaterat avtal med stället de hämtar information ifrån och du får använda deras WebService utan kostnad (har jag för mig).
//AndreasSv: MSHTML
Ska undersöka om det går att använda ditt tips. Informationen måste vara i realtid. Det är det viktigaste. Jag ska se vad det finns för leverantörer som säljer sådan info.
//OlaSv: MSHTML
Har någon en förklaring och/eller en lösning på detta problem. Jag står bara och stampar nu. Måste lösa detta för att komma vidare.
mvh OlaSv: MSHTML
Mvh,
Thomas