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.

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!