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?
Wenn dies ** Arbeitscode ** ist, siehe [codereview.se]. Aber warum [HTML mit Regex parsen] (http://stackoverflow.com/a/1732454/3001761)? – jonrsharpe
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. –
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