Logo of Scrapy.

Scrape een website met Python + Scrapy in 5 simpele stappen

In deze Python Scrapy tutorial leer je hoe je een eenvoudige webscraper in Python kan maken met behulp van het Scrapy framework. De Data Blogger website zal als voorbeeld worden gebruikt in dit artikel.

Scrapy: Een platform voor het extraheren van informatie van websites op een snelle, simpele en uitbreidbare manier.

Products from Amazon.com

    Introductie

    In deze tutorial gaan we een webscraper bouwen met behulp van Scrapy + Python 3 (of Python 2). De tutorial biedt ondersteuning voor zowel Python 2 als Python 3. The mogelijkheden zijn eindeloos. Let er op dat het scrapen van websites niet in alle gevallen legaal is!

    Content + Link extractor

    Het doel van Scrapy is om content (teksten en multimedia op webpagina’s) en links van een website af te halen. Dit wordt gedaan door recursief alle links op een website te volgen.

    Stap 1: Installeer Scrapy

    Volgens de website van Scrapy kunnen we met het volgende commando Scrapy installeren:

    pip install scrapy

    Stap 2: Begin een nieuw project

    Nu gaan we de mappenstructuur voor ons project aanmaken. Voor de Data Blogger scraper gebruiken we het volgende commando. Je kunt datablogger_scraper veranderen in de naam van jouw project.

    scrapy startproject datablogger_scraper

    Stap 3: Maak een Object

    Het volgende wat we gaan doen, is een spider aanmaken die onze website(s) naar keuze gaat crawlen. De spider moet weten welke data van de website afgehaald gaat worden. Deze data kunnen we in een object stoppen. In deze tutorial gaan we interne links crawlen van een website. Een link is een object met één bronpagina en één bestemmingspagina. Bijvoorbeeld, een link van de Data Blogger homepage naar de Google homepage heeft als bronpagina de Data Blogger homepage en als bestemmingspagina de Google homepage. De bronpagina is de pagina waar de link op gevonden kan worden. De bestemmingspagina is de pagina waar de link naar toe gaat als er op geklikt wordt. Een link is een interne link als zowel de bronpagina en bestemmingspagina op dezelfde website te vinden zijn. Bijvoorbeeld een link van de Data Blogger homepage naar de Data Blogger contact pagina.

    Scrape Object Implementatie

    Het object is geimplementeerd in het items.py script en dit script heeft de volgende inhoud:

    import scrapy
    
    class DatabloggerScraperItem(scrapy.Item):
        # De bronpagina
        url_from = scrapy.Field()
        # The bestemmingspagina
        url_to = scrapy.Field()

    Je kunt elk object wat je wilt crawlen hier implementeren. Het is bijvoorbeeld mogelijk een “Game Console” object te maken (met eigenschappen “verkoper”, “prijs” en “release datum”) wanneer je een website wilt scrapen over Game Consoles. Als je informatie over muziek wilt scrapen, zou je een object met eigenschappen als “artiest”, “release datum” en “genre” kunnen maken. Op LinkedIn zou je een object “Persoon” kunnen maken met eigenschappen “opleiding”, “werk” en “leeftijd”.

    Stap 4: Maak de Spider

    Nu we de benodigde data benoemd hebben (bronpagina en bestemmingspagina), kunnen we onze spider gaan maken. Eerst navigeren we naar onze project map. Daarna zullen we het volgende commando uitvoeren om de spider te maken. Deze is later terug te vinden in de spiders/ map.

    scrapy genspider datablogger data-blogger.com 

    Spider Implementeren

    Nu hebben we een template voor onze spider (spiders/datablogger.py). Dit bestand kun je aanpassen naar je eigen wensen. Mijn code ziet er als volgt uit:

    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.linkextractor import LinkExtractor
    from scrapy.spiders import Rule, CrawlSpider
    from datablogger_scraper.items import DatabloggerScraperItem
    
    
    class DatabloggerSpider(CrawlSpider):
        # De naam van de spider
        name = "datablogger"
    
        # De domeinen die zijn toegestaan (links naar andere domeinen worden overgeslagen)
        allowed_domains = ["data-blogger.com"]
    
        # Domeinen om op te starten
        start_urls = ["https://www.data-blogger.com/"]
    
        # De spider heeft één regel: zoek alle (unieke) links, volg ze en parse ze met behulp van de parse_items methode
        rules = [
            Rule(
                LinkExtractor(
                    canonicalize=True,
                    unique=True
                ),
                follow=True,
                callback="parse_items"
            )
        ]
    
        # Methode voor het starten van alle requests door alle URLs in start_urls te bezoeken
        def start_requests(self):
            for url in self.start_urls:
                yield scrapy.Request(url, callback=self.parse, dont_filter=True)
    
        # Methode voor het parsen (inlezen) van items
        def parse_items(self, response):
            # De lijst van items die gevonden zijn op een bepaalde pagina
            items = []
            # Haal alleen unieke links op
            links = LinkExtractor(canonicalize=True, unique=True).extract_links(response)
            # Neem alle links door
            for link in links:
                # Bekijk of het domein van de URL van de link is toegestaan door het domein te vergelijk met de domeinen in allowed_domains
                is_allowed = False
                for allowed_domain in self.allowed_domains:
                    if allowed_domain in link.url:
                        is_allowed = True
                # Wanneer het is toegestaan wordt een nieuw item gemaakt en toegevoegd aan de lijst van gevonden item
                if is_allowed:
                    item = DatabloggerScraperItem()
                    item['url_from'] = response.url
                    item['url_to'] = link.url
                    items.append(item)
            # Geef alle gevonden items terug
            return items

    Een paar opmerkingen. De crawler extend het CrawlSpider object. Dit object heeft een parse methode voor het recursief scrapen van een website. Er is slechts één regel vastgelegd. Deze regel vertelt de crawler dat alle gevonden (en toegestane) links moeten worden gevolgd. Deze regel vertelt ook dat alleen unieke links behandeld mogen worden. Dat zorgt ervoor dat er geen loops en andere onregelmatigheden plaatsvinden.

    LinkExtractor

    De LinkExtractor is een module met als doel links van webpagina’s te halen.

    Stap 5: Voer de Spider uit

    Navigeer naar de hoofdmap van je project. Voer dan het volgende commando uit:

    scrapy crawl datablogger -o links.csv -t csv

    Dit commando zorgt ervoor dat de spider je website crawlt en genereert een CSV bestand waarin de data wordt opgeslagen. Ik kreeg het volgende CSV bestand (links.csv) met de volgende inhoud:

    url_from,url_to
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/cern/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,http://www.data-blogger.com/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/data-science/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/software-science/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/mathematics/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/projects/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/competition/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/about-me/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/contact/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/hire-me/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/author/admin/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.facebook.com/sharer/sharer.php?t=Monitoring+your+cluster+in+just+a+few+minutes+using+ISA&u=https%3A%2F%2Fwww.data-blogger.com%2F2016%2F07%2F18%2Fmonitoring-your-cluster-in-just-a-few-minutes%2F
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://twitter.com/intent/tweet?text=Monitoring+your+cluster+in+just+a+few+minutes+using+ISA&url=https%3A%2F%2Fwww.data-blogger.com%2F2016%2F07%2F18%2Fmonitoring-your-cluster-in-just-a-few-minutes%2F
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://plus.google.com/share?url=https%3A%2F%2Fwww.data-blogger.com%2F2016%2F07%2F18%2Fmonitoring-your-cluster-in-just-a-few-minutes%2F
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/tag/cluster/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/tag/isa/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/tag/monitoring/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/tag/software/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/07/17/cern-deel-3-trip-naar-zurich/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/07/19/project-euler-using-scala-problem-1/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/08/13/apache-flink-the-next-distributed-data-processing-revolution/
    https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/07/24/summing-the-fibonacci-sequence/
    https://www.data-blogger.com/2016/07/17/why-scala/,https://www.data-blogger.com/2016/07/17/why-scala/
    https://www.data-blogger.com/2016/07/17/why-scala/,https://www.data-blogger.com/
    ...

    Conclusie

    Het is relatief eenvoudig om een spider te schrijven met behulp van Scrapy. Je kunt zelf aangeven welke gegevens gescraped moeten worden met behulp van een object. Voel je vrij om een vraag of opmerking achter te laten in het comments gedeelte!