[PYTHON] Sammeln Sie Daten mit Scrapy und füllen Sie mongoDB

Google sammelt Informationen von Suchmaschinen [Googlebot](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%BC%E3%82%B0%E3%83%AB%E3 % 83% 9C% E3% 83% 83% E3% 83% 88) wird verwendet. Ab einer bestimmten Website folgt sie automatisch den Links dieser Website und sammelt Informationen.

Sie können dasselbe mit dem Python-Modul Scrapy tun. Verwenden wir Scrapy, um Informationen über die Site zu sammeln.

Vorbereitung

Installieren Sie Scrapy mit pip. `$ pip install scrapy

Wie benutzt man

Scrapy wird projektweise verwaltet. Bearbeiten Sie nach dem Generieren des Projekts die folgenden Dateien, die dort automatisch generiert werden.

  1. items.py: Definieren Sie die extrahierten Daten
  2. Spider / Die folgenden Spider-Dateien (Crawler-Dateien): Patrouille, Datenextraktionsbedingungen
  3. pipelines.py: Ausgabeziel der extrahierten Daten. Diesmal mongoDB
  4. settings.py: Datenüberwachungsbedingungen (Häufigkeit, Hierarchie usw.)

Ein Projekt erstellen

Erstellen Sie zunächst ein Projekt. $ scrapy startproject tutorial Dann wird ein solcher Ordner erstellt.

tutorial/


tutorial/
    scrapy.cfg            # deploy configuration file

    tutorial/             # project's Python module, you'll import your code from here
        __init__.py

        items.py          # project items file

        pipelines.py      # project pipelines file

        settings.py       # project settings file

        spiders/          # a directory where you'll later put your spiders
            __init__.py
            ...

Definition der extrahierten Daten

Definieren Sie, was Sie erhalten. Dies ist die Definition des Feldes in der Datenbank.

items.py


import scrapy

class WebItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()
    date = scrapy.Field()

Eine Spinne erstellen

Dies ist eine blütenförmige Datei, die das Web crawlt und Daten extrahiert. Geben Sie die Startadresse der Patrouille, die Patrouillenbedingungen und die Datenextraktionsbedingungen an.

Spinnengeneration

Mach eine Spinne. Die Syntax lautet "$ Scrapy Genspider [Optionen] <Domäne>".

commandline


$ scrapy genspider webspider exsample.com
  Created spider 'webspider' using template 'basic' in module:
  tutorial.spiders.webspider

Die generierte Datei ist

tutorial/spiders/webspider.py


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

class WebspiderSpider(scrapy.Spider):
    name = "webspider"   #Der Name im Projekt. Wird verwendet, um eine Spinne beim Bewegen anzugeben
    allowed_domains = ["exsample.com"] #Domänenspezifikation für Patrouille OK
    start_urls = (
        'http://www.exsample.com/', #Fang hier an. Sie können mehrere in der Liste angeben.
    )

    def parse(self, response):  #Hier sind die Extraktionsbedingungen
        pass

Eine solche Datei wird generiert. Ändern Sie dies nach Ihren Wünschen.

tutorial/spiders/webspider.py


# -*- coding: utf-8 -*-
import scrapy
from tutorial.items import WebItem
import re
import datetime
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class WebspiderSpider(CrawlSpider):  #Der Klassenname hat keine Bedeutung
    name = 'WebspiderSpider'  #Das ist wichtig. Spinne mit diesem Namen(Crawler)Bewegung
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com']

    xpath = {
        'title' : "//title/text()",
    }

    list_allow = [r'(Reguläre Ausdrücke)'] #Links, die diese Bedingung erfüllen, werden überwacht
    list_deny = [
                r'/exsample/hogehoge/hoge/', #Dies ist ein Beispiel für die Angabe eines Links, der nicht umgeht. Listennotation ist ebenfalls möglich
            ]
    list_allow_parse = [r'(Reguläre Ausdrücke)']  #Linkspezifikation zum Extrahieren von Daten
    list_deny_parse = [                #Linkspezifikation ohne Datenextraktion
                r'(Reguläre Ausdrücke)',
                r'(Reguläre Ausdrücke)',
                ]

    rules = (
        #Patrouillenregeln.
        Rule(LinkExtractor(
            allow=list_allow,
            deny=list_deny,
            ),
            follow=True #Gehen Sie in diesen Link
        ),
        #Datenextraktionsregeln
        Rule(LinkExtractor(
            allow=list_allow_parse,
            deny=list_deny_parse,
            unique=True #Extrahieren Sie keine Daten am selben Verbindungsziel
            ),
            callback='parse_items' #Wenn die Bedingungen erfüllt sind, wird die hier angegebene Datenextraktionsausführungsfunktion ausgeführt.
        ),
    )

   #Definition der Datenextraktionsfunktion
   def parse_items(self, response): #Die Antwort enthält Website-Informationen
        item = WebItem()  # items.Klasse angegeben durch py
        item['title'] = response.xpath(self.xpath['title']).extract()[0]
        item['link'] = response.url
        item['date'] = datetime.datetime.utcnow() + datetime.timedelta(hours=9) #Aktuelle Uhrzeit. Es wird in Japan Zeit sein.

        yield item

Bitte beziehen Sie sich auf die Kommentare für das, was Sie schreiben.

Pipeline.py bearbeiten

Fügen Sie den Ertragsgegenstand der oben erstellten Spinne in mongoDB ein.

pipelines.py


from pymongo import MongoClient  #Verbindung mit mongoDB
import datetime

class TutorialPipeline(object):

    def __init__(self, mongo_uri, mongo_db, mongolab_user, mongolab_pass):
        #Variableninitialisierung mit den beim Erstellen der Instanz übergebenen Argumenten
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db
        self.mongolab_user = mongolab_user
        self.mongolab_pass = mongolab_pass

    @classmethod  #Sie können auf Klassenvariablen zugreifen, da das Argument eine Klasse enthält
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'), # settings.Zugriffsvariablen definiert durch py
            mongo_db=crawler.settings.get('MONGO_DATABASE', 'items'),
            mongolab_user=crawler.settings.get('MONGOLAB_USER'),
            mongolab_pass=crawler.settings.get('MONGOLAB_PASS')
        ) # def __init__Werden Sie ein Argument von

    def open_spider(self, spider): #Wird ausgeführt, wenn die Spinne startet. Datenbankverbindung
        self.client = MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]
        self.db.authenticate(self.mongolab_user, self.mongolab_pass)

    def close_spider(self, spider): #Am Ende der Spinne ausgeführt. Datenbankverbindung schließen
        self.client.close()

    def process_item(self, item, spider):
        self.db[self.collection_name].update(
            {u'link': item['link']},
            {"$set": dict(item)},
            upsert = True
        ) #Nach Link suchen, neu erstellen, wenn nicht, aktualisieren, wenn

        return item

Ich habe viel geschrieben, aber der Punkt ist, dass ich einfach die Datenbank öffne, die Daten stochere und sie schließe, wenn ich fertig bin.

settings.py Definieren Sie zunächst die verschiedenen Variablen, die Sie in pipelines.py aufrufen.

settings.py


MONGO_URI = 'hogehoge.mongolab.com:(Port-Nummer)'
MONGO_DATABASE = 'database_name'
MONGOLAB_USER = 'user_name'
MONGOLAB_PASS = 'password'

Dies ist ein Beispiel für Mongolab. Geben Sie in settings.py zusätzlich das Verhalten an.

settings.py


REDIRECT_MAX_TIMES = 6
RETRY_ENABLED = False
DOWNLOAD_DELAY=10
COOKIES_ENABLED=False

Hier ist die maximale Anzahl von Weiterleitungen auf 6 festgelegt, sodass keine erneuten Versuche ausgeführt werden, der Zugriff auf die Website alle 10 Sekunden festgelegt wird und keine Cookies gespeichert werden. Wenn Sie nicht "DOWNLOAD_DELAY" angeben, greifen Sie mit voller Leistung zu, was den Zielstandort stark belastet. Lass uns anhalten.

Lauf

Lass es uns laufen.

commandline


$ scrapy crawl WebspiderSpider

Wir werden den Links nacheinander folgen und Daten werden aus den Links extrahiert, die die Bedingungen erfüllen.

Recommended Posts

Sammeln Sie Daten mit Scrapy und füllen Sie mongoDB
Sammeln Sie Tweets mit tweepy in Python und speichern Sie sie in MongoDB
Sammeln Sie Produktinformationen und Prozessdaten mit der Rakuten-Produktsuch-API [Python].
Erstellen Sie Dummy-Daten mit den NumPy- und Faker-Paketen von Python
Datenanalyse mit xarray
Datenbereinigung 2 Datenbereinigung mit DataFrame
Datenbereinigung mit Python
Sammeln Sie Bilder mit icrawler
Visualisieren Sie die Pflanzenaktivität aus dem Weltraum mithilfe von Satellitendaten und Python
Erhalten Sie Daten mithilfe der API des Ministeriums für innere Angelegenheiten und Kommunikation
Hinzufügen neuer Daten (gerade Linien und Diagramme) mit matplotlib
Zeichnen Sie Zeitreihendaten in Python mit Pandas und Matplotlib
Analysieren Sie die Aktienkurse mithilfe der Pandas-Datenaggregation und der Gruppenoperationen
[Python] Zufällige Datenextraktion / -kombination aus DataFrame mit Random und Pandas