Dieser Beitrag ist Teil meiner Sourcecode a Day-Aktion.
Heute gibt’s eine simple Wrapper-Klasse für urllib aus Python3:
# -*- coding: utf-8 -*-
#-------------------------------------------------------------------------------
# Name:        NetConnector
# Purpose:     Python urllib wrapper
#
# Author:      Alexander Thiemann
#
# Created:     10.10.2011
# Copyright:   (c) Alexander Thiemann 2011
#-------------------------------------------------------------------------------
import urllib.request, urllib.parse, urllib.error
import http.cookiejar
import time, sys
class NetConnector:
    def __init__(self, encoding='utf-8'):
        self.userAgent = 'Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9) Gecko/2008060309 Firefox/3.0'
        self.encoding = encoding
        self.cookiejar = http.cookiejar.CookieJar()
        self.opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(self.cookiejar))
        urllib.request.install_opener(self.opener)
        self.opener.addheaders = [('User-agent', self.userAgent)]
    def request(self, url, params={}, noencode=False, internalCount=1):
        print("URL: " + url);
        data = ""
        try:
            if len(params) != 0:
                if noencode:
                    req = params["query"].encode(self.encoding)
                else:
                    req = urllib.parse.urlencode(params).encode(self.encoding)
                    print("Params: " + str(req))
                sock = self.opener.open(url, req)
            else:
                sock = self.opener.open(url)
            data = sock.read().decode(self.encoding)
            sock.close()
        except urllib.error.HTTPError as e:
            print("HTTP Error: "  + str(e.code))
        except urllib.error.URLError as e:
            print(e)
            if internalCount >= 2: # edit this!
                print("[error] connection error. returning ''");
                return ""
            print("[error] connection error. Sleeping " + str(internalCount) +  " seconds.")
            time.sleep(internalCount)
            data = self.request(url, params, noencode, internalCount+1)
        return data
Verwendung:
connector = NetConnector();
connector.request("http://google.de") # get-request, returns response
connector.request("http://google.de", {'a': 'asdasd'}) # post-request, returns response
Das ganze codiert automatisch Post-Parameter und verwaltet Cookies 🙂