Przewodnik krok po kroku dotyczący tworzenia robota indeksującego od podstaw

Komentarze: 0

Crawlery internetowe są wykorzystywane do monitorowania cen, agregacji wiadomości, analizy konkurencji, indeksowania wyszukiwarek i innych zadań, które wymagają gromadzenia ustrukturyzowanych danych ze stron internetowych. Niniejszy przewodnik opisuje, jak zbudować web crawlera od podstaw, zaczynając od planowania projektu i wyboru technologii, a kończąc na konfiguracji środowiska i przechowywaniu danych. Zapewnia on podstawy, które można później rozszerzyć na bardziej złożone projekty na dużą skalę.

Co to jest Web Crawler i jak działa?

Jest to program, który automatycznie odwiedza strony internetowe i zbiera z nich informacje. Działa poprzez wysyłanie wywołań HTTP do witryny, pobieranie kodu HTML każdej strony, a następnie przetwarzanie tego kodu HTML w celu wyodrębnienia wymaganych danych. Następnie podąża za wewnętrznymi linkami i powtarza proces, aż osiągnie predefiniowane limity lub warunki zatrzymania. Proces ten nie jest tym samym, co web scraping. Szczegółowe porównanie można znaleźć na stronie Web scraping vs web crawling.

Takie narzędzia są szeroko stosowane do:

  • monitorowanie cen w handlu elektronicznym
  • gromadzenie kontaktów i list
  • Tworzenie zestawów danych do analizy
  • indeksowanie treści dla wyszukiwarek

W takich sytuacjach zbudowanie własnego crawlera jest często lepszym podejściem: można dostosować program do swoich potrzeb, kontrolować częstotliwość żądań i zdefiniować, jakie informacje mają być zbierane i w jaki sposób.

Planowanie projektu Web Crawler

Przed rozpoczęciem kodowania należy zdefiniować podstawowe parametry projektu, aby uniknąć typowych problemów i zapewnić stabilne działanie.

  1. Cele gromadzenia danych. Określ, dlaczego potrzebujesz tego narzędzia: monitorowanie cen, zbieranie kontaktów, indeksowanie treści, tworzenie zestawów danych analitycznych itp.
  2. Docelowe witryny i typy danych. Zdecyduj, które zasoby będziesz indeksować i jakich informacji od nich potrzebujesz. Ma to wpływ na architekturę i wybór technologii.
  3. Częstotliwość aktualizacji. Oszacuj, jak często potrzebujesz świeżych danych, aby uniknąć przeciążenia systemów lub pracy z nieaktualnymi informacjami.
  4. Ograniczenia techniczne i prawne. Sprawdź robots.txt, ochronę przed botami, przepisy dotyczące ochrony danych i warunki korzystania z witryny.
  5. Przetwarzanie i przechowywanie. Zdecyduj, w jakim formacie będziesz przechowywać informacje i jak będziesz je później analizować.

Dobrze zaplanowane narzędzie działa niezawodnie, efektywnie wykorzystuje zasoby i zapewnia wysokiej jakości wyniki.

Wybór odpowiedniego języka i narzędzi

Crawler internetowy można zbudować w wielu językach programowania, w tym Python, Java i PHP. Python wyróżnia się prostą składnią i bogatym ekosystemem bibliotek do żądań HTTP i parsowania HTML (takich jak requests, BeautifulSoup, lxml). Java jest solidnym wyborem dla projektów na dużą skalę i projektów korporacyjnych. PHP jest bardziej powszechny w tworzeniu stron internetowych i mniej wygodny dla samodzielnych crawlerów.

Na początek rozważymy, jak zbudować crawlera internetowego w Pythonie, ponieważ jest to zwykle optymalny wybór, ponieważ pozwala szybko wdrożyć i przetestować podstawową funkcjonalność.

Konfiguracja środowiska

Zacznij od zainstalowania Pythona ze strony oficjalna strona internetowa. Następnie zainstaluj podstawowe biblioteki, których będziesz używać: requests do wysyłania żądań HTTP i BeautifulSoup do analizowania HTML:


pip install requests beautifulsoup4

Warto również zorganizować strukturę projektu od samego początku: oddzielne pliki dla głównej logiki, konfiguracji i narzędzi. Dzięki temu przyszła konserwacja i skalowanie będą znacznie łatwiejsze.

Jak zbudować robota indeksującego (przykład kodu)

Podstawowy skrypt może składać się z trzech głównych części: wysyłania żądania, przetwarzania HTML i podążania za linkami.


from bs4 import BeautifulSoup
import time
import random

# Configuration
url = "https://quotes.toscrape.com/"  # Replace this with your target site
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                  "(KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
}
timeout = 5  # server response timeout
max_retries = 3  # maximum number of retries on errors
# You can add your proxy here if needed
proxies = {
    "http": "http://username:password@proxyserver:port",
    "https": "https://username:password@proxyserver:port"
}

# Function to check access via robots.txt
def can_crawl(base_url, path="/"):
    try:
        robots_url = base_url.rstrip("/") + "/robots.txt"
        r = requests.get(robots_url, headers=headers, timeout=timeout)
        if r.status_code == 200 and f"Disallow: {path}" in r.text:
            print(f"Service {path} forbidden for scraping robots.txt")
            return False
    except requests.RequestException:
        # If robots.txt is unavailable, continue
        pass
    return True

# Main logic
if can_crawl(url):
    for attempt in range(max_retries):
        try:
            response = requests.get(url, headers=headers, timeout=timeout, proxies=proxies)
            response.raise_for_status()

            soup = BeautifulSoup(response.text, 'lxml')

            # Collect links
            links = [a['href'] for a in soup.find_all('a', href=True)]  # You can change selector here
            print("Found links:", links)

            # Delay between requests to simulate more realistic behavior
            time.sleep(random.uniform(3, 7))  # better than a fixed 5-second delay
            break  # if everything succeeds, exit the retry loop

        except requests.RequestException as e:
            print(f"Request error (attempt {attempt+1}): {e}")
            wait = 2 ** attempt
            print(f"Waiting {wait} seconds before retry...")
            time.sleep(wait)
else:
    print("The crawler cannot process this resource due to robots.txt rules")

Ten skrypt pokazuje podstawowy przepływ pracy: wysyłanie żądania, analizowanie HTML i zbieranie linków.

Obsługa stronicowania i nawigacji w witrynie

W przypadku witryn wielostronicowych potrzebna jest pętla, która przechodzi przez wszystkie strony. Przykład:


for page in range(1, 6):
    url = f"https://google.com/page/{page}"
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'lxml')
    # data processing

Przestrzeganie Robots.txt i limitów stawek

Odpowiedzialne indeksowanie obejmuje sprawdzanie pliku robots.txt witryny i przestrzeganie jego reguł. Należy również wprowadzić opóźnienia między żądaniami, aby nie przeciążać serwera. Za pomocą funkcji time.sleep() można dodawać przerwy między pobraniami stron.


import time
from bs4 import BeautifulSoup

for page in range(1, 6):
    url = f"https://google.com/page/{page}"
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'lxml')
    # data processing
	
    time.sleep(5) # delay in seconds

Przechowywanie zebranych danych

Zebrane dane można przechowywać w wygodnych formatach, takich jak CSV lub JSON. Na przykład, aby zapisać listę linków:


import json

data = {"links": links}
with open("links.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

Wnioski

Postępując zgodnie z tymi krokami, otrzymasz podstawowy crawler internetowy, który możesz rozszerzyć do bardziej zaawansowanych zadań. Możesz skalować kod, zintegrować obsługę proxy, obsługiwać dużą liczbę stron lub przejść do bardziej wydajnych frameworków, takich jak Scrapy, dla złożonych scenariuszy gromadzenia danych.

Komentarze:

0 komentarze