Seite 1 von 1

frage zu einem timeout

Verfasst: Dienstag 13. Dezember 2005, 13:06
von Grammi
hallo,

ich habe vor eine kleine suchmaschine zu schreiben. nun möchte ich von einer start-url ausgehend alle links herausfiltern und in einer liste speichern. anschließend schreibe ich die url als key und die liste der links als value in ein dictionary. anschließend möchte ich wiederum das gleiche machen indem ich die liste im dictinary durchlaufe und auch wieder eine liste aler links erstelle und alles wieder im dictionary speicher. nun besteht aber das problem, dass wenn einige links nicht mehr aktuell sind die verbindung nicht hergestellt werden kann und das erstellen des dictionarys abgebrochen wird. nun müsste man ja irgendwie einen timeout einbauen, damit diese nicht zu erreichenden links nach einer bestimmten zeit übersprungen werden. ich hoffe ihr wisst was ich meine. könnt ihr mir vielleicht einen tipp geben oder mich in dieser hinsicht beraten, wie ich das problem lösen kann? Danke.

Achso hier erstmal mein Code:

Code: Alles auswählen

import re
import urllib
import urlparse
#import socket

zahl = 0
wort = raw_input("Suche nach: ")
url='http://www.chip.de'
text=urllib.urlopen(url).read()
liste = re.findall('<a.*?href="(.*?)".*?>(?uism)', text)
liste = [urlparse.urljoin(url, element) for element in liste]
dic = {url:liste}

for urllist in dic.values():
    for element in urllist:
        zahl+=1
	print zahl
#    if dic.has_key(element) != True:
        url = element
	text=urllib.urlopen(url).read()
	liste = re.findall('<a.*?href="(.*?)".*?>(?uism)', text)
	liste = [urlparse.urljoin(url, element) for element in liste]
	dic[url]=liste
Edit (Leonidas): Code in Python-Tags gesetzt.

Verfasst: Dienstag 13. Dezember 2005, 16:13
von Grammi
hallo ich bins nochmal,

habe schon einiges recherchiert und herausgefunden, dass man es mit dem modul "socket" und mittels "settimeout" und der exception "timeout" hinbekommen kann, aber ich weiß leider nicht wirklich wie. da fehlt mir im moment das verständnis. es wär echt sehr nett, wenn ihr mir weiterhelfen könnt. danke.

Verfasst: Dienstag 13. Dezember 2005, 16:22
von jens
Na, da hast du doch schon die richtigen Suchwörter für das Forum gefunden?!?!

http://www.python-forum.de/viewtopic.ph ... out+socket

Verfasst: Donnerstag 15. Dezember 2005, 15:14
von Grammi
danke erstmal für den link. ich habe allerdings eine andere möglichkeit probiert. und zwar gibt es eine bibliothek "timeoutsocket", die auch diese möglichkeit ein timeout zu setzen ermöglicht. ich habe aber leider auch da probleme. und zwar brauch ich dafür die "timeoutsocket.py" und habe sie in das verzeichnis "Python24/Lib" kopiert. nun habe ich natürlich probiert ob alles klappt. hab mir also ein kleines test-skript geschrieben:

Code: Alles auswählen

import timeoutsocket
import urllib
timeoutsocket.setDefaultSocketTimeout(20)
urlopener = urllib.URLopener()
try:
  con = urlopener.open(url)
  output = con.read()
except timeoutsocket.Timeout:
  print "Timeout"
nun wird mir allerdings wenn ich versuche das programm auszuführen ein fehler gemeldet:

--> ImportError: No module named timeoutsocket

aber eigentlich sollte es doch funktionieren oder? oder muss ich die library-datei in ein anderes verzeichnis kopieren? bitte helft mir. danke.

achso aufmerksam bin ich auf folgender seite geworden:

--> http://www.steffensiebert.de/soft/pytho ... tsocket.py

Edit (Leonidas): Code in Python-Tags gesetzt.

Verfasst: Donnerstag 15. Dezember 2005, 15:27
von jens
Warum kopierst du die auch nach "Python24/Lib" ??? Belasse die Datei doch einfach bei deinem Skript!

Normalerweise sollte sie aber gefunden werden, wenn sie im sys.path steckt:

Code: Alles auswählen

import sys
for i in sys.path: print i
EDIT: Wobei das Skript eigentlich nicht notwendig ist! Seid Python 2.3 gibt es settimeout beim socket-Objekt: http://www.python.org/doc/current/lib/s ... l#l2h-2667 Nur wenn das Skript auch auf ältere (<2.3) laufen soll, macht das Sinn!

Siehe auch das Listing in meinem vorherigen Beitrag!

Verfasst: Donnerstag 15. Dezember 2005, 15:52
von Grammi
alles klar jetzt funktioniert es. allerdings hab ich gleich ein anderes problem. und zwar wenn ich eine seite lesen will, die es aber gar nicht gibt, kommt es zu fehlermeldungen. hier einfach mal ein beispiel:

Code: Alles auswählen

import timeoutsocket
import urllib

timeoutsocket.setDefaultSocketTimeout(2)
urlopener = urllib.URLopener()
try:
  con = urlopener.open('http://www.rgergrgrgg.de') #diese Seite gibt es nicht
  output = con.read()
  print output
except timeoutsocket.Timeout:
  print "Timeout"
und die fehlermeldungen lauten:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\Martin Grambauer\Desktop\verb.py", line 7, in -toplevel-
    con = urlopener.open('http://www.rgergrgrgg.de') #diese Seite gibt es nicht
  File "G:\Programme\xampp\python\lib\urllib.py", line 185, in open
    return getattr(self, name)(url)
  File "G:\Programme\xampp\python\lib\urllib.py", line 308, in open_http
    h.endheaders()
  File "G:\Programme\xampp\python\lib\httplib.py", line 795, in endheaders
    self._send_output()
  File "G:\Programme\xampp\python\lib\httplib.py", line 676, in _send_output
    self.send(msg)
  File "G:\Programme\xampp\python\lib\httplib.py", line 643, in send
    self.connect()
  File "G:\Programme\xampp\python\lib\httplib.py", line 611, in connect
    socket.SOCK_STREAM):
IOError: [Errno socket error] (11001, 'getaddrinfo failed')
gibt es noch eine andere exception die aufgefangen werden muss oder noch eine andere variante mein problem zu beheben. wie gesagt, ich wär euch echt dankbar für eure ratschläge.

Edit (Leonidas): Code in Python-Tags gesetzt.

Verfasst: Donnerstag 15. Dezember 2005, 15:59
von jens
Jep, ganz einfach:

Code: Alles auswählen

try:
  con = urlopener.open('http://www.rgergrgrgg.de') #diese Seite gibt es nicht
  output = con.read()
  print output
except timeoutsocket.Timeout:
  print "Timeout"
except IOError, e:
  print "Fehler:", e

Verfasst: Donnerstag 15. Dezember 2005, 17:25
von Grammi
ich hab jetzt mal alles getestet und es funzt so wie ich es mir vorgestellt habe. danke echt für deine schnelle hilfe.