frage zu einem timeout

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Grammi
User
Beiträge: 9
Registriert: Dienstag 11. Oktober 2005, 15:12

frage zu einem timeout

Beitragvon Grammi » Dienstag 13. Dezember 2005, 13:06

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.
MfG Grammi
Grammi
User
Beiträge: 9
Registriert: Dienstag 11. Oktober 2005, 15:12

Beitragvon Grammi » Dienstag 13. Dezember 2005, 16:13

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.
MfG Grammi
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Dienstag 13. Dezember 2005, 16:22

Na, da hast du doch schon die richtigen Suchwörter für das Forum gefunden?!?!

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Grammi
User
Beiträge: 9
Registriert: Dienstag 11. Oktober 2005, 15:12

Beitragvon Grammi » Donnerstag 15. Dezember 2005, 15:14

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.
MfG Grammi
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Donnerstag 15. Dezember 2005, 15:27

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!

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Grammi
User
Beiträge: 9
Registriert: Dienstag 11. Oktober 2005, 15:12

Beitragvon Grammi » Donnerstag 15. Dezember 2005, 15:52

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.
MfG Grammi
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Donnerstag 15. Dezember 2005, 15:59

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Grammi
User
Beiträge: 9
Registriert: Dienstag 11. Oktober 2005, 15:12

Beitragvon Grammi » Donnerstag 15. Dezember 2005, 17:25

ich hab jetzt mal alles getestet und es funzt so wie ich es mir vorgestellt habe. danke echt für deine schnelle hilfe.
MfG Grammi

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]