Erster Webcrawler versuch..:/

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Bobo2040

Betreff: Erster Webcrawler versuch..:/

BeitragDo, Mai 08, 2014 14:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi
war eine Zeit lang Inaktiv wegen Präsentationen und sowas (10. Klasse ^-^)

So und da wollte ich mal nen kleinen Webcrawler basteln aber er verbindet sich leider nicht zu Websites denke es liegt am TcpOpenStream() befehl das ich da irgendwas falsch gemacht habe oder sowas...

Ihr könnt mir auch Tipps geben was ich besser machen kann Smile oder was Fehler verursacht oder so ^-^

BlitzBasic: [AUSKLAPPEN]

Type Link
Field ID
Field LinkName$
End Type

Type PageRank
Field Link$
Field Counter
End Type

Type WaitLinks
Field ID
Field LinkName$
End Type

Global NewPosition=0
Global LookUp=0


WaitLinks.WaitLinks=New WaitLinks
WaitLinks\ID=1
WaitLinks\LinkName$="bing"


Print "Suche gestartet.."

StartCrawling(80) ;Start Suche Funktion

Print "Suche beendet.."

DeleteBadLinks(15) ;Schlechte Links löschen

Print "Link Infos werden geladen.."

LinkInfo()

Print "Danke das du unseren Service benutzt! ByeBye"
Delay 4096
WaitKey
End


Function CheckLink(Txt$)
Local Start$="www."
Local Ende$=".com"
Local Links$
Local Counter=0
Local FoundLinks=0

If Instr(Txt$,Start$) Then
Repeat
Print Txt$
Position1=Instr(Txt$,Start$,NewPosition)
Position2=Instr(Txt$,Ende$,Position1)
NewPosition=Position2
Links$=Left(Txt$,Position2-1)
Links$=Mid(Links$,Position1+Len(Start$))
;Print Links$

For Link.Link=Each Link

If Link\LinkName$=Links$ Then
For PageRank.PageRank=Each PageRank
If PageRank\Link$=Links$ Then
PageRank\Counter=PageRank\Counter+1
EndIf
Next
Counter=Counter+1
LinkCounter=LinkCounter+1
EndIf

Next

If Counter=0 Then
If Len(Links$)<30 Then
Link.Link=New Link
Link\ID=LinkCounter+1
Link\LinkName=Links$

PageRank.PageRank=New PageRank
PageRank\Link=Links$
PageRank\Counter=1

WaitLinks.WaitLinks=New WaitLinks
WaitLinks\LinkName$=Links$
WaitLinks\ID=1

Print "Neuer Eintrag | " + Link\LinkName + " | " + PageRank\Counter + " | " + CurrentTime$() + " |"
FoundLinks=FoundLinks+1
EndIf
EndIf

Counter=0
LinkCounter=0
If Position2>Len(Txt$) Then
LookUp=1
Print "Suche beendet.."
ElseIf FoundLinks>=50 Then
LookUp=1
Print "Suche beendet.."
EndIf
Until LookUp=1

Else

EndIf

;Print Link$
End Function

Function LinkInfo()
Graphics 640,480,32,2
SetBuffer BackBuffer()

Cls

Color 100,255,50
Text 5,5,"Links im Archiv:", False, False
Color 30,255,50

Count=20

For Link.Link=Each Link
Text 5,Count,Link\LinkName$,False,False
Count=Count+15
Next

Color 255,100,50
Text GraphicsWidth()/2+5,5,"Page Ranking:", False, False
Color 255,30,50

Count=20

For PageRank.PageRank=Each PageRank
Text GraphicsWidth()/2+5,Count,PageRank\Counter + " | " + PageRank\Link$, False, False
Count=Count+15
Next

Flip 0


End Function

Function DeleteBadLinks(MaxLinkLength)
;Löscht schlechte Links ( Len >= 20 )
For Link.Link=Each Link
If Len(Link\LinkName$)>MaxLinkLength Then
Delete Link
Count=Count+1
ElseIf Instr(Link\LinkName$,"www.") Then
Delete Link
Count=Count+1
EndIf
Next

For PageRank.PageRank=Each PageRank
If Len(PageRank\Link$)>MaxLinkLength Then
Delete PageRank
EndIf
Next

If Count=0 Then
Print "Keine schlechten Links geloescht!"
Else
Print Count + " schlechten Links geloescht!"
EndIf

End Function

Function StartCrawling(Port)
Local Txt$
For WaitLinks.WaitLinks=Each WaitLinks
LookUp=0
Position1=0
Position2=0
NewPosition=0
FoundLinks=0

tcpstream=OpenTCPStream("www." + WaitLinks\LinkName$ + ".de",Port)

If tcpstream Then
Print "Verbinde zu http://" + WaitLinks\LinkName$ + ".de .."
WriteLine tcpstream,"GET http://www." + WaitLinks\LinkName$ + ".de HTTP/1.0"
WriteLine tcpstream,"Host: localhost"
WriteLine tcpstream,"Connection: Keep-Alive"
WriteLine tcpstream,Chr$(10)

Txt$=""

While Not Eof(tcpstream)

If ReadByte(tcpstream) Then
trash=ReadByte(tcpstream)
Print trash
EndIf
;Print Txt$=ReadLine(tcpstream)
CheckLink(ReadLine$(tcpstream))

Wend

Else
CloseTCPStream(tcpstream)
Print "Verbindung zu http://www." + WaitLinks\LinkName$ + ".de fehlgeschlagen!"
EndIf
CloseTCPStream(tcpstream)

Next
End Function

So ich habe jetzt ein wenig mit rumgespielt Very Happy und es geht wenn in HTTP/1.0 benutze Smile aber warum weiß ich auch nicht xD Wenn ich mit zu bing.de Verbinde, dann steht dort wenn ich es Printe
"cation: http://www.bing.com/ nochwas..." was bedeutet das ? was mache ich falsch? wenn ich mich zu google oder youtube verbinde lädt er permanent die CSS Styles Smile

Mfg

Mfg
  • Zuletzt bearbeitet von Bobo2040 am Do, Mai 08, 2014 14:44, insgesamt einmal bearbeitet

Eingeproggt

BeitragDo, Mai 08, 2014 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Das liegt an mehreren Dingen...

Code: [AUSKLAPPEN]
tcpstream=OpenTCPStream("http://www." + WaitLinks\LinkName$ + ".de",Port)

      If tcpstream Then
         Print "Verbinde zu http://" + WaitLinks\LinkName$ + ".de .."
         WriteLine tcpstream,"GET / HTTP/1.1"
         WriteLine tcpstream,"Host: localhost"
         WriteLine tcpstream,"Connection: Keep-Alive"
         WriteLine tcpstream,""


Zuerst mal, der Port kann durchaus ein Problem machen. http-Anfragen gehen stets über Port 80.
Dann musst du beim Aufbau eines TCP-Streams nur den Server angeben, zB www.blitzforum.de. Kein protokoll (wie hier http://) und keine sonstige Seiten-Anfrage (LinkName$ könnte ja auch sowas wie .../index.php sein. Das gehört dann im GET geschrieben.)
Und zu guter letzt ist "Host: localhost" falsch. Für den Host musst du den Server angeben, zu dem du dich vorher bei OpenTCPStream verbunden hast.

In Summe würde ich raten, die Trennung zwischen TCP und HTTP nochmal genau anzuschauen (Wikipedia-Artikel reicht vollkommen Wink )

mfG, Christoph
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

Bobo2040

BeitragDo, Mai 08, 2014 14:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay danke Smile
ja Funktioniert jetzt auch mit HTTP/1.1 Smile
so wenn ich einen User-Agent dazumache werde ich von manchen Seiten geblockt > youtube.com
Dann steht da was von XSS-Protection: mode=1; blocked=1; oder sowas Smile

Und zum abschnitt mit den Instr() Mid() Left() Funktionen habe ich auch irgendwo was falsch aber ich komme nicht drauf...kann sich das jemand angucken ? Ansatz würde mir reichen Smile

und wenn ich mit zu bing.com Verbinde steht dort:
caution: www.bing.com/nochwas in der Console wenn ich die Readline() Strings ausgebe :/ was bedeutet das ? Wie muss ich meinen User-Agent wählen ? Dachte an den Agent vom Google Bot aber das ist Illegal oder ? :'DDD

Mfg

ZEVS

BeitragDo, Mai 08, 2014 14:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
WriteLine tcpstream,"GET http://www." + WaitLinks\LinkName$ + ".de HTTP/1.0"
WriteLine tcpstream,"Host: localhost"

Bei GET schreibst du den relativen Pfad ab dem Host-Namen hin. Bei Host den Namen des Hosts, an den du sendest. Wenn du z.B. diesen Thread anzeigen lassen willst, geht mit diesem Code: [AUSKLAPPEN]
GET /forum/viewtopic.php?t=40014 HTTP/1.0
Host: www.blitzforum.de
User-Agent: WasAuchImmer
Connection: close


Wenn du vorhast, die Verbindung sofort zu schließen, sende lieber Connection: close.

ZEVS
 

Bobo2040

BeitragDo, Mai 08, 2014 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay danke Very Happy
Aber aus irgendeinem Grund hört er nach dem
</head> Tag auf zu "Downloaden" kann es sein das er nur 512bytes oder 1kb "runterladen" kann ?
Weil das bei jeder seite ist.. bei google lädt er nur das CSS und dann fängt er wieder von vorne an das macht der Permanent...bei BlitzForum auch hier der Code :
BlitzBasic: [AUSKLAPPEN]

WriteLine tcpstream,"GET /forum/viewtopic.php?p=413088 HTTP/1.0"
WriteLine tcpstream,"Host: www." + WaitLinks\LinkName$ + ".de"
WriteLine tcpstream,"User-Agent: bbWebCrawler"
WriteLine tcpstream,"Connection: close"
WriteLine tcpstream,Chr$(10)


Hoffe mir kann jemand weiter helfen...
und was bedeutet nun dieses "caution: [WebsiteUrl]" ? caution heißt ja Achtung / Vorsicht...
aber aus irgendeinem Grund weiß ich nicht was damit gemeint ist xD
Will ja schließlich was lernen Very Happy

Mfg

Eingeproggt

BeitragDo, Mai 08, 2014 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
If ReadByte(tcpstream) Then
   trash=ReadByte(tcpstream)

Auch wenn das nur "trash" ist (eigentlich die Header-Infos.... Die durchaus nützlich sein können, wenn sie nicht mit "200 OK" anfangen -> Wikipedia mal wieder!)
... so liest du mit diesem Code 2 Bytes auf einmal aus. Und damit "überspringst" du irgendwas.

Außerdem schließt du im Fehlerfall die TCP-Verbindung doppelt, was beim 2. mal zu einem Fehler führt (glaube ich).

Nur so, was mir an deinem neuen Code aufgefallen ist. Zu deinem "caution" vermute ich mal, dass da noch mehr kommen würde, wenn du alles sauber ausliest. Dazu empfehle ich, erstens die Header zu beachten wie anfangs erwähnt (und zB "Bad Request"-Fehler zu entdecken.) und dann nach den Headern auf eine Leerzeile zu warten (bzw. einem Chr(10)). Danach alles auszulesen bis zum Eof. Halt wie das http-Protokoll aufgebaut is, damit muss man sich leider (gottseidank ^^) auseinander setzen Wink

mfG, Christoph
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group