[PYTHON] Grattage Web facile avec Scrapy

Nous avons décrit de manière facile à comprendre comment exécuter Scrapy, un framework qui permet le scraping Web. Je suis heureux que vous puissiez l'utiliser comme référence.

référence: Python --Créez un robot d'exploration à l'aide de Scrapy https://qiita.com/naka-j/items/4b2136b7b5a4e2432da8

Temps requis 15 minutes Contenu

  1. Installez Scrapy et créez un projet
  2. À propos de Spider
  3. Obtenons réellement les informations de la page Web!

1. Installez Scrapy et créez un projet

Exécutez le pip suivant sur le terminal pour installer scrapy

pip install scrapy

Accédez ensuite au répertoire dans lequel vous souhaitez créer le projet scrapy et procédez comme suit

scrapy startproject sake

Après cela, je vais gratter le site Web lié au saké, j'ai donc changé le nom du projet en "saké". Ensuite, les dossiers suivants seront configurés sous le répertoire courant.

Screen Shot 2020-04-09 at 11.52.09.png

2. À propos de Spider

Le scraping Web n'est pas possible avec le fichier ci-dessus seul, alors entrez la commande suivante et entrez la commande suivante Créez des fichiers dans le répertoire spiders.

#scrapy genspider <nom de fichier> <URL Web que vous souhaitez extraire>
scrapy genspider scrapy_sake https://www.saketime.jp/ranking/

Ensuite, vous pouvez voir qu'un fichier appelé "scrapy_sake.py" est créé dans le répertoire spiders. Screen Shot 2020-04-09 at 11.57.12.png Le contenu du fichier créé est le suivant.

sake/sake/spiders/scrapy_sake.py


# -*- coding: utf-8 -*-
import scrapy


class ScrapySakeSpider(scrapy.Spider):
    name = 'scrapy_sake'
    allowed_domains = ['https://www.saketime.jp/ranking/']
    start_urls = ['http://https://www.saketime.jp/ranking/']

    def parse(self, response):
        pass

Comme je l'expliquerai en détail plus tard, je coderai principalement cette partie "def parse". Avant de coder, assurez-vous que vous pouvez obtenir les informations Web avec précision. Ajoutez une instruction d'impression à la partie "def parse" pour voir les informations acquises.

sake/sake/spiders/scrapy_sake.py


# -*- coding: utf-8 -*-
import scrapy


class ScrapySakeSpider(scrapy.Spider):
    name = 'scrapy_sake'
    allowed_domains = ['https://www.saketime.jp/ranking/']
    start_urls = ['http://https://www.saketime.jp/ranking/']

    def parse(self, response):
        #Supprimer le pass et ajouter un relevé d'impression
        print(response)

Et si vous exécutez la commande suivante, une grande partie de la sortie sera renvoyée, mais vous pouvez confirmer que vous pouvez y intégrer fermement le HTML.

Commande d'exécution


#scrapy crawl <nom de fichier>
scrapy crawl scrapy_sake

Production



               <li class="brand_review clearfix">
                <div>
                  <p>
Iso's pride, livre spécial brassé saké cru

Cliquez ici pour le saké d'aujourd'hui, le saké cru brassé spécial Honjo dont Iso est fier!
Riz...                    <br>
                    <span class="brand_review_user">
                      by
                      <span>poursuivre en justice</span>
                      <span>
                        <span class="review-star">★</span>
                        <span>4.5</span>
                      </span>
                      <span class="reviewtime">
                        <span>23 mars 2020</span>
                      </span>
                    </span>

                  </p>
                </div>
              </li>
                                        </ul>
          </a>
                  </div>
:
:
:
'scheduler/dequeued': 1,
 'scheduler/dequeued/memory': 1,
 'scheduler/enqueued': 1,
 'scheduler/enqueued/memory': 1,
 'start_time': datetime.datetime(2020, 4, 9, 3, 23, 24, 461847)}
2020-04-09 12:23:26 [scrapy.core.engine] INFO: Spider closed (finished)

Ensuite, extrayons uniquement les informations nécessaires d'ici!

3. Obtenons réellement les informations de la page Web!

En gros, il n'y a que deux fichiers implémentés par scrapy:

Commençons par modifier à partir de item.py. Lorsque vous l'ouvrez pour la première fois, il ressemblera au fichier ci-dessous.

sake/items.py


# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy

class SakeItem(scrapy.Item):
    pass

Enregistrez arbitrairement les informations que vous souhaitez obtenir avec scrapy dans cette partie de classe.

sake/items.py


# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class SakeItem(scrapy.Item):
    #Nom de l'information que vous souhaitez obtenir(Tout) = scrapy.Field()
    prefecture_maker = scrapy.Field()
    prefecture = scrapy.Field()
    maker = scrapy.Field()
    brand = scrapy.Field()
    pass

C'est la fin de la description de items.py. Ensuite, passons au codage scrapy_sake.py.

Le formulaire rempli est le suivant. Je pense que l'intérieur de def parse () est plus riche que celui vu au chapitre 2 ci-dessus.

sake/sake/spiders/scrapy_sake.py


# -*- coding: utf-8 -*-
import scrapy
#items.N'oubliez pas d'importer py
from sake.items import SakeItem

class ScrapySakeSpider(scrapy.Spider):
    name = 'scrapy_sake'
    #allowed_domains = ['ja.wikipedia.org']
    start_urls = ['https://www.saketime.jp/ranking/']
    
    def parse(self, response):
        items = []
        #tag html li.Les informations sur le saké japonais étaient stockées dans un endroit appelé clearfix.
        sakes = response.css("li.clearfix")

        #Plusieurs li dans la page.Regardons chaque clearfix
        for sake in sakes:
            #item.Déclarer un objet SakeItem défini dans py
            item = SakeItem()
            item["prefecture_maker"] = sake.css("div.col-center p.brand_info::text").extract_first()

            #<div class="headline clearfix">Dans le cas d'une description comme,headline.Entre les deux comme clearfix.Mettre
            item["brand"] = sake.css("div.headline.clearfix h2 a span::text").extract_first()

            #Nettoyer les données acquises
            if (item["prefecture_maker"] is not None) or (item["brand"] is not None):
                #Supprimer \ n et espaces
                item["prefecture_maker"] = item["prefecture_maker"].replace(' ','').replace('\n','')
                #Séparation de la préfecture et du fabricant
                item["prefecture"] = item["prefecture_maker"].split('|')[0]
                item["maker"] = item["prefecture_maker"].split('|')[1]
                items.append(item) 
        print(items)

    #Refléter le changement de page avec un traitement récursif
        #une balise rel="next"Obtenez les éléments de
        next_page = response.css('a[rel="next"]::attr(href)').extract_first()
        if next_page is not None:
            #Convertir en chemin absolu si l'URL est un chemin relatif
            next_page = response.urljoin(next_page)
            #Demande de retour une fois avec yield, les sakés sont enregistrés sur la page après la demande, et l'instruction for ci-dessus est exécutée à nouveau
            yield scrapy.Request(next_page, callback=self.parse)

Lorsque ceux-ci seront exécutés, ce sera comme suit.

:
:
:
2020-04-10 16:52:58 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://www.saketime.jp/ranking/page:110/> from <GET https://www.saketime.jp/ranking/page:110>
2020-04-10 16:52:59 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.saketime.jp/ranking/page:110/> (referer: https://www.saketime.jp/ranking/page:109/)
[{'brand': 'Langue d'Orochi',
 'maker': 'Brasserie de saké Kiji',
 'prefecture': 'Shimane',
 'prefecture_maker': 'Shimane|Brasserie de saké Kiji'}, {'brand': '禱 et Minoru',
 'maker': 'Fukumitsuya',
 'prefecture': 'Ishikawa',
 'prefecture_maker': 'Ishikawa|Fukumitsuya'}, {'brand': 'Beauté Kanazawa',
 'maker': 'Fukumitsuya',
 'prefecture': 'Ishikawa',
 'prefecture_maker': 'Ishikawa|Fukumitsuya'}, {'brand': 'Jinkuro',
 'maker': 'Brasserie de saké Kitayuki',
 'prefecture': 'Niigata',
 'prefecture_maker': 'Niigata|Brasserie de saké Kitayuki'}, {'brand': 'Kenroku Sakura',
 'maker': 'Brasserie de saké Nakamura',
 'prefecture': 'Ishikawa',
 'prefecture_maker': 'Ishikawa|Brasserie de saké Nakamura'}, {'brand': 'naissance',
 'maker': 'Tohoku Meijo',
 'prefecture': 'Yamagata',
 'prefecture_maker': 'Yamagata|Tohoku Meijo'}, {'brand': 'SUMMERGODDESS',
 'maker': 'Brasserie de saké Mana Tsuru',
 'prefecture': 'Fukui',
:
:
:
 'scheduler/dequeued/memory': 221,
 'scheduler/enqueued': 221,
 'scheduler/enqueued/memory': 221,
 'start_time': datetime.datetime(2020, 4, 10, 7, 51, 13, 756973)}
2020-04-10 16:53:00 [scrapy.core.engine] INFO: Spider closed (finished)

J'ai obtenu 110 pages d'informations sur le saké japonais au format JSON en 20 secondes environ. C'est pratique.

Essayez de gratter les sites qui vous intéressent pour obtenir des informations.

Note

Bien qu'il s'agisse d'informations de base, il est possible d'afficher les informations html du site que vous souhaitez gratter avec cmd + option + i dans le cas du navigateur chrome et macOS. Vous pouvez également appuyer sur cmd + shift + c pour cliquer sur un élément du site pour voir où il représente dans le code html. Screen Shot 2020-04-10 at 17.09.44.png

Recommended Posts

Grattage Web facile avec Scrapy
Grattage avec coquille tremblante
Scraping Web facile avec Python et Ruby
Web scraping avec python + JupyterLab
Grattage festif avec Python, scrapy
Enregistrez des images avec le web scraping
Web scraping débutant avec python
raclage Web
Grattage WEB avec BeautifulSoup4 (page en couches)
Web scraping avec Python Première étape
J'ai essayé webScraping avec python.
Grattage au sélénium
Grattage avec Python
Grattage WEB avec Python (pour mémo personnel)
Grattage avec Python
Premiers pas avec Python Web Scraping Practice
grattage Web (prototype)
L'accès https via un proxy dans le scraping Web Python était facile avec les demandes
Grattage avec du sélénium
[Note personnelle] Scraping de pages Web en python3
Site de courses de chevaux Web scraping avec Python
Premiers pas avec Python Web Scraping Practice
Application Web facile avec Python + Flask + Heroku
Pratiquer le web scraping avec Python et Selenium
Grattage WEB avec BeautifulSoup4 (page du numéro de série)
[Pour les débutants] Essayez le web scraping avec Python
Exécutez régulièrement le scraping WEB avec AWS-Lambda + Python + Cron
Web scraping avec Python (prévisions météo)
Web scraping avec Python (cours de l'action)
Grattage réussi avec Selenium
Easy Grad-CAM avec pytorch-gradcam
Grattage en Python (préparation)
Essayez de gratter avec Python.
Grattage avec Python + PhantomJS
Premiers pas avec le Web Scraping
Problèmes lors de l'installation de Scrapy
Grattage avec du sélénium [Python]
Scraping avec Python + PyQuery
Gratter avec une belle soupe
Débogage facile avec ipdb
Scraping RSS avec Python
TopView facile avec OpenCV
Analyse de données pour améliorer POG 1 ~ Web scraping avec Python ~
Grattage facile avec Python (version compatible JavaScript / Proxy / Cookie)
Apprentissage automatique facile avec scikit-learn et flask ✕ Application Web
Les débutants en Python sont bloqués dans leur premier scraping Web
J'ai essayé de gratter avec Python
Télécharger automatiquement des images avec grattage
Environnement toxique facile avec Jenkins
Grattage au sélénium en Python
Grattage avec Selenium + Python Partie 1
[Analyse de co-occurrence] Analyse de co-occurrence facile avec Python! [Python]
Construction et déploiement faciles du serveur Web avec EB CLI + git + Django
Développement d'applications Web avec Flask
Synchronisation facile des dossiers avec Python
Technologie de grattage WEB et préoccupations
Créer une application Web avec Django