Das kann man immer wieder gut gebrauchen: Die Überprüfung ob eine Zeichenkette eine korrekte URL ist.

def is_valid_url(url):
"""Check des String url"""
validUrl = """
^(http|https)://[a-z0-9]+([-.]{1}[a-z0-9]+)*.[a-z]{2,5}(([0-9]{1,5})?/?.*)$"""

if re.match(validUrl, url):
return True
else:
return False


Um eine völlige Sicherheit zu erreichen, müsste man die TLD in einem zweiten Schritt gegen eine Datenbank mit gültigen TLD laufen lassen.

(Gibt es für die Problemstellung nicht auch eine "eingebaute" Lösung?)

Python Websniffer

Eingestellt von Unknown |

Der Grundstein für den Python Websniffer ist gelegt. Python bringt viele Module schon mit, sodass man igentlich nur die passenden finden muss und schon geht es mit ein paar Zeilen Code ab. Die Funktionalitäten sollen im Beta-Release den Umfang von http://web-sniffer.net/ haben. Darüber hinaus möchte ich noch ein paar zusätzliche Features einbauen, v.a. wenn es um Redirects geht. Wenn man beispielsweise im nachfolgenden Code den Wert der Variablen domain von "www.rentaseo.de" auf "rentaseo.de" setzt, erhält man ganz korrekt einen Status 301 (Moved Permanently). Exceptions gehören auch noch aufgefangen etc ...


import httplib
import string
import os

opera = {"User-Agent":"Opera/9.20 (Windows NT 6.0; U; en)", "Accept-Charset":"ISO-8859-1,UTF-8;q=0.7,*;q=0.7", "Cache-Control":"no", "Accept-Language":"de,en;q=0.7,en-us;q=0.3", "Referer":"http://python-dev.blogspot.com"}

domain = 'www.rentaseo.de'
path = '/'
method = 'GET'
params = None
profile = opera

conn = httplib.HTTPConnection(domain)
conn.request(method, path, params, profile)
stat = conn.getresponse()
headers = stat.getheaders()
version = stat.version
status = stat.status
reason = stat.reason
data = stat.read()
conn.close()

file_name = domain.replace(".", "-")
file_object = open(file_name, "w")
file_object.write(data)
file_object.close()

print "\n"
print "WEBSNIFFER 0.1"
print "+++++++++++++++++"
print "\n"
print "Header (Client)"
print "-----------------"
for key, value in profile.iteritems():
print "%s \t %s" % (key, value)
print "-----------------"
print "\n"
print "Header (Server)"
print "-----------------"
print "HTTP \t %s" % (version)
print "Status \t %s (%s)" % (status, reason)
for key, value in headers:
print "%s \t %s" % (key, value)
print "-----------------"
print "\n"
print "Quelltext"
print "-----------------"
print "Quelltext geschrieben in File:"
print file_name
print "-----------------"
print "\n"


Was macht nun dieses kleine Script bereits? Eigentlich alles was der Websniffer auch kann, lediglich die Profile müssen noch implementiert werden. Die Formatierung des HTML wäre auch noch wünschenswert.


WEBSNIFFER 0.1
+++++++++++++++++


Header (Client)
-----------------
Accept-Charset ISO-8859-1,UTF-8;q=0.7,*;q=0.7
Cache-Control no
Accept-Language de,en;q=0.7,en-us;q=0.3
Referer http://python-dev.blogspot.com
User-Agent Opera/9.20 (Windows NT 6.0; U; en)
-----------------


Header (Server)
-----------------
HTTP 11
Status 200 (OK)
x-powered-by PHP/4.4.0
transfer-encoding chunked
set-cookie PHPSESSID=4b33b42bdee7cb22983ee4ffcf02be04; path=/
expires Thu, 19 Nov 1981 08:52:00 GMT
server Apache/2.0.54 (Linux/SUSE)
pragma no-cache
cache-control no-store, no-cache, must-revalidate, post-check=0, pre-check=0
date Mon, 16 Jun 2008 10:25:04 GMT
content-type text/html; charset=UTF-8
x-pingback http://www.rentaseo.de/xmlrpc.php
-----------------


Quelltext
-----------------
Quelltext geschrieben in File:
www-rentaseo-de
-----------------


Das Beispiel zeigt die Ausgabe bei der Abfrage nach www.rentaseo.de.

Ich habe gerade keine Zeit, mit das Modul genauer anzusehen - für den ein oder anderen mag es aber brennend interessant sein: Auf Pediapress findet sich Python Code, mit dem Wikipedia (und alle Media Wikis) geparst, die Inhalte geholt, verarbeitet, als PDF ausgegeben ... werden können. Es stehen sogar Tools bereit, um Wikipedia Bücher zu produzieren.

Der Link dazu und viel Spass beim experimentieren.

Page Rank Abfragen sind für SEOs und viele Webmaster die Lieblingsbeschäftigung. Thomas Lotze hat die berühmt berüchtigte WWW::Google::PageRank Library auf Python übertragen.

Download http://svn.thomas-lotze.de/public/googlepagerank/trunk.tar.gz

Leider ist das Python Modul nicht dokumentiert. Das Tool ist auch für die Kommando-Zeile gedacht. Allerdings bringt uns ein Blick auf das Starter-Script weiter ...


#!/usr/bin/env python
#
# Copyright (c) 2007 Thomas Lotze
# See also LICENSE.txt

"""Fetches page ranks for the given URLs from Google and prints them out.

Google page ranks range from 1 (unimportant) to 10 (important).
An empty page rank means Google has not yet assigned a rank to the URL.
"IO" instead of a page rank means there was an error contacting Google.
"RE" means Google's response could not be understood.
"""

import sys
import urllib
import tl.googlepagerank.interface as gpri


for target in sys.argv[1:]:
try:
rank = gpri.read_rank(urllib.urlopen(gpri.query_url(target)).read())
except IOError:
rank = "IO"
except ValueError:
rank = "RE"
else:
if not int(rank):
rank = ""

print "%2s %s" % (rank, target)


Daraus lässt sich wunderbar eine Klasse entwickeln, die anstatt einfach das Ergebnis auszugeben, eine Funktion enthält, die das Ergebnis in Dictionary ablegt.

Wer nicht die MaxMind Datenbank nutzen möchte und wem die Zuordnung einer IP zum Land genügt, der kann sich natürlich selbst eine entsprechende Datenbank aus den Zonen-DNS bauen. Es gibt dazu ein Python Script, das allerdings Fehler bei sechs TLD (GG, RS, JE, ME, IM, AX) ausgibt. Da ich erst einmal nachsehen musste, wo die Aland Insel (AX) liegt ... Aber ich werde noch einen Blick auf das Script werfen. Dramatisch kann der Fehler nicht sein, denn alle anderen Zuordnungen scheinen fehlerfrei zu funktionieren.

Download ip2cc-0.4.tar.gz

Wer sich auf Fehlersuche begeben möchte: Die DB bei CPan könnte hilfreich sein.

Die gängisten Blogsysteme für eigene Intsallationen sind Wordpress, Serendipity, Textpattern und Movable Type. Bis auf letzteres, das hauptsächlich in Perl entwickelt wurde, nutzen alle die Skriptsprache PHP. Das ist mit Sicherheit der Verbreitung geschuldet.

Natürlich gibt es auch auf Python basierende Blog-Software. Was hier sofort auffällt: Beinahe alle Lösungen sind Teil eines größeren Frameworks. Damit zielen diese auch nicht primär für den einzelnen Blogger ab, sondern mehr auf individuelle Konfigurationen.

Hier eine kurze und sicherlich unvollständliche Liste mit Blog-Software:

  • Blogmaker baut auf das Framework Django
  • CBlog von Christopher Arndt (TurboGears Framework)
  • Turboblog benötigt ebenfalls TurboGears
  • gibe ein Blog-System mit Plugins
  • Quills ist eine Blog-Software für das hochgelobte Plone CMS
  • PyBloxsom läuft auch als CGI
  • ...

Es kann wirklich ein interessantes Projekt werden, der Log-File-Filter Loghetti. Momentan ist es ein Kommandozeilen-Tool, soll sich aber zu einem Framework entwickeln.

Was kann es? Was tut es? Wo gibt es ...?