2017-01-22 17 views
-1

Hier ist ein Code:Wie macht man einen Web Crawler effizienter?

str_regex = '(https?:\/\/)?([a-z]+\d\.)?([a-z]+\.)?activeingredients\.[a-z]+(/?(work|about|contact)?/?([a-zA-z-]+)*)?/?' 

import urllib.request 
from Stacks import Stack 
import re 
import functools 
import operator as op 
from nary_tree import * 
url = 'http://www.activeingredients.com/' 
s = set() 
List = [] 
url_list = [] 
def f_go(List, s, url): 
    try: 
     if url in s: 
      return 
     s.add(url) 
     with urllib.request.urlopen(url) as response: 
      html = response.read() 
      #print(url) 
     h = html.decode("utf-8") 
     lst0 = prepare_expression(list(h)) 
     ntr = buildNaryParseTree(lst0) 
     lst2 = nary_tree_tolist(ntr) 
     lst3= functools.reduce(op.add, lst2, []) 
     str2 = ''.join(lst3) 
     List.append(str2) 
     f1 = re.finditer(str_regex, h) 

     l1 = [] 
     for tok in f1: 
      ind1 = tok.span() 
      l1.append(h[ind1[0]:ind1[1]]) 
    for exp in l1: 
     length = len(l1) 
     if (exp[-1] == 'g' and exp[length - 2] == 'p' and exp[length - 3] == 'j') or \ 
      (exp[-1] == 'p' and exp[length - 2] == 'n' and exp[length - 3] == 'g'): 
       pass 
     else: 
      f_go(List, s, exp, iter_cnt + 1, url_list) 
except: 
    return 

Es Grundsätzlich verwenden, urlllib.request.urlopen, URLs rekursiv in einer Schleife öffnet; tut dies in bestimmten Bereichen (in diesem Fall activeingredients.com); link extraction form eine Seite wird von regexpression getan. Innerhalb, mit geöffneter Seite analysiert es es und fügt einer Liste als Zeichenkette hinzu. Also, was dies tun soll, ist durch die gegebene Domäne zu gehen, Informationen zu extrahieren (bedeutungsvoller Text in diesem Fall), zu einer Liste hinzuzufügen. Mit Ausnahme von block, nur bei allen http-Fehlern (und allen anderen Fehlern auch zurück, aber das ist getestet und funktioniert).
Es funktioniert, zum Beispiel für diese kleine Seite, aber für größere ist extrem langsam und essen Speicher.
Parsing, Seite vorbereiten, mehr oder weniger den richtigen Job, glaube ich.
Frage ist, gibt es eine effiziente Möglichkeit, dies zu tun? Wie surfen Web-Suchen so schnell durch das Netzwerk?

+1

Wenn dies ** Arbeitscode ** ist, siehe [codereview.se]. Aber warum [HTML mit Regex parsen] (http://stackoverflow.com/a/1732454/3001761)? – jonrsharpe

+0

Sieht für mich aus, dass Sie Multithreading definitiv verwenden sollten, da Sie die meiste Zeit auf Netzwerkinhalte warten. Sie sollten mehrere Anfragen gleichzeitig senden. –

+1

Das ist eine gute Frage, aber die Antwort ist komplex. Für den Anfang sollten Sie eine Datenbank verwenden, um Ihre Daten zu speichern, damit das gesamte Dataset nicht in den Arbeitsspeicher geladen werden muss. Außerdem sollten Sie mehrere Webanfragen parallel laden. Aber ja, das ist eine ziemlich komplexe Aufgabe. Vielleicht suchen Sie nach einer vorhandenen Bibliothek, die das tut? – dana

Antwort

1

Erstens: Ich glaube nicht, dass Googles Webcrawler auf einem Laptop oder einem PC läuft. Machen Sie sich keine Sorgen, wenn Sie keine Ergebnisse erzielen können, wie dies bei großen Unternehmen der Fall ist.

Punkte zu beachten:

  1. Sie mit einer großen Liste von Wörtern beginnen könnten Sie von vielen Websites herunterladen. Das sortiert einige nutzlose Kombinationen von URLs aus. Danach können Sie nur mit Buchstaben crawlen, um nutzlos benannte Seiten auf Ihrem Index zu erhalten.

  2. Sie können mit einer Liste aller registrierten Domänen auf DNS-Servern beginnen. I.E. so etwas wie dieses: http://www.registered-domains-list.com

  3. Verwenden mehrerer Threads

  4. haben viel Bandbreite

  5. Kauf Betrachten Sie die Google-Data-Center

Diese Punkte sind nur Ideen, die Sie eine grundlegende Idee zu geben, wie Sie Ihren Crawler verbessern könnten.

+0

Danke, das ist klar, ich sehe es größer als ich dachte. –

+0

Ja.Und es ist nicht möglich, dass es klein bleibt (leider). Wenn Sie denken, dass diese Antwort Ihnen hilft, können Sie eine positive Bewertung abgeben (nur wenn Sie möchten). Ich bin froh, dass ich dir helfen konnte. Glückliche Kodierung ;-) – fameman