mercoledì 16 febbraio 2011

Crawler in Python per scovare link e mail

Ho scritto un piccolo Crawler che permette di salvare mail e link su due file distinti. Per cambiare le opzioni basta modificare i valori di SAVELINK o SAVEMAIL.
Le scritture delle informazioni ricavate vengono effettuate nel momento in cui si stacca lo script con Ctrl + c
Allo script bisogna passare come parametro l'url di partenza.
Il codice non è pulito ma spero serva a qualcuno.


#!/usr/bin/python
import sys,urllib2,re
SAVELINK = False
SAVEMAIL = True
linkpat = re.compile('<a href="http://\S*"')
mailpat = re.compile('<a href="mailto:\S*@\S*.\S{2,4}"')
mymail = []
collection = []
mylinks = []
mylinks.append(sys.argv[1])
def inList(a,l):
    try:
        l.index(a)
        return True
    except:
        return False
def scanWEB():
    while 1:
        try:
            firstlink = mylinks.pop()
            if(inList(firstlink,collection)):
                continue
            collection.append(firstlink)
            try:
                response = urllib2.urlopen(firstlink)
            except:
                continue
            myhtml = response.read(60000)
            risultato = linkpat.findall(myhtml)
            rismail = mailpat.findall(myhtml)
            for i in rismail:
                myresultmail = i.replace('<a href="mailto:','').replace('"','')
                if inList(myresultmail,mymail) == False:
                    mymail.append(myresultmail)
            for i in risultato:
                myresult = i.replace('"','').replace("<a href=","")
                if inList(myresult,collection) == False:
                    mylinks.append(myresult)
        except KeyboardInterrupt:
            if SAVELINK:
                f = open("link.txt","w")
                for i in collection:
                    f.write(i+"\n")
                f.close()
            if SAVEMAIL:
                f = open("mail.txt","w")
                for i in mymail:
                    f.write(i+"\n")
                f.close()                
            return
if __name__ == "__main__":
    sys.exit(scanWEB())