[PYTHON] J'ai essayé de collecter des données sur un site Web avec Scrapy

J'ai fait quelques explorations et grattages de base avec Scrapy.

Ce que j'ai fait

Projet Scrapy pour obtenir le titre et le score total de l'animation d'hiver 2016 à partir du site de synthèse d'informations d'animation suivant https://www.anikore.jp/chronicle/2016/winter/

Procédure de création

Création de projet

https://doc.scrapy.org/en/1.2/intro/tutorial.html Comme vous pouvez le voir dans ce tutoriel original

% scrapy startproject project_name

Le projet sera créé en exécutant la commande à n'importe quel endroit. Cette fois, j'ai changé project_name en ```anime``.

Création d'araignée

Ensuite, créez un fichier Python qui sera un Spider (scraper) dans le répertoire spiders '' du projet. Cette fois, je l'ai nommé `ʻanime_spider.py.

Le produit fini ressemble à ceci:

anime_spider.py


import scrapy


class AnimeSpider(scrapy.Spider):
    name = "anime"
    start_urls = [
        'https://www.anikore.jp/chronicle/2016/winter/'
    ]

    def parse(self, response):
        for anime in response.css('div.animeSearchResultBody'):
            yield {
                'title': anime.css('span.animeTitle a::text').extract_first(),
                'score': anime.css('span.totalRank::text').extract_first()
            }

        next_page = response.css('a.next::attr(href)').extract_first()
        if next_page is not None:
            next_page = response.urljoin(next_page)
            yield scrapy.Request(next_page, callback=self.parse)

Nom de l'araignée

name = "anime"

C'est le nom de Spider. Lorsque vous effectuez un grattage, utilisez le nom déclaré ici comme suit.

% scrapy crawl anime

URL du point de départ de l'exploration

start_urls = [
    'https://www.anikore.jp/chronicle/2016/winter/'
]

Il s'agit de l'URL qui sera le point de départ de l'exploration. Cette fois, je veux obtenir une liste des animations d'hiver 2016, donc je la déclare en tête de l'animation d'hiver 2016.

Grattage

Le grattage et l'exploration sont effectués dans une fonction appelée parse (). Ci-dessous, la partie grattage.

for anime in response.css('div.animeSearchResultBody'):
    yield {
        'title': anime.css('span.animeTitle a::text').extract_first(),
        'score': anime.css('span.totalRank::text').extract_first()
    }

Dans Scrapy, vous pouvez accéder aux données avec css et xpath, mais cette fois je l'ai écrit avec css.

Sur ce site, chaque description de l'animation était séparée par la balise div de la classe ```animeSearchResultBody``, donc les informations de toutes les animations affichées sur la page sont acquises comme suit. Je vais.

response.css('div.animeSearchResultBody')

Je ne veux que le titre et l'évaluation globale des informations d'animation extraites, je vais donc les extraire comme suit.

yield {
    'title': anime.css('span.animeTitle a::text').extract_first(),
    'score': anime.css('span.totalRank::text').extract_first()
}

ʻExtract_first () ʻextrait le premier élément.

anime.css('span.animeTitle a::text')[0].extract()

Vous pouvez également y accéder par indice en tant que, mais je l'utilise car il empêche les erreurs d'index et renvoie None.

Rampant

L'exploration est effectuée aux endroits suivants.

next_page = response.css('a.next::attr(href)').extract_first()
if next_page is not None:
    next_page = response.urljoin(next_page)
    yield scrapy.Request(next_page, callback=self.parse)

L'URL de la page suivante est créée en spécifiant la chaîne de caractères href du bouton Suivant. En appelant la fonction parse () de manière récursive, toutes les pages seront explorées jusqu'à ce qu'il n'y ait plus de pages.

Courir

Enfin, exécutons le programme. J'ai introduit la commande d'exécution dans "Nom de l'araignée", mais j'ajouterai une option et la sortirai sous forme de fichier au format json. Tapez la commande suivante sous le répertoire du projet.

% scrapy crawl anime -o anime.json

J'ai obtenu le titre et la note globale de l'anime d'hiver 2016.

Publicité

Nous avons livré une vidéo qui explique brièvement Scrapy. Ici, nous grattons en utilisant XPath.

"Scrapy: Collectez automatiquement des informations sur les pages WEB !! Exploration et scraping framework" https://www.youtube.com/watch?v=Zfcukqxvia0&t=3s

Les références

https://doc.scrapy.org/en/1.2/intro/tutorial.html https://ja.wikipedia.org/wiki/ウェブスクレイピング

Recommended Posts

J'ai essayé de collecter des données sur un site Web avec Scrapy
J'ai essayé de lire les données d'un fichier en utilisant Node.js.
J'ai essayé de récupérer les données de conversation d'ASKfm
J'ai essayé l'analyse factorielle avec des données Titanic!
J'ai essayé un langage fonctionnel avec Python
[Bases de la science des données] J'ai essayé d'enregistrer de csv à mysql avec python
J'ai essayé d'envoyer un e-mail de fin d'inscription depuis Gmail avec django.
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé d'analyser les principaux composants avec les données du Titanic!
J'ai essayé DBM avec Pylearn 2 en utilisant des données artificielles
J'ai essayé d'utiliser la base de données (sqlite3) avec kivy
Extraire des données d'une page Web avec Python
J'ai essayé d'exécuter python à partir d'un fichier chauve-souris
J'ai essayé un RPA simple pour me connecter avec du sélénium
[Bases de la science des données] Collecte de données depuis RSS avec python
J'ai essayé de créer un cadre de données pandas en grattant les informations de rappel d'aliments avec Python
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
J'ai créé une fonction pour récupérer les données de la colonne de base de données par colonne en utilisant sql avec sqlite3 de python [sqlite3, sql, pandas]
J'ai essayé Learning-to-Rank avec Elasticsearch!
J'ai essayé le clustering avec PyCaret
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
J'ai essayé d'implémenter une ligne moyenne mobile de volume avec Quantx
J'ai essayé d'utiliser la bibliothèque Python de Ruby avec PyCall
J'ai essayé de créer diverses "données factices" avec Python faker
J'ai essayé d'envoyer un e-mail d'Amazon SES avec Python
J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov
[Linux] Copie des données de Linux vers Windows avec un script shell
J'ai essayé de remplacer le disque dur Windows 10 par un SSD plus petit
J'ai essayé de résoudre le problème d'optimisation des combinaisons avec Qiskit
J'ai essayé de commencer avec Hy ・ Définir une classe
Résumé Xpath lors de l'extraction de données d'un site Web avec Python Scrapy
Je veux installer le package de requirements.txt avec poésie
J'ai essayé de trier une colonne FizzBuzz aléatoire avec un tri à bulles.
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python
J'ai essayé d'écrire dans un modèle de langage profondément appris
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc
J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur
J'ai essayé de créer un générateur qui génère une classe conteneur C # à partir de CSV avec Python
J'ai essayé de créer un service qui vend des données apprises par machine à une vitesse explosive avec Docker
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé AdaNet pour les données de table
Quelles compétences devrais-je étudier en tant qu'analyste de données inexpérimenté?
Puis-je être un data scientist?
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de résumer des phrases avec summpy
Un mémorandum lors de l'acquisition automatique avec du sélénium
J'ai essayé webScraping avec python.
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de déplacer de la nourriture avec SinGAN
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai fait une loterie avec Python.
J'ai essayé de créer une liste de nombres premiers avec python
Obtenez des données de VPS MySQL avec Python 3 et SQL Alchemy
[Pandas] J'ai essayé d'analyser les données de ventes avec Python [Pour les débutants]