Scraping mit Python-Einführung in Scrapy Erster 2. Schritt

Hintergrund

Ich habe kürzlich von der Existenz von Scrapy erfahren, einem Scraping-Framework von Python, und es war das stärkste, als ich es berührte. Die spezifischen guten Punkte sind wie folgt.

Die folgenden Artikel sind für die Übersicht und Einführung sehr hilfreich.

Zweck dieses Artikels

Der obige Artikel reicht für die Gliederung und Einführung aus, aber ich habe einige zusätzliche Punkte zusammengefasst, die ich brauche, wenn ich versuche, verschiedene Dinge selbst zu tun. Ich habe den Inhalt des obigen Artikels nicht geschrieben, daher halte ich es für eine gute Idee, ihn zuerst zu lesen.

Es wird in Form der Einführung der entsprechenden Seite von Official Reference und deren Ergänzung geschrieben.

die Architektur

Das Framework ist praktisch, aber wenn Sie es verwenden, ohne die interne Struktur zu kennen, ist es sehr verschwommen. Beginnen wir also mit einer Übersicht. Eine Übersicht finden Sie unter dieser Seite.

Scrapy architecture overview

Component Scrapy Engine Der Teil, der die Datenverarbeitung des gesamten Frameworks steuert.

Scheduler Der Teil, der Anforderungen an Seiten als Warteschlange verwaltet. Empfängt ein Scrapy.Request-Objekt (ein Objekt mit URL- und Rückruffunktionen), stellt es in eine Warteschlange und gibt die Warteschlange zurück, wenn dies von der Engine angefordert wird.

Downloader Der Teil, der auf die eigentliche Webseite zugreift. Holen Sie sich die Webseite und geben Sie sie an Spider weiter.

Spiders Der Teil, der die abgerufenen Webseitendaten verarbeitet. Der Benutzer muss die Verarbeitung dieses Teils selbst anpassen. Die Verarbeitung, die geschrieben werden kann, ist grob in die folgenden zwei Typen unterteilt

Item Pipeline Der Teil, der die von Spider extrahierten Daten des Elements verarbeitet. Datenbereinigung, Validierung, Speichern in Dateien und DB.

Middlewares Da es vor und nach Downloader und Spider Middleware-Ebenen gibt, ist es möglich, dort die Verarbeitung einzufügen.

Dinge zu beachten

Grundsätzlich müssen Sie nur ** die Verarbeitung in Spider, die Definition der Elementklasse, die Einstellungen für die Elementpipeline und andere Grundeinstellungen ** schreiben. (Wenn Sie es erweitern möchten, können Sie natürlich mit anderen spielen.)

Darüber hinaus wird die ** Reihe des Flusses "Daten von einer Webseite herunterladen, irgendwo speichern und dann der nächsten Seite folgen" zu einer Komponente gemacht und asynchron verarbeitet **. In diesem Sinne können Sie verstehen, was passiert, wenn Sie ein Scrapy.Request-Objekt in Spider erstellen und an die Scrapy Engine übergeben, um die nächste Seite anzugeben.

Datenfluss

Der gesamte Datenfluss ist wie folgt.

  1. Zuerst erhält Engine die Start-URL und übergibt das Request-Objekt mit dieser URL an den Scheduler.
  2. Engine fragt den Scheduler nach der folgenden URL
  3. Der Scheduler gibt die folgende URL zurück und die Engine übergibt sie an den Downloader
  4. Der Downloader ruft Seitendaten ab und gibt das Antwortobjekt an Engine zurück
  5. Der Motor erhält eine Antwort und leitet sie an Spider weiter
  6. Spider analysiert die Seitendaten und gibt ** ein Item-Objekt mit den Daten ** und ein ** Antwortobjekt ** mit der URL zurück, die an die Engine gesendet werden soll.
  7. Die Engine empfängt sie und übergibt das Item-Objekt an die Item-Pipeline und das Request-Objekt an den Scheduler.
  8. Wiederholen Sie die Schritte 2 bis 7, bis die Warteschlange erschöpft ist

Wenn Sie die Architektur verstehen, können Sie den gesamten Ablauf klar verstehen.

Selector Mit Scrapy können Sie CSS-Selektoren und XPath verwenden, um die Elemente der gecrawlten Seite abzurufen. Die offizielle Referenz ist hier.

Ich benutze dies, weil XPath Ihnen mehr Flexibilität bietet. Die folgenden Artikel und offiziellen Referenzen sind hilfreich.

So debuggen Sie

Die offizielle Referenz ist hier.

Scrapy Shell Scrapy verfügt über eine praktische Debugging-Funktion namens Scrapy Shell.

Wenn Sie Scrapy Shell starten, indem Sie die URL der Webseite angeben, die Sie abrufen möchten, startet ipython mit einigen Scrapy-Objekten, z. B. der Antwort von Downloader. In diesem Zustand können Sie den in Spider geschriebenen Selector-Code debuggen.

% scrapy shell "https://gunosy.com/"
2016-09-05 10:38:56 [scrapy] INFO: Scrapy 1.1.2 started (bot: gunosynews)
2016-09-05 10:38:56 [scrapy] INFO: Overridden settings: {'LOGSTATS_INTERVAL': 0, 'NEWSPIDER_MODULE': 'gunosynews.spiders', 'DOWNLOAD_DELAY': 3, 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['gunosynews.spiders'], 'DUPEFILTER_CLASS': 'scrapy.dupefilters.BaseDupeFilter', 'BOT_NAME': 'gunosynews'}
---
2016-09-05 10:38:56 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
2016-09-05 10:38:56 [scrapy] INFO: Spider opened
2016-09-05 10:38:57 [scrapy] DEBUG: Crawled (200) <GET https://gunosy.com/robots.txt> (referer: None)
2016-09-05 10:39:01 [scrapy] DEBUG: Crawled (200) <GET https://gunosy.com/> (referer: None)

##↓ In Scrapy Shell verfügbare Scrapy-Objekte
[s] Available Scrapy objects:
[s]   crawler    <scrapy.crawler.Crawler object at 0x10ff54fd0>
[s]   item       {}
[s]   request    <GET https://gunosy.com/>
[s]   response   <200 https://gunosy.com/>
[s]   settings   <scrapy.settings.Settings object at 0x110b0ef28>
[s]   spider     <GunosynewsSpider 'gunosy' at 0x110d40d68>
[s] Useful shortcuts:
[s]   shelp()           Shell help (print this help)
[s]   fetch(req_or_url) Fetch request (or URL) and update local objects
[s]   view(response)    View response in a browser

##↓ Prüfen Sie, ob Sie wie erwartet erhalten können
>>> response.xpath('//div[@class="list_title"]/*/text()').extract()
['Sanada Maru "Inubushi" wird mit Lob "Wundervolle Zeiten" überschwemmt "Tränen hören nicht auf"...Stimme der Bewunderung für Oizumis Leistung', 'Sie können weinen, wenn Kairos auf einem 10 km langen Ei erscheint! Die 10 km, die Sie gelaufen sind, waren verschwendet! Pokemon GO1...', '"Ame Talk!" Am Sonntag zweimal pro Woche zu Golden vorrücken, was am Donnerstag um Mitternacht ungewöhnlich ist', 'Sagan Tosu Toyoda Überraschung Auftritt beim Local School Cultural Festival AKB und Hepatitis Prevention PR', 'Kengo Nishioka, das Zentrum von Majipuri, sagte "PON!"Ich werde mein Bestes geben für den ersten" Wetterbruder "!"', 'Die Vereinigten Staaten achten auf Nishikioris Rückhand, die sich zu den besten 16 entwickelt hat!', 'Ichiro trifft 2 Spiele hintereinander! "4" auf Platz 26 in der Geschichte mit insgesamt 3016 Treffern', 'KO Verteidigung=Takashi Inoue, der Rückenschmerzen hatte-WBO / S Fliegenklasse', 'Terashima und Fujihira sind die stärksten Pitcher in Japan in der High School.', 'Ichiros erster Fehltritt seit zwei Spielzeiten Der US-Kommentator tobt über Aces fahrlässiges Stück "Jose's Responsibility".', 'Die Erde ist zu klein! "Unendlichkeit des Universums" im Video, in dem die Größe der Planeten verglichen wird, ist gefährlich', 'Der beliebte Account "Okegawa Neko" hat Twitter gestoppt. Ich kann den Grund nicht beenden...', 'Wo hast du gelernt!?11 Menschen, deren Talente in die falsche Richtung geblüht haben', 'Meine Tochter und mein Freund "Flirt Drive" → Danach ergreift mein Vater eine überraschende Aktion...!', '[Howahowa ♡] Kyun Kyun kann nicht bei der "Unschuld" eines kleinen Kätzchens und eines Welpen aufhören, die miteinander spielen!', 'Die Tragödie des angesehenen Idemitsu...Plötzlich ist der Gründer durch Eingriffe des Managements verwirrt, und die vom Land geführte Umstrukturierung der Branche steht kurz vor dem Zusammenbruch', 'Am 5. Morgen fand in "Osaka 8,8 Millionen Schulungen" ein Notfall-Postempfang statt, der ein Geräusch macht, wenn Sie in Osaka sind', 'Im Alter von 16 Jahren war er bereits ein "Sex-Biest"! Zeugnis von Yuta Takahata: "Ich wollte ein Seil für ein Sexualverbrechen werden."', 'Bewegen Sie den Tsukiji-Markt so schnell wie möglich! Wenn Sie an die Menschen in Tokio denken, gibt es nur eine Antwort', 'Toru Hashishita "Konfrontation oder Zusammenarbeit mit dem Stadtrat! Herr Koike muss bald hungrig werden."', 'Ein Polizist, der ein während der Patrouille aufgenommenes Auto-Sex-Bild durchgesickert war, wurde festgenommen, und die fotografierte Frau beging Selbstmord - China', 'Eine minderwertige Korea-Tour bricht den Ärger chinesischer Touristen gegenüber japanisch-chinesischen Medien aus', 'Tee, der von China nach Japan eingeführt wurde, "Matcha" wurde wieder importiert und wurde populär=China-Berichterstattung', '"Too Japan!" Für Produktionen, die chinesische Filme, Dramen und Japan stark beeinflussen', 'Das American Museum of Art zeigt eine "verzerrte Karte", die Chinesische Mauer von Mari, die sich bis zur koreanischen Halbinsel erstreckt=Korea Net "Japan ist schrecklich, aber China ist noch mehr...', 'Ist es erstaunlich, es auszuziehen? 5 Merkmale des sinnlichen weiblichen Körpers', 'Was ist los mit "Häusern ohne Festnetztelefone" im Schulkontaktnetzwerk?', 'Ist das so! Zwei super überraschende "Geschenke, die Männern nicht gegeben werden sollten"', 'Fass es nicht an! 4 Teile, die während der Physiologie empfindlich werden', '"verlorene Hoffnung...Verschiedene Beispiele für unglückliches Übersee-Liefergepäck', 'Es fühlt sich nicht seltsam an! Nonsta Inoue und Ocarina tauschen Gesichter aus! Es ist ein Thema, das sich überhaupt nicht seltsam anfühlt', 'Sanko bringt wiederaufladbaren Staubwedel "SHU" auf den Markt', 'Smart Strap "Sgnl", mit dem Sie mit Ihrem Finger als Empfänger telefonieren können', 'Ein Film, in dem Apples Siri von Microsofts Cortana beeindruckt ist', 'Google nützliche Techniken-Organisieren Sie Dateien auf Google Drive', 'Sie können es ohne zu zögern an der Sapporo Station kaufen! 5 unverwechselbare Souvenirs', 'Entdeckter "Too Beautiful Lunch Sale" in Shinjuku → 400 Yen Mittagessen ist ein Level, das Sie dazu bringt, samstags und sonntags zur Arbeit zu gehen!', 'Der Besitzer von Ramen Jiro gesteht seine wahren Gefühle/Das bedeutet nicht, dass eine Person früh isst, aber die anderen Kunden sind spät dran. "Jeder muss sein Bestes geben."', 'Katze! Katze! Katze! 3 Geschenke mit Katzenmotiven, die Katzenliebhaber auf jeden Fall lieben werden', 'Bier geht weiter! Ich machte einen einfachen Snack aus Hanpen und Conbeef', 'Ich bin wieder süchtig danach ♪ Neue Arbeit "Sechs!] Ist ein aktuelles Drop-Spiel, das von einem Team großer Hits erstellt wurde. [Spielbericht, der in nur 10 Sekunden gelesen werden kann]', '[Super sorgfältige Auswahl] Zwei empfohlene Spiele der Woche, die von der Game8-Redaktion ausgewählt wurden! Diese Woche "Lost Maze" "Flip"...', 'Heilsimulationsspiel "Midori no Hoshiboshi", das trostlose Sterne grün macht [Wochenendrückblick]', 'Death Game "Mr", der in 4 Tagen nach Veröffentlichung 5 Millionen DL erreicht hat.Sprung (Mr. Jump) "', 'Ein Gesamtangriff von bis zu 16 Körpern ist ein Meisterwerk! Der wahre Nervenkitzel von RPG ist hier. "BLAZING ODYSSEY...']

Befehl analysieren

Überprüfen Sie nach der Implementierung von Spider den Befehl Parse.

% scrapy parse --spider=gunosy "https://gunosy.com/categories/1"
2016-09-05 10:57:26 [scrapy] INFO: Scrapy 1.1.2 started (bot: gunosynews)
2016-09-05 10:57:26 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'gunosynews.spiders', 'DOWNLOAD_DELAY': 3, 'BOT_NAME': 'gunosynews', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': 
---
 'start_time': datetime.datetime(2016, 9, 5, 1, 57, 26, 384501)}
2016-09-05 10:57:30 [scrapy] INFO: Spider closed (finished)

>>> STATUS DEPTH LEVEL 1 <<<
# Scraped Items  ------------------------------------------------------------
[{'subcategory': 'Filme',
  'title': 'Kuranosuke Sasaki x Kyoko Fukada "Super schnell! "Returns" ist "Give back"',
  'url': 'https://gunosy.com/articles/R07rY'},
 {'subcategory': 'Unterhaltung',
  'title': 'Ein Indianer unbekannter Herkunft gewinnt die Meisterschaft und 10 Folgen von "Soma No. 2 Plate of Shokugeki"',
  'url': 'https://gunosy.com/articles/Rb0dc'},
 {'subcategory': 'Fernsehgerät',
  'title': 'Rätsel lösen "Asunaro umarmen". Linie 132 von Takuya Kimura nach Hidetoshi Nishijima "Toto-neechan"',
  'url': 'https://gunosy.com/articles/RrtZJ'},
 {'subcategory': 'Unterhaltung',
  'title': 'T-Shirts, die "Hadashi no Gen" und die Clubkultur der 90er Jahre kombinieren, sind fantastisch',
  'url': 'https://gunosy.com/articles/aw7bd'},
 {'subcategory': 'Karikatur',
  'title': 'Die moderne Geschichte Japans selbst ... Eine Abschiedsstimme von taiwanesischen Fans, um "Kochigame" zu vervollständigen=Taiwan Medien',
  'url': 'https://gunosy.com/articles/Rmd7L'},
---
 {'subcategory': 'Fernsehgerät',
  'title': 'Ame Talk!Zwei Mal pro Woche!!Sonntag Goldener Vorschuss',
  'url': 'https://gunosy.com/articles/afncS'},
 {'subcategory': 'Karikatur',
  'title': 'Beschlossen, "Ahito-chan will reden" zu animieren, das das tägliche Leben von Highschool-Mädchen zeigt, die ein wenig "ungewöhnlich" sind',
  'url': 'https://gunosy.com/articles/aan1a'}]

# Requests  -----------------------------------------------------------------
[]

Es gibt andere Möglichkeiten, Open im Browser hinzuzufügen, mit denen Sie den Inhalt von Response direkt über den Browser überprüfen und protokollieren können.

So legen Sie die Ausgabe fest

Die offizielle Referenz ist hier.

Format (json, jsonlines, xml, csv)

Es ist in Ordnung, wenn Sie das Element FEED_FORMAT in settings.py angeben.

settings.py


FEED_FORMAT = 'csv'

Bisher wurde nur Python2 unterstützt, daher wurden die Japaner in der Ausgabedatei und im Protokoll verschlüsselt, aber ** Da sowohl Scrapy als auch Scrapy Cloud Python3 im Mai 2016 unterstützten ** Es scheint, dass Scrapy selbst auch sequentiell unterstützt wird, so dass es ausgegeben wird, ohne in jedem Format codiert zu werden.

Ziel speichern (lokal, ftp, s3)

Es ist in Ordnung, wenn Sie FEED_URI in settings.py entsprechend einstellen.

settings.py


FEED_URI = 'file:///tmp/export.csv'

Wenn Sie S3 verwenden, müssen Sie eine zusätzliche ID und einen zusätzlichen Schlüssel angeben, dies ist jedoch sehr einfach zu verwenden.

settings.py


FEED_URI = 's3://your-bucket-name/export.csv'
AWS_ACCESS_KEY_ID = 'YOUR_ACCESS_KEY_ID'
AWS_SECRET_ACCESS_KEY = 'YOUR_SECRET_ACCESS_KEY'

Wenn Sie in einer lokalen Umgebung in S3 speichern möchten, installieren Sie bitte Botocore oder Boto. Es scheint, dass es von Anfang an in Scrapy Cloud installiert ist, sodass keine Unterstützung erforderlich ist.

% pip install botocore

So geben Sie den Dateinamen dynamisch an

Außerdem kann der Dateiname dynamisch angegeben werden. Standardmäßig sind die folgenden zwei Variablen definiert.

Sie können Variablen auch selbst hinzufügen, indem Sie sie im Spider-Code definieren. Die Standardeinstellung% (Zeit) s ist keine japanische Zeit. Hier ist ein Beispiel für die Ausgabe durch Angabe eines Verzeichnisses oder Dateinamens in japanischer Zeit.

gunosy.py


# -*- coding: utf-8 -*-
import scrapy
from pytz import timezone
from datetime import datetime as dt
from gunosynews.items import GunosynewsItem

class GunosynewsSpider(scrapy.Spider):
    name = "gunosy"
    allowed_domains = ["gunosy.com"]
    start_urls = (
    'https://gunosy.com/categories/1',  #Unterhaltung
    'https://gunosy.com/categories/2',  #Sport
    'https://gunosy.com/categories/3',  #interessant
    'https://gunosy.com/categories/4',  #Inländisch
    'https://gunosy.com/categories/5',  #Übersee-
    'https://gunosy.com/categories/6',  #Säule
    'https://gunosy.com/categories/7',  #IT / Wissenschaft
    'https://gunosy.com/categories/8',  #Gourmet
    )

    # For output path
    #Kann hier dynamisch definiert werden
    now = dt.now(timezone('Asia/Tokyo'))
    date = now.strftime('%Y-%m-%d')
    jst_time = now.strftime('%Y-%m-%dT%H-%M-%S')

settings.py


FEED_URI = 's3://your-bucket-name/%(name)s/dt=%(date)s/%(jst_time)s.csv'
FEED_FORMAT = 'csv'
AWS_ACCESS_KEY_ID = 'YOUR_ACCESS_KEY_ID'
AWS_SECRET_ACCESS_KEY = 'YOUR_SECRET_ACCESS_KEY'

So legen Sie die Umgebung in Scrapy Cloud fest

So legen Sie python3 fest

Weitere Informationen zur Python3-Unterstützung finden Sie unter hier. Ab dem 05.09.2016 wird Python2 in Scrapy Cloud verwendet, sofern nicht anders angegeben.

Um mit Python3 in der Scrapy Cloud ausgeführt zu werden, müssen Sie die folgenden Einstellungen zu Scrapinghub.yml hinzufügen, die erstellt werden, wenn Sie den Befehl `` `shub deploy``` ausführen.

scrapinghub.yml


projects:
  default: 99999
stacks:
  default: scrapy:1.1-py3

So fügen Sie abhängige Pakete ein

Wenn Sie die Bibliothek im Rahmen des Scrapy-Prozesses verwenden möchten, müssen Sie den Namen des abhängigen Pakets in die Datei "resources.txt" schreiben und in "snapinghub.yml" angeben.

requirements.txt


pytz

scrapinghub.yml


projects:
  default: 99999
stacks:
  default: scrapy:1.1-py3
requirements_file: requirements.txt

das ist alles.

Housmart - Organization Page

Recommended Posts

Scraping mit Python-Einführung in Scrapy Erster 2. Schritt
Python - Pygals erster Schritt
Web Scraping mit Python Erster Schritt
Der erste Schritt von Python Matplotlib
Udemy Impressions: Web Scraping mit Python-Einführung - [Erste Schritte zur Geschäftseffizienz] Impressionen
Der erste Schritt zur Protokollanalyse (Formatieren und Einfügen von Protokolldaten in Pandas)
Laden Sie die abgekratzten Artefakte in Scrapy Cloud auf S3 hoch
Erste Schritte zum Testen von Google CloudVision in Python
Der erste Schritt im Problem der Erfüllung von Einschränkungen in Python
Übergeben von Einstellungen an Item Pipeline in Scrapy
Einführung in Scrapy (1)
Einführung in Scrapy (3)
Einführung in Scrapy (2)
Einführung in Scrapy (4)
Ich war süchtig danach, 2020 mit Selen (+ Python) zu kratzen
TemplateView-Muster, die Sie zuerst in Django lernen möchten
Der erste Schritt, um Blender von Python verfügbar zu machen