[PYTHON] Introduction à Scrapy (1)

Introduction à Scrapy (1)

introduction

Il existe différentes approches du scraping Web en Python. Dans cet article, nous prendrons Scrapy, un cadre pour le scraping, comme sujet et en apprendrons davantage sur Scrapy tout en créant un échantillon simple.

Qu'est-ce que Scrapy

Scarpy est un framework de grattage rapide et de haut niveau. Il a diverses fonctions liées à l'exploration et au grattage de sites Web. Les principales fonctions sont divisées en composants, et l'utilisateur crée des classes liées à chaque composant pour créer un programme.

コンポーネント図 De http://doc.scrapy.org/en/1.0/topics/architecture.html

Les principaux composants sont:

Scrapy Engine

Scheduler

Downloader

Spiders

Item Pipeline

Comme vous pouvez le voir, Scrapy a diverses fonctions. Cette fois, créez d'abord Spider, qui est le concept de base de Scrapy, Écrivons un programme pour afficher l'URL sur le calendrier de l'Avent sur Qiita.

Installation

Tout d'abord, installez avec pip.

pip install scrapy

Créer une araignée

Ensuite, créez Spider, qui est l'un des composants. Spider a un point de terminaison d'URL pour démarrer le processus d'exploration, Décrit le processus d'extraction de l'URL.

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

import scrapy


class QiitaSpider(scrapy.Spider):
    name = 'qiita_spider'

    #Endpoint (lister l'URL pour commencer l'exploration)
    start_urls = ['http://qiita.com/advent-calendar/2015/categories/programming_languages']

    custom_settings = {
        "DOWNLOAD_DELAY": 1,
    }

    #Décrivez le processus d'extraction d'URL
    def parse(self, response):
        for href in response.css('.adventCalendarList .adventCalendarList_calendarTitle > a::attr(href)'):
            full_url = response.urljoin(href.extract())

            #Créez une requête basée sur l'URL extraite et téléchargez-la
            yield scrapy.Request(full_url, callback=self.parse_item)

    #Créez un élément pour extraire et enregistrer le contenu en fonction de la page téléchargée
    def parse_item(self, response):

        urls = []
        for href in response.css('.adventCalendarItem_entry > a::attr(href)'):
            full_url = response.urljoin(href.extract())
            urls.append(full_url)

        yield {
            'title': response.css('h1::text').extract(),
            'urls': urls,
        }

Courir

Scrapy est livré avec de nombreuses commandes. Cette fois pour exécuter Spider Exécutez Spider à l'aide de la commande runspider. Vous pouvez utiliser l'option -o pour enregistrer le résultat créé par parse_item dans un fichier au format JSON.

scrapy runspider qiita_spider.py -o advent_calendar.json

résultat

Le résultat de l'exécution est le suivant. J'ai pu obtenir une liste des titres et des URL publiés de chaque calendrier de l'Avent!

{
    "urls": [
      "http://loboskobayashi.github.io/pythonsf/2015/12-01/recomending_PythonSf_one-liners_for_general_python_codes/",
      "http://qiita.com/csakatoku/items/444db2d0e421265ec106",
      "http://qiita.com/csakatoku/items/86904adaa0922e80069c",
      "http://qiita.com/Hironsan/items/fb6ee6b8e0291a7e5a1d",
      "http://qiita.com/csakatoku/items/77a36888d0851f6d4ff0",
      "http://qiita.com/csakatoku/items/a5b6c3604c0d411154fa",
      "http://qiita.com/sharow/items/21e421a2a40275ee9bb8",
      "http://qiita.com/Lspeciosum/items/d248b64d1bdcb8e39d32",
      "http://qiita.com/CS_Toku/items/353fd4b0fd9ed17dc152",
      "http://hideharaaws.hatenablog.com/entry/django-upgrade-16to18",
      "http://qiita.com/FGtatsuro/items/0efebb9b58374d16c5f0",
      "http://shinyorke.hatenablog.com/entry/2015/12/12/143121",
      "http://qiita.com/wrist/items/5759f894303e4364ebfd",
      "http://qiita.com/kimihiro_n/items/86e0a9e619720e57ecd8",
      "http://qiita.com/satoshi03/items/ae616dc080d085604b06",
      "http://qiita.com/CS_Toku/items/32028e65a8bfa97266d6",
      "http://fx-kirin.com/python/nfp-linear-reggression-model/"
    ],
    "title": [
      "Python \u305d\u306e2 Advent Calendar 2015"
    ]
  },
  {
    "urls": [
      "http://qiita.com/nasa9084/items/40f223b5b44f13ef2925",
      "http://studio3104.hatenablog.com/entry/2015/12/02/120957",
      "http://qiita.com/Tsutomu-KKE@github/items/29414e2d4f30b2bc94ae",
      "http://qiita.com/icoxfog417/items/913bb815d8d419148c33",
      "http://qiita.com/sakamotomsh/items/ab6c15b971587905ef43",
      "http://cocu.hatenablog.com/entry/2015/12/06/022100",
      "http://qiita.com/masashi127/items/ca092c13e1300f4f6ade",
      "http://qiita.com/kaneshin/items/269bc5f156d86f8a91c4",
      "http://qiita.com/wh11e7rue/items/15603e8970c36ab9733d",
      "http://qiita.com/ohkawa/items/368e6bcadc56a118adaf",
      "http://qiita.com/teitei_tk/items/5c5c9e653b3a13108d12",
      "http://sinhrks.hatenablog.com/entry/2015/12/13/215858"
    ],
    "title": [
      "Python Advent Calendar 2015"
    ]
  },

À la fin

Cette fois, j'ai créé Spider, qui est un composant de base de Scrapy, et j'ai effectué du grattage. Si vous utilisez Scrapy, le framework se chargera du traitement de routine lié à l'exploration. Par conséquent, les développeurs peuvent décrire et développer uniquement les parties qui sont vraiment nécessaires pour les services et les applications, telles que le traitement de l'extraction d'URL et le traitement du stockage de données. À partir de la prochaine fois, nous couvrirons le cache et enregistrerons le traitement. impatient de!

Introduction à Scrapy (2)

Recommended Posts

Introduction à Scrapy (1)
Introduction à Scrapy (3)
Introduction à Scrapy (2)
Introduction à Scrapy (4)
Introduction à MQTT (Introduction)
Premiers pas avec Supervisor
Introduction à Tkinter 1: Introduction
Introduction à PyQt
[Linux] Introduction à Linux
Introduction à discord.py (2)
Introduction à Lightning Pytorch
Premiers pas avec le Web Scraping
Introduction aux baies non paramétriques
Introduction à EV3 / MicroPython
Introduction au langage Python
Introduction à la reconnaissance d'image TensorFlow
Introduction à OpenCV (python) - (2)
Introduction à PyQt4 Partie 1
Introduction à l'injection de dépendances
Introduction à Private Chainer
Introduction à l'apprentissage automatique
AOJ Introduction à la programmation Sujet 1, Sujet 2, Sujet 3, Sujet 4
Introduction au module de papier électronique
Introduction à l'algorithme de recherche de dictionnaire
Introduction à la méthode Monte Carlo
[Mémorandum d'apprentissage] Introduction à vim
Introduction à PyTorch (1) Différenciation automatique
opencv-python Introduction au traitement d'image
Introduction à Python Django (2) Win
Introduction à l'écriture de Cython [Notes]
Introduction à Private TensorFlow
Une introduction à l'apprentissage automatique
[Introduction à cx_Oracle] Présentation de cx_Oracle
Une super introduction à Linux
introduction
AOJ Introduction à la programmation Sujet n ° 7, Sujet n ° 8
Introduction à la détection des anomalies 1 principes de base
Introduction à RDB avec sqlalchemy Ⅰ
[Introduction au système] Retracement de Fibonacci ♬
Introduction à l'optimisation non linéaire (I)
Introduction à la communication série [Python]
AOJ Introduction à la programmation Sujet n ° 5, Sujet n ° 6
Introduction au Deep Learning ~ Règles d'apprentissage ~
[Introduction à Python] <liste> [modifier le 22/02/2020]
Introduction à Python (version Python APG4b)
Une introduction à la programmation Python
[Introduction à cx_Oracle] (8e) version de cx_Oracle 8.0
Introduction à discord.py (3) Utilisation de la voix
Introduction à l'optimisation bayésienne
Apprentissage par renforcement profond 1 Introduction au renforcement de l'apprentissage
Super introduction à l'apprentissage automatique
Introduction à Ansible Part «Inventaire»
Série: Introduction à cx_Oracle Contents
[Introduction] Comment utiliser open3d
Introduction à Python pour, pendant
Introduction au Deep Learning ~ Rétropropagation ~
Introduction à Ansible Part ④'Variable '