[PYTHON] Einführung in Scrapy (1)

Einführung in Scrapy (1)

Einführung

In Python gibt es verschiedene Ansätze zum Web-Scraping. In diesem Artikel nehmen wir Scrapy, ein Framework zum Scraping, als Thema und lernen Scrapy kennen, während wir tatsächlich ein einfaches Beispiel erstellen.

Was ist Scrapy?

Scarpy ist ein schnelles High-Level-Scraping-Framework. Es hat verschiedene Funktionen im Zusammenhang mit dem Crawlen und Scraping von Websites. Die Hauptfunktionen sind in Komponenten unterteilt, und der Benutzer erstellt Klassen für jede Komponente, um ein Programm zu erstellen.

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

Die Hauptkomponenten sind:

Scrapy Engine

Scheduler

Downloader

Spiders

Item Pipeline

Wie Sie sehen können, hat Scrapy verschiedene Funktionen. Erstellen Sie dieses Mal zuerst Spider, das das Grundkonzept von Scrapy ist. Schreiben wir ein Programm, um die URL im Adventskalender von Qiita zu veröffentlichen.

Installation

Zuerst mit pip installieren.

pip install scrapy

Eine Spinne erstellen

Erstellen Sie als Nächstes Spider, eine der Komponenten. Spider hat einen URL-Endpunkt, um den Crawling-Prozess zu starten. Beschreibt den Vorgang zum Extrahieren der URL.

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

import scrapy


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

    #Endpunkt (Liste der URL, mit der das Crawlen gestartet werden soll)
    start_urls = ['http://qiita.com/advent-calendar/2015/categories/programming_languages']

    custom_settings = {
        "DOWNLOAD_DELAY": 1,
    }

    #Beschreiben des URL-Extraktionsprozesses
    def parse(self, response):
        for href in response.css('.adventCalendarList .adventCalendarList_calendarTitle > a::attr(href)'):
            full_url = response.urljoin(href.extract())

            #Erstellen Sie eine Anfrage basierend auf der extrahierten URL und laden Sie sie herunter
            yield scrapy.Request(full_url, callback=self.parse_item)

    #Erstellen Sie ein Element, um den Inhalt basierend auf der heruntergeladenen Seite zu extrahieren und zu speichern
    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,
        }

Lauf

Scrapy enthält viele Befehle. Diesmal um Spider zu starten Führen Sie Spider mit dem Befehl runspider aus. Mit der Option -o können Sie das von parse_item erstellte Ergebnis in einer Datei im JSON-Format speichern.

scrapy runspider qiita_spider.py -o advent_calendar.json

Ergebnis

Das Ausführungsergebnis ist wie folgt. Ich konnte eine Liste mit Titeln und geposteten URLs für jeden Adventskalender erhalten!

{
    "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"
    ]
  },

Am Ende

Dieses Mal habe ich Spider erstellt, eine grundlegende Komponente von Scrapy, und das Scraping durchgeführt. Wenn Sie Scrapy verwenden, übernimmt das Framework die routinemäßige Verarbeitung im Zusammenhang mit dem Crawlen. Daher können Entwickler nur die Teile beschreiben und entwickeln, die für Dienste und Anwendungen wirklich erforderlich sind, z. B. die URL-Extraktionsverarbeitung und die Datenspeicherverarbeitung. Ab dem nächsten Mal werden wir den Cache abdecken und die Verarbeitung speichern. freue mich auf!

Einführung in Scrapy (2)

Recommended Posts

Einführung in Scrapy (1)
Einführung in Scrapy (3)
Einführung in Scrapy (2)
Einführung in Scrapy (4)
Einführung in MQTT (Einführung)
Erste Schritte mit Supervisor
Einführung in Tkinter 1: Einführung
Einführung in PyQt
[Linux] Einführung in Linux
Einführung in discord.py (2)
Einführung in Lightning Pytorch
Erste Schritte mit Web Scraping
Einführung in nichtparametrische Felder
Einführung in EV3 / MicroPython
Einführung in die Python-Sprache
Einführung in die TensorFlow-Bilderkennung
Einführung in OpenCV (Python) - (2)
Einführung in PyQt4 Teil 1
Einführung in die Abhängigkeitsinjektion
Einführung in Private Chainer
Einführung in das maschinelle Lernen
AOJ Einführung in die Programmierung Thema Nr. 1, Thema Nr. 2, Thema Nr. 3, Thema Nr. 4
Einführung in das elektronische Papiermodul
Einführung in den Wörterbuch-Suchalgorithmus
Einführung in die Monte-Carlo-Methode
[Lernmemorandum] Einführung in vim
Einführung in PyTorch (1) Automatische Differenzierung
opencv-python Einführung in die Bildverarbeitung
Einführung in Python Django (2) Win
Einführung in das Schreiben von Cython [Notizen]
Einführung in Private TensorFlow
Eine Einführung in das maschinelle Lernen
[Einführung in cx_Oracle] Übersicht über cx_Oracle
Eine super Einführung in Linux
Einführung
AOJ Einführung in die Programmierung Thema Nr. 7, Thema Nr. 8
Einführung in die Anomalieerkennung 1 Grundlagen
Einführung in RDB mit sqlalchemy Ⅰ
[Einführung in Systre] Fibonacci Retracement ♬
Einführung in die nichtlineare Optimierung (I)
Einführung in die serielle Kommunikation [Python]
AOJ Einführung in die Programmierung Thema Nr. 5, Thema Nr. 6
Einführung in Deep Learning ~ Lernregeln ~
[Einführung in Python] <Liste> [Bearbeiten: 22.02.2020]
Einführung in Python (Python-Version APG4b)
Eine Einführung in die Python-Programmierung
[Einführung in cx_Oracle] (8.) Version cx_Oracle 8.0
Einführung in discord.py (3) Verwenden von Stimme
Einführung in die Bayes'sche Optimierung
Tiefe Stärkung des Lernens 1 Einführung in die Stärkung des Lernens
Super Einführung in das maschinelle Lernen
Einführung in Ansible Teil In'Inventory '
Serie: Einführung in den Inhalt von cx_Oracle
[Einführung] Verwendung von open3d
Einführung in Python For, While
Einführung in Deep Learning ~ Backpropagation ~
Einführung in Ansible Teil ④'Variable '