GMOT
Nieuws:
 
*
Welkom, Gast. Alsjeblieft inloggen of registreren. 23 September 2019, 02:44:01


Login met gebruikersnaam, wachtwoord en sessielengte


Pagina's: [1]
  Print  
Advertenties


GameMotion
So far, so good
***

Berichten: 135


Bekijk profiel
« Gepost op: 31 Oktober 2015, 11:13:19 »

Hallo allemaal,

voor een informaticaproject op school moeten we een website maken. Nou vond ik dat een beetje makkelijk en wil ik nu dus een zoekmachine maken. Het is niet om Google na te maken, wat overigens erg lastig is, maar meer om er van te leren.

Nu ben ik dus bezig met de web crawler die ik los laat op https://en.wikipedia.org en zo ongeveer 100.000 pagina's laat indexeren.

Alleen ben ik er nog niet helemaal uit hoe ik dat het best kan doen, want bij bijvoorbeeld een Wikipedia artikel wil je als korte beschrijving dat het begin van het artikel erin komt (zoals Google ook heeft), maar andere sites hebben weer hele andere htmlstructuren (daarmee bedoel ik waar ze de tekst in zetten die ge´ndexeerd moet worden). Daarom is mijn vraag aan jullie wat lijkt jullie de meest handige methodes om goede beschrijvingen te vormen?
Gelogd

Bezig met een robot gebaseerd op Node.js

MBeentjes
Pretty addicted
*******

Berichten: 3.611


Bekijk profiel
« Antwoord #1 Gepost op: 31 Oktober 2015, 12:25:35 »

Je wilt dus pagina's van Wikipedia gaan indexeren. OkÚ, leuk idee! Wat wil je indexeren van zo een pagina? Wat zijn volgens jou de belangrijke elementen in zo'n pagina? Analyseer een pagina en bedenk je welke elementen belangrijk zijn en welke niet.

Nu je weet wat je het belangrijkst vind op de pagina, hoe is de achterliggende structuur van zo'n pagina? Hoe kun je volgens jou het beste achter die tekst/elementen komen? Misschien dat je de HTML kunt gebruiken en kunt kijken of de elementen meestal in dezelfde hiŰrarchie zit.

Schrijf je software om van 1 pagina de elementen te verkrijgen en in een datastructuur te stoppen. Programmeer goed en documenteer je handelingen, dan weet je ongeveer wat je doet. Als je het voor eentje kan, dan moet de rest ook kunnen.

Dan heb je een dataset die je kunt gebruiken om bijvoorbeeld in te zoeken naar zoekwoorden. Smiley



Ik zou per usecase uitzoeken wat je zou moeten doen om de benodigde data te verkrijgen, al doe je het in pseudocode.  



Kijk eens naar deze of deze presentatie.
« Laatste verandering: 31 Oktober 2015, 12:30:02 door MBeentjes » Gelogd

chiel99
Just the few of us
*****

Berichten: 917


Bekijk profiel WWW
« Antwoord #2 Gepost op: 31 Oktober 2015, 15:16:53 »

De websites geven zelf in de HTML aan wat ze als beschrijving willen d.m.v. meta tags.
Die kun je toch gewoon gebruiken? Dat doet Google ook, wanneer deze niet in de HTML staan pakt Google gewoon de eerste <p> tags tekst volgens mij.
Gelogd

@-wout
Administrator
Approaching infinity
*********

Berichten: 9.429



Bekijk profiel WWW
« Antwoord #3 Gepost op: 31 Oktober 2015, 16:41:13 »

Google heeft ondertussen hele uitgebreide technieken om dit te doen. Als ik jou was zou ik gewoon de meta-tags gebruiken.
Gelogd

GameMotion
So far, so good
***

Berichten: 135


Bekijk profiel
« Antwoord #4 Gepost op: 31 Oktober 2015, 19:49:29 »

Bedankt voor jullie reacties. Dit lijkt mij inderdaad ook wel de beste manier Smiley
Gelogd

Bezig met een robot gebaseerd op Node.js

Goudewup
Pretty addicted
*******

Berichten: 4.530


Viva la resistance!


Bekijk profiel
« Antwoord #5 Gepost op: 01 November 2015, 18:20:22 »

Je kan ook gewoon even Google hacken en hun crawler stelen. Of vragen hoe ze hem gemaakt hebben.
Gelogd


lucb1e
Approaching infinity
********

Berichten: 7.276



Bekijk profiel WWW
« Antwoord #6 Gepost op: 01 November 2015, 20:41:20 »

GameMotion, heel leuk idee!

Wist je dat Wikipedia open source is en zelf ook een zoekmachine heeft? Waarschijnlijk is het een beetje saai werk om dat na te bouwen, maar je kan misschien wel inspiratie opdoen Smiley

Wat ik zou doen is kijken welke resources er beschikbaar zijn en aan de hand daarvan de eisen bepalen. Normaliter doe je het andersom: bekijk wat je wilt maken en daarna ga je bij management vragen om het budget, maar op school krijg je niet bepaald een budget toegewezen Tongue

Je hebt waarschijnlijk je eigen laptop waar het op moet draaien. Als je een SSD hebt kun je waarschijnlijk niet meer dan 50GB missen, en de Engelse Wikipedia alleen al is 51GB (ongecomprimeerd). Dan heb je geen ruimte meer om een index te maken of andere slimme dingen. Naar dat soort dingen zou ik eerst kijken, dan weet je hoeveel data je op kan slaan (misschien kun je de eerste 5000 tekens van elk artikel pakken?) en vanuit daar bepalen hoe je die data gaat behandelen.
Gelogd

Sunnywout
Infinity
*********

Berichten: 17.710


speel mijn game


Bekijk profiel WWW
« Antwoord #7 Gepost op: 01 November 2015, 22:39:22 »

Volgens mij wil OP meer dan alleen wiki-artikelen opslaan.
Gelogd

shitposting is a lifestyle, not a disease

kaas1
Infinity
*********

Berichten: 19.942


LeesMij.txt


Bekijk profiel
« Antwoord #8 Gepost op: 01 November 2015, 22:42:54 »

Ja want die kan je ook gewoon van wikimedia downloaden :')
Gelogd


Goudewup
Pretty addicted
*******

Berichten: 4.530


Viva la resistance!


Bekijk profiel
« Antwoord #9 Gepost op: 01 November 2015, 22:48:15 »

Waar kan ik Wikipedia downloaden dan? Shocked
Gelogd


Maarten
Approaching infinity
********

Berichten: 8.274



Bekijk profiel
« Antwoord #10 Gepost op: 01 November 2015, 23:34:22 »

Waar kan ik Wikipedia downloaden dan? Shocked
https://www.mediawiki.org/wiki/MediaWiki
Gelogd

GameMotion
So far, so good
***

Berichten: 135


Bekijk profiel
« Antwoord #11 Gepost op: 04 November 2015, 15:32:18 »

Haha, ik was vergeten te zeggen dat ik wikipedia gebruik als seed page. Want zoals jullie vast wel weten heeft elk artikel altijd bronnen en verwijzingen naar andere websites en pagina's. Ook was het oorspronkelijke idee om een search engine te maken zoals Google (Niet zo uitgebreid natuurlijk, maar gewoon om te leren hoe ze dat nou doen), maar ik ben er al achtergekomen dat het gewoon veels te moeilijk is goeie samenvattende zinnetjes te vormen voor elke site en voor de verschilende soorten pagina's te checken of het een beveiligde pagina is etc.

Daarom heb ik het nu maar gelaten op Google Custom Search. Die werkt ook prima.

Misschien dat ik later nog wel een keer verder ga met mijn crawler.

PS: Voor de mensen die het trouwens interessant vinden hier is mijn source code:
Code:
import requests
import urllib.parse
import urllib.robotparser
from bs4 import BeautifulSoup
import os

url = "https://nl.wikipedia.org/?User-Agent=StartUP%21+Searchbot"

urls = [url]
visited = [url]
i = pages = count = 0

allowed_types = ['text/html', 'application/xhtml+xml']
allowed_exts = ['html', 'htm', 'xhtml', 'html5' 'php', 'asp', 'aspx', 'jsp', 'jspx']

file = open('index.html', 'wb+')

file.write("<!doctype html>\n<html>\n<body>\n<table>\n".encode('utf-8'))

while len(urls) > 0 and count < 10000:
    file.write("<tr>\n".encode('utf-8'))
    file.write("<td>".encode('utf-8')+urls[i].encode('utf-8')+"</td>\n".encode('utf-8'))
    try:
        headers = {
            'User-Agent': 'StartUP! Searchbot'
        }
        html = requests.get(urls[i], headers)
        htmltext = html.text
    except:
        print("error on "+urls[i]+" n:"+str(pages))
        urls.pop(i)
        continue
    soup = BeautifulSoup(htmltext, "html.parser")

    # check of we een html pagina bezoeken
    ctype = html.headers['content-type']
    if ctype:
        if ctype.find(';') > -1:
            ctype = ctype[:ctype.find(';')]
        if ctype not in allowed_types or html.status_code != 200:
            urls.pop(i)
            continue

    title = urls[i]
    print(title+" "+str(pages))
    if soup.select('head > title'):
        title = soup.head.title.get_text()
    print("Pagina "+str(pages)+": "+title)
    file.write("<td>Pagina ".encode('utf-8')+str(pages).encode('utf-8')+": ".encode('utf-8')+title.encode('utf-8')+"</td>\n".encode('utf-8'))

    # Zoek naar content
    desc = soup.find_all("meta", attrs={"name": "description"})
    paragraph = soup.find_all("p")
    if len(desc) > 0:
        summary = desc[0]['content']
    elif len(paragraph) > 0:
        summary = paragraph[0].get_text()
    else:
        urls.pop(i)
        continue

    #verkort de samenvatting
    if len(summary) > 60:
        summary = summary[:57] + "..."
    print("samenvatting: "+summary)
    file.write("<td>samenvatting: ".encode('utf-8')+summary.encode('utf-8')+"</td>".encode('utf-8'))

    url_parsed = urllib.parse.urlparse(urllib.parse.urldefrag(urls[i])[0])

    # we bekijken onze rechten door naar robots.txt te zoeken of de robots meta tag
    root_url = url_parsed._replace(path='')
    root_url = root_url.geturl()
    rp = urllib.robotparser.RobotFileParser()
    rp.set_url(urllib.parse.urljoin(root_url, "robots.txt"))
    rp.read()

    # loop door alle links
    for tag in soup.findAll('a',href=True):
        if tag.has_attr('rel') and tag['rel'] == "nofollow":
            continue
        tag_parsed = urllib.parse.urlparse(urllib.parse.urldefrag(tag['href'])[0])
        if not tag_parsed:
            continue

        # maak correcte URLs
        if tag_parsed[2].find('(') > -1:
            visited.append(tag['href'])
            continue
        if not tag_parsed [1]:
            tag['href'] = urllib.parse.urljoin(urls[i], tag_parsed[2])
            tag_parsed = urllib.parse.urlparse(tag['href'])
        else:
            if not tag_parsed[0]:
                tag_parsed = tag_parsed._replace(scheme=url_parsed[0])
        if not tag_parsed[2] and not tag_parsed[1][-1] == '/':
            tag_parsed = tag_parsed._replace(netloc=tag_parsed[1]+'/')
        root, ext = os.path.splitext(tag_parsed[2])
        if not ext and root and not root[-1] == '/':
            tag_parsed = tag_parsed._replace(path=tag_parsed[2]+'/')
        elif ext and ext not in allowed_exts:
            continue

        tag_parsed = tag_parsed._replace(query="")
        tag['href'] = tag_parsed.geturl()

        # check of de pagina niet al bezocht is
        if tag['href'] not in visited and rp.can_fetch("*", tag['href']):
            urls.append(tag['href'])
            visited.append(tag['href'])
            count+=1
    file.write("</tr>\n".encode('utf-8'))
    pages+=1
    urls.pop(i)
print("Pagina: "+str(pages))
file.write("</table>\n</body>\n</html>".encode('utf-8'))
file.close()
Gelogd

Bezig met een robot gebaseerd op Node.js

RA
Pretty addicted
*******

Berichten: 4.702



Bekijk profiel
« Antwoord #12 Gepost op: 20 November 2015, 22:39:58 »

Gebruik een XML parsen en vang de headings af. Deze geven informatie over het onderwerp. Doorzoek paragraphs etc. voor keywords en sla die informatie samen met een URL op in een database.

Bij een zoekopdracht match je de input met deze informatie. Bedenk een algoritme (vb: 10 punten voor een match op heading, 1 voor elk woord in een paragraaf) en sorteer je resultaten op het aantal punten.

Nu alleen nog ff aan elkaar typen  Smiley
Gelogd



Advertenties
Pagina's: [1]
  Print  

 
Ga naar:  

Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines | Smartphoneversie bekijken

Dilber MC Theme by HarzeM