Projektowanie web crawler

Natknąłem się na pytanie wywiadu "gdybyś projektował web crawler, jak unikniesz wchodzenia w nieskończone pętle? "i próbuję na to odpowiedzieć.

Jak to wszystko zaczyna się od początku. Powiedzmy, że Google zaczęło od niektórych stron hubu, mówi ich setki (jak te strony hubu zostały znalezione w pierwszej kolejności, to inne pytanie podrzędne). Ponieważ Google podąża za linkami ze strony i tak dalej, czy robi tabelę hash, aby upewnić się, że nie podąża za wcześniejszym odwiedzane strony.

Co jeśli ta sama strona ma 2 nazwy (Url) powiedzmy w tych dniach, gdy mamy skracacze URL itp..

Wziąłem Google jako przykład. Chociaż Google nie przecieka, jak działają algorytmy indeksowania stron internetowych i ranking stron itp., ale jakieś domysły?

Author: Kara, 2011-04-29

8 answers

Jeśli chcesz uzyskać szczegółową odpowiedź, zajrzyj do sekcja 3.8 tej pracy , która opisuje test widziany przez URL nowoczesnego skrobaka:

W trakcie wydobywania linków, wszelkie Web crawler natknie się na wiele linki do tego samego dokumentu. Aby uniknąć pobieranie i przetwarzanie dokumentu wielokrotnie, test widziany przez URL musi być wykonywane na każdym wyodrębnionym łączu przed dodaniem go do granicy URL. (Alternatywnym projektem byłoby zamiast tego wykonaj URL-seen test when URL jest usuwany z granicy, ale takie podejście skutkowałoby znacznie większa granica.)

Aby wykonać URL-seen test, przechowujemy wszystkie Adresy URL widoczne przez Mercator w canonical formularz w dużej tabeli o nazwie URL gotowi. Znowu za dużo wpisów aby wszystkie zmieściły się w pamięci, tak jak zestaw odcisków palców dokumentu, adres URL set jest przechowywany głównie na dysku.

Aby zapisać przestrzeni, Nie przechowujemy tekstu reprezentacyjne każdego adresu URL w adresie URL zestaw, ale raczej stały rozmiar suma kontrolna. W przeciwieństwie do odcisków palców przedstawione do treści-zobacz test zestaw odcisków palców dokumentu, strumień adresów URL testowanych na podstawie zestawu adresów URL ma nietrywialna ilość miejscowości. Na zmniejszyć liczbę operacji na backing disk file, dlatego zachowujemy pamięć podręczna popularnych adresów URL. Intuicja tego cache jest taka, że linki do niektórych adresów URL są dość powszechne, więc buforowanie popularnych w pamięci poprowadzi do wysokiej pamięci hit rate.

W rzeczywistości, przy użyciu in-memory cache of 2^18 entries and the LRU-like Polityka wymiany zegara, osiągamy ogólny wskaźnik hit w pamięci cache 66.2% , a trafienie 9.5% na tablicy ostatnio dodanych adresów URL, 75,7%. Ponadto, z 24,3% wniosków, które nie trafiły w zarówno pamięć podręczna popularnych adresów URL, jak i tabela ostatnio dodanych adresów URL, o 1=3 generuje trafienia na buforze w naszym losowy plik dostępu realizacja, który również znajduje się w przestrzeni użytkownika. Na wynik netto tego buforowania jest że każdy test członkostwa wykonujemy na ustawieniu adresu URL wyniki w średniej z 0.16 seek i 0.17 read kernel wywołania (część z nich to serwowane z systemu plików jądra buforów). Tak więc każdy URL ustawia członkostwo test indukuje jedną szóstą tyle jąder rozmowy jako test członkowski na zestaw odcisków palców dokumentu. Te oszczędności wynikają wyłącznie z kwoty miejscowości URL (tj., powtarzanie popularne adresy URL) adresów URL napotkanych podczas indeksowania.

Zasadniczo hashują wszystkie adresy URL za pomocą funkcji mieszającej, która gwarantuje unikalne skróty dla każdego adresu URL, a ze względu na lokalizację adresów URL, znalezienie adresów URL staje się bardzo łatwe. Google udostępniło nawet swoją funkcję haszującą: CityHash

Uwaga!
Mogą też mówić o pułapkach na boty!!! Pułapka bota to sekcja strony, która ciągle generuje nowe linki dzięki unikalnym adresom URL i zasadniczo zostaniesz uwięziony w" nieskończonej pętli", podążając za linkami, które są serwowane przez tę stronę. Nie jest to dokładnie pętla, ponieważ pętla byłaby wynikiem odwiedzenia tego samego adresu URL, ale jest to nieskończony łańcuch adresów URL, którego należy unikać indeksowania.

Update 12/13/2012 - the day after the world was supposed to end :)

Za komentarz Fr0zenFyr: jeśli ktoś używa algorytmu aopic do wyboru stron, to dość łatwo uniknąć pułapek botów typu nieskończonej pętli. Oto podsumowanie działania AOPIC:

  1. Pobierz zbiór N stron nasiennych.
  2. Przydziel x kwotę kredytu każdej stronie, tak aby każda strona miała x/n kredytu (tzn. równą kwotę kredytu) przed rozpoczęciem indeksowania.
  3. Wybierz stronę P, gdzie P ma największą kwotę kredytu (lub jeśli wszystkie strony mają taką samą kwotę kredytu, przeszukiwaj losową stronę).
  4. Crawl page P (powiedzmy, że p miał 100 kredytów kiedy się czołgał).
  5. Wyodrębnij wszystkie linki ze strony P (powiedzmy, że jest ich 10).
  6. Ustaw kredyty P na 0.
  7. weź 10% "podatku" i przeznaczyć go na stronę Lambda.
  8. Przydziel równą ilość kredytów każdemu linkowi znalezionemu na stronie P z oryginalnego kredytu P-podatek: so (100 (kredyty P)-10 (10% podatku)) / 10 (Linki) = 9 kredytów za każdy link.
  9. Powtórz od kroku 3.

Ponieważ strona Lambda stale pobiera podatek, ostatecznie będzie to strona z największą ilością kredytów i będziemy musieli ją "czołgać". Mówię "crawl" w cudzysłowach, ponieważ tak naprawdę nie robimy żądania HTTP dla strony Lambda, po prostu bierzemy jej kredyty i rozprowadzamy je równo do wszystkich stron w naszej bazie danych.

Ponieważ pułapki botów dają tylko kredyty z linków wewnętrznych i rzadko dostają kredyty z zewnątrz, będą nieustannie przeciekać kredyty (z podatków) na stronę Lambda. Strona Lambda rozpowszechni to kredyty są wypłacane wszystkim stronom w bazie danych równomiernie i z każdym cyklem strona pułapki bota traci coraz więcej kredytów, dopóki nie ma tak mało kredytów, że prawie nigdy więcej nie wypełznie. Nie stanie się to w przypadku dobrych stron, ponieważ często otrzymują kredyty z linków zwrotnych znalezionych na innych stronach. Skutkuje to również dynamicznym page rank i to, co zauważysz, to to, że za każdym razem, gdy robisz migawkę swojej bazy danych, zamawiasz strony według ilości kredytów, które mają, wtedy będą najbardziej prawdopodobnie być uporządkowane mniej więcej według ich true page rank.

To tylko unikanie pułapek na boty typu nieskończonej pętli, ale istnieje wiele innych pułapek na boty, na które powinieneś uważać i są sposoby na ich obejście.

 76
Author: Kiril,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:50

Podczas gdy wszyscy tutaj już zasugerowali, jak stworzyć swój web crawler, oto jak Google plasuje strony.

Google daje każdej stronie ranking na podstawie liczby linków zwrotnych (ile linków na innych stronach internetowych wskazuje na konkretną stronę/stronę). To się nazywa ocena trafności. Wynika to z faktu, że jeśli strona ma wiele innych stron link do niego, prawdopodobnie jest to ważna strona.

Każda strona / strona jest postrzegana jako węzeł na wykresie. Linki do innych stron są kierowane krawędzie. Stopień wierzchołka definiuje się jako liczbę przychodzących krawędzi. Węzły z większą liczbą przychodzących krawędzi są klasyfikowane wyżej.

Oto jak określa się PageRank. Załóżmy, że strona Pj ma linki Lj. Jeśli jeden z tych linków jest do strony Pi, to Pj przekaże 1 / Lj swojego znaczenia Pi. Ranking znaczenia Pi jest wtedy sumą wszystkich wkładów wniesionych przez strony linkujące do niego. Więc jeśli oznaczamy zbiór stron linkujących do Pi przez Bi, to mamy to Formuła:

Importance(Pi)= sum( Importance(Pj)/Lj ) for all links from Pi to Bi

Szeregi są umieszczone w macierzy zwanej macierzą hiperłącza: H [i, j]

Wiersz w tej macierzy jest albo 0, albo 1 / Lj, jeśli istnieje łącze od Pi do Bi. Inną właściwością tej macierzy jest to, że jeśli zsumujemy wszystkie wiersze w kolumnie otrzymujemy 1.

Teraz musimy pomnożyć tę macierz przez wektor Eigen o nazwie I (o wartości eigen 1) taki, że:

I = H*I

Teraz zaczynamy iterację: i H, i i H, i Ii H .... I^k * h dopóki rozwiązanie się nie zbiega. czyli otrzymujemy prawie takie same liczby w macierzy w kroku k I K+1.

Teraz to, co pozostało w wektorze I, jest ważne dla każdej strony.

Prosty przykład pracy domowej w klasie Zobacz http://www.math.cornell.edu / ~mec/Winter2009/RalucaRemus/Lecture3/lecture3.html

Jeśli chodzi o rozwiązanie zduplikowanego problemu w pytaniu kwalifikacyjnym, zrób sumę kontrolną na całej stronie i użyj tego lub bash sumy kontrolnej jako klucza na mapie, aby śledzić odwiedzane strony.

 7
Author: Adrian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-21 05:29:10

Zależy od tego, jak głębokie miało być ich pytanie. Gdyby po prostu starali się unikać podążania za tymi samymi linkami w tę i z powrotem, wystarczyłoby hashowanie adresu URL.

A co z treścią, która ma dosłownie tysiące adresów URL, które prowadzą do tej samej treści? Jak parametr QueryString, który nie wpływa na nic, ale może mieć nieskończoną liczbę iteracji. Przypuszczam, że możesz również hashować zawartość strony i porównać adresy URL, aby sprawdzić, czy są podobne do przechwytywanie zawartości, która jest identyfikowana przez wiele adresów URL. Zobacz na przykład pułapki botów wymienione w poście @Lirik.

 1
Author: mellamokb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-29 17:08:59

Musisz mieć jakąś tabelę hashową, aby przechowywać wyniki, po prostu musisz ją sprawdzić przed każdym załadowaniem strony.

 0
Author: chuchu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-29 16:43:38

Problem polega na tym, aby nie indeksować zduplikowanych adresów URL, które są rozwiązywane przez indeks za pomocą hasha uzyskanego z adresów URL. Problem polega na przeszukiwaniu zduplikowanych treści. Każdy adres url "pułapki Gąsienicowej" jest inny (rok, Dzień, identyfikator sesji...).

Nie ma "doskonałego" rozwiązania... ale możesz użyć niektórych z tych strategii:

* Zachowaj pole, na którym znajduje się adres url w witrynie. Dla każdego cyklu pobierania adresów URL ze strony, zwiększ poziom. Będzie jak drzewo. Możesz przestać crawl na pewnym poziomie, jak 10 (myślę, że google używać tego).

* Możesz spróbować utworzyć rodzaj hasha, który można porównać do znalezienia podobnych dokumentów, ponieważ nie można porównać z każdym dokumentem w bazie danych. Są SimHash z google, ale nie mogłem znaleźć żadnej implementacji do użycia. Potem stworzyłem własne. Mój hash liczyć niskiej i wysokiej częstotliwości znaków wewnątrz kodu html i wygenerować 20bytes hash, wich jest porównywany z małym buforem ostatnich indeksowanych stron wewnątrz AVLTree z bliskimi poszukiwaniami z pewną tolerancją (ok.2). W tym hashu nie można używać żadnych odniesień do miejsc znaków. Po "rozpoznaniu" pułapki możesz nagrać wzorzec URL zduplikowanej zawartości i zacząć ignorować strony z tym również.

• podobnie jak google, możesz stworzyć ranking dla każdej witryny i "zaufać" więcej w jednej niż w innych.

 0
Author: lexmooze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-19 14:05:02

Crawler przechowuje pulę adresów URL, która zawiera wszystkie adresy URL do indeksowania. Aby uniknąć "nieskończonej pętli", podstawową ideą jest sprawdzenie istnienia każdego adresu URL przed dodaniem do puli.

Jednak nie jest to łatwe do wdrożenia, gdy system skaluje się do określonego poziomu. Naiwne podejście polega na utrzymywaniu wszystkich adresów URL w hashset i sprawdzaniu istnienia każdego nowego adresu URL. To nie zadziała, gdy jest zbyt wiele adresów URL, aby zmieścić się w pamięci.

Jest tu kilka rozwiązań. Na instancja, zamiast zapisywać wszystkie adresy URL do pamięci, powinniśmy przechowywać je na dysku. Aby zaoszczędzić miejsce, należy użyć skrótu URL zamiast surowego adresu URL. Warto również zauważyć, że powinniśmy zachować kanoniczną formę adresu URL, a nie oryginalną. Więc jeśli adres URL jest skracany przez usługi takie jak bit.ly, lepiej uzyskać ostateczny adres URL. Aby przyspieszyć proces sprawdzania, można zbudować warstwę pamięci podręcznej. Możesz też zobaczyć go jako rozproszony system pamięci podręcznej, który jest oddzielnym tematem.

Post Zbuduj Web Crawler ma szczegółową analizę tego problemu.

 0
Author: Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-07 03:55:23

Cóż, sieć jest w zasadzie grafem skierowanym, więc możesz skonstruować Wykres z adresów URL, a następnie wykonać przejście BFS lub DFS podczas zaznaczania odwiedzanych węzłów, aby nie odwiedzać tej samej strony dwa razy.

 -1
Author: Pepe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-29 16:45:06

To jest przykład Web crawlera. Które mogą być używane do zbierania adresów mac dla Mac spoofing.

#!/usr/bin/env python

import sys
import os
import urlparse
import urllib
from bs4 import BeautifulSoup

def mac_addr_str(f_data):
global fptr
global mac_list
word_array = f_data.split(" ")

    for word in word_array:
        if len(word) == 17 and ':' in word[2] and ':' in word[5] and ':' in word[8] and ':' in word[11] and ':' in word[14]:
            if word not in mac_list:
                mac_list.append(word)
                fptr.writelines(word +"\n")
                print word



url = "http://stackoverflow.com/questions/tagged/mac-address"

url_list = [url]
visited = [url]
pwd = os.getcwd();
pwd = pwd + "/internet_mac.txt";

fptr = open(pwd, "a")
mac_list = []

while len(url_list) > 0:
    try:
        htmltext = urllib.urlopen(url_list[0]).read()
    except:
        url_list[0]
    mac_addr_str(htmltext)
    soup = BeautifulSoup(htmltext)
    url_list.pop(0)
    for tag in soup.findAll('a',href=True):
        tag['href'] = urlparse.urljoin(url,tag['href'])
        if url in tag['href'] and tag['href'] not in visited:
            url_list.append(tag['href'])
            visited.append(tag['href'])

Zmień adres url, aby indeksować więcej witryn......powodzenia

 -2
Author: ashish jha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-04 01:18:51