crawler: angabe robotname && robotadmin?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
rob
User
Beiträge: 4
Registriert: Mittwoch 12. Januar 2005, 22:21
Wohnort: basel
Kontaktdaten:

moin moin
ich muss für ein schulprojekt einen crawler programmieren. kann mir jemand einen tipp geben, wie ich den namen und admin angeben muss?
unter perl kann man ja einfach den LWP::RobotUA( name, mail_admin ) benützen, der das zur verfügung stellt.
unter python hab ich vor urllib und den robotparser zu benützen (?), aber keine ahnung, wie ich namen und admin übermitteln muss.

besten dank für die hilfe
rob
ich kauf nur noch freeware!
Gast

OK.

in der urllib ist die httplib mit der classe HTTPConnection. die hat die funktion putheader( alles was ein bot braucht ).

wenn es möglich ist, diese funktion zu benützen und die entsprechenden parameter zu setzen, ohne dass sie wieder von der urllib || httplib überschrieben werden, müsste das klappen.

allerdings hab ich erst grad mit python angefangen, und muss mich noch schlau machen wie.
rob
User
Beiträge: 4
Registriert: Mittwoch 12. Januar 2005, 22:21
Wohnort: basel
Kontaktdaten:

oje, das da oben war ein self reply. hab vergessen mich einzuloggen... :oops:
ich kauf nur noch freeware!
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Leider nicht ganz richtig: die httplib ist nicht in der urllib, sie wird von dieser benutzt und ist ein eigenständiges Modul. Von daher kannst du ja gleich die httplib nutzen. Ich hab vorher nur deine Problemstellung nicht verstanden, jetzt wirds klarer.

Code: Alles auswählen

import httplib
con=httplib.HTTPConnection(server)
#jetzt die weiteren Befehle putheader, putrequest, getrequest etc
rob
User
Beiträge: 4
Registriert: Mittwoch 12. Januar 2005, 22:21
Wohnort: basel
Kontaktdaten:

OK, vielen dank für die erläuterung.

das bedeutet allerdings auch, dass ich auf eventuell brauchbare, zusätzliche funktionalität der urllib verzichten müsste, da diese vermutlich einen eigenen header platziert. wobei ich mir noch nicht sicher bin, ob ich sie überhaupt brauche.

mehr sorgen macht mir, dass ich einen eigenen header bauen werden muss, und wie ein minimalheader auszusehen hat. denn irgenwas muss ich ja der funktion putheader( header ) übergeben.
ich vermute mal, dass ich den standartheader, falls einer existiert, nicht erweitern kann, und einen komplett eigenen übergeben muss.

falls jemand weiss, was ein minimal-http-header mindestens enthalten muss, ich wäre um jeden tip dankbar, denn ausser der RFC an sich, finde ich nicht gerade viel im netz.
ich kauf nur noch freeware!
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Das hängt ganz davon ab, was du anfordern willst. Minimalheader werden schon durch request gemacht, aber das ist wirklich nur die Anfrage. Am besten du schaust dir mal den Quelltext der urllib an, da wirst du Angaben finden, die dort benutzt werden. Die kannst du ja nach belieben verändern und anpassen.
rob
User
Beiträge: 4
Registriert: Mittwoch 12. Januar 2005, 22:21
Wohnort: basel
Kontaktdaten:

ich hab ethereal und den perl script bemüht. was mir nicht klar war: putheader(...) schreibt zeilenweise, das wird einfach so oft wie man 's braucht aufgerufen mit je einer option.
so läuft das mal in einer minimalversion:

Code: Alles auswählen

#!/usr/bin/env python

import robotparser
import httplib

server = 'www.google.ch'
path = ''

robpars = robotparser.RobotFileParser()
robpars.set_url( 'http://' + server + '/robots.txt' )
robpars.read()

if robpars.can_fetch( '*', server + path ):

    print '\nAccess to ' + server + path + ' permitted\n'

    con = httplib.HTTP( server + path )
    con.putrequest( 'GET', '/' )
    con.putheader( 'Accept', 'text/html' )
    con.putheader( 'Accept', 'text/plain' )
    con.putheader( 'From', 'e@mail.com' )
    con.putheader( 'User-Agent', 'myCrawler' )
    con.endheaders()

    errcode, errmsg, headers = con.getreply()
    print errcode

    file = con.getfile()
    print file.read()
    file.close()

else:
    print '\nAccess to ' + server + path + ' denied\n'
besten dank nochmal für die hilfe :)
ich kauf nur noch freeware!
Antworten