Ich versuche einen Webcrawler zu schreiben, aber ich stecke fest, weil ich irgendwo in meinem Code keine Endlosschleife sehen kann.Endlosschleife kann ich nicht sehen
class Crawler(object):
def __init__(self, url, query, dir = os.path.dirname(__file__)):
self.start_url = url
self.start_parsed = urllib3.util.parse_url(url)
self.query = re.compile(query, re.IGNORECASE)
self.dir = dir
self.__horizon = set()
self.log = []
self.__horizon.add(url)
self.log.append(url)
print("initializing crawler....")
print(locals())
def start(self, depth= 5, url = '/'):
print(url, depth)
self.log.append(url)
if depth > 0:
pool = urllib3.PoolManager()
data = pool.request("GET", self.start_url if url == '/' else url).data.decode('utf-8')
valid_list = []
self.add_horizon(parser_soup.get_links(data), valid_list)
if re.search(self.query, parser_soup.get_text(data)):
self.output(data)
for u in valid_list:
self.start(depth = (depth-1), url = u)
def output(self, data):
with open(os.path.join(self.dir, get_top_domain(self.start_parsed.host) + '.' + str(time.time()) + '.html'), 'w+') as f:
f.write(data)
def add_horizon(self, url_list, valid_list = []):
for url in url_list:
if get_top_domain(url) == get_top_domain(self.start_parsed.host) \
and (not str(url) in self.log or not str(url) in self.__horizon):
valid_list.append(str(url))
self.__horizon.update(valid_list)
Es läuft für immer. Wie soll ich sicherstellen, dass ich doppelte Links eliminiere?
was meinst du "kann endlosschleife nicht sehen?" –
@ uoɥʇʎPʎzɐɹC Er versteht nicht, warum sein Code in eine Endlosschleife läuft. –
Nicht verwandt mit Ihrer Frage, aber ein Vorschlag: Machen Sie den PoolManager in '__init__' und verwenden Sie ihn überall, um den größten Nutzen daraus zu ziehen. – shazow