Code: Alles auswählen
for host in Host_list():
print host
Code: Alles auswählen
import re
import socket
import threading
from time import sleep
from random import choice, randint
class Host_list(object):
""""
beim iterieren dieser klasse (= sowas wie "for stift in federtasche: anspitzen(stift)":), werden web-server addressen zuruekgegeben
"""
def __init__(self):
self.hosts = []
self.page = 0
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect(('www.google.com', 80))
self.page = 0
self.old_hosts = []
self.keyword = self._mk_keyword()
self.exhausted = 0
self.regex = re.compile('h2 class=r><a href="\w*://([^"]*)" class=l>')
def _mk_keyword(self):
"""generiert zufaelige strings, die als suchwort fuer google benutzt werden
"""
vocals = 'aeiou'
other_chars = 'qrtpsdfghjklcvbnm'
keyword = ''
for i in range(randint(2,6)):
if randint(0,3):
keyword += choice(vocals)
else:
keyword += choice(other_chars)
return keyword
def _get_hosts(self):
"""gibt die hosts einer google seite zurueck und veraendert wenn noetig den suchwort und das seitenindex"""
hosts = self._parse(self._google_get())
#die zwei ersten hosts werden auf gleichheit uebrprueft um festzustellen, ob wir diese seite nicht schon das letzte mal hatten
if self.old_hosts == hosts[:3]:
self.keyword = self._mk_keyword()
self.page = 0
self.exhausted += 1
#es kann sein dass google keine suchergebnisse mehr sendet
#und uns bitet etwas was in ein bildechen zu sehen ist in einen feld manuel einzugeben
#in diesen fall sagen wir den uns iterierenden was auch immer, dass schon alle elemente durchgereicht wurden
if self.exhausted >= 10:
raise StopIteration
else:
self.page += 1
self.exhausted = 0
self.old_hosts = hosts[:3]
return hosts
def _google_get(self):
"""
returnt googles antwort (in raw http) auf einer suchanfrage mit self.keyword als suchwort und self.page als seitenzahl
"""
#print '\t',(self.page, self.keyword)
self.socket.send("""GET /search?start=%s&q=%s&num=100 HTTP/1.1
Host: www.google.com
""" % (self.page*100, self.keyword))
resp = ''
while True:
chunk = self.socket.recv(2048)
if '</HTML>' in chunk.upper():
break
resp += chunk
return resp
def _parse(self, stri):
"""
filtert die suchergebnisse aus googles antwort und gibt sie in einer liste zurueck
"""
hosts = self.regex.findall(stri)
#das koennte man auch in der regex erledigt haben (nur wie?)
hosts = [host.split('/', 1)[0] for host in hosts]
#doppelte hosts werden entfernt
hosts = dict(zip(hosts, hosts)).keys()
return hosts
def __iter__(self):
"""beim iterrieren wird diese klasse selbst zurueggegeben,
so wird das zuruegebene wert von next() jeweils als akuelles element genomen
"""
return self
def next(self):
"""gibt einen host aus self.hosts zurueck wenn self.hosts leer ist, fuellt es sich wieder auf,
wobei statt eine if, eien while schleifen benutzt werden musste, da self._get_hosts() nicht immer hosts zurueckgibt"""
while not self.hosts:
[self.hosts.append(i) for i in self._get_hosts()]
return self.hosts.pop()
if __name__ == "__main__":
for host in Host_list():
print host