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.
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.
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.
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.
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.
Der gesamte Datenfluss ist wie folgt.
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.
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...']
Ü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.
Die offizielle Referenz ist hier.
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.
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
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'
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
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.
Recommended Posts