Wir haben auf leicht verständliche Weise beschrieben, wie Scrapy ausgeführt wird, ein Framework, das Web-Scraping ermöglicht. Ich bin froh, wenn Sie es als Referenz verwenden können.
Referenz: Python - Erstellen Sie einen Crawler mit Scrapy https://qiita.com/naka-j/items/4b2136b7b5a4e2432da8
Zeitaufwand 15 Minuten Inhalt
Führen Sie den folgenden Pip auf dem Terminal aus, um Scrapy zu installieren
pip install scrapy
Gehen Sie dann zu dem Verzeichnis, in dem Sie das Scrapy-Projekt erstellen möchten, und führen Sie die folgenden Schritte aus
scrapy startproject sake
Danach werde ich die Website in Bezug auf Sake durchsuchen, daher habe ich den Namen des Projekts in "Sake" geändert. Anschließend werden die folgenden Ordner im aktuellen Verzeichnis konfiguriert.
Web Scraping ist mit der obigen Datei allein nicht möglich. Geben Sie daher den folgenden Befehl und den folgenden Befehl ein Erstellen Sie Dateien im Spider-Verzeichnis.
#scrapy genspider <Dateiname> <Web-URL, die Sie kratzen möchten>
scrapy genspider scrapy_sake https://www.saketime.jp/ranking/
Dann können Sie sehen, dass im Spider-Verzeichnis eine Datei mit dem Namen "rapy_sake.py "erstellt wird. Der Inhalt der erstellten Datei lautet wie folgt.
sake/sake/spiders/scrapy_sake.py
# -*- coding: utf-8 -*-
import scrapy
class ScrapySakeSpider(scrapy.Spider):
name = 'scrapy_sake'
allowed_domains = ['https://www.saketime.jp/ranking/']
start_urls = ['http://https://www.saketime.jp/ranking/']
def parse(self, response):
pass
Wie ich später ausführlich erläutern werde, werde ich hauptsächlich diesen "def parse" -Teil codieren. Stellen Sie vor dem Codieren sicher, dass Sie die Webinformationen korrekt abrufen können. Fügen Sie dem Teil "def parse" eine Druckanweisung hinzu, um die erfassten Informationen anzuzeigen.
sake/sake/spiders/scrapy_sake.py
# -*- coding: utf-8 -*-
import scrapy
class ScrapySakeSpider(scrapy.Spider):
name = 'scrapy_sake'
allowed_domains = ['https://www.saketime.jp/ranking/']
start_urls = ['http://https://www.saketime.jp/ranking/']
def parse(self, response):
#Pass löschen und Druckanweisung hinzufügen
print(response)
Und wenn Sie den folgenden Befehl ausführen, wird eine Menge Ausgabe zurückgegeben, aber Sie können bestätigen, dass Sie HTML fest darin haben können.
Ausführungsbefehl
#scrapy crawl <Dateiname>
scrapy crawl scrapy_sake
Ausgabe
<li class="brand_review clearfix">
<div>
<p>
Isos Stolz, ein spezielles Buch, das rohen Sake gebraut hat
Klicken Sie hier für den heutigen Sake, den speziellen Honjo-Rohsake, auf den Iso stolz ist!
Reis... <br>
<span class="brand_review_user">
by
<span>Verklagen</span>
<span>
<span class="review-star">★</span>
<span>4.5</span>
</span>
<span class="reviewtime">
<span>23. März 2020</span>
</span>
</span>
</p>
</div>
</li>
</ul>
</a>
</div>
:
:
:
'scheduler/dequeued': 1,
'scheduler/dequeued/memory': 1,
'scheduler/enqueued': 1,
'scheduler/enqueued/memory': 1,
'start_time': datetime.datetime(2020, 4, 9, 3, 23, 24, 461847)}
2020-04-09 12:23:26 [scrapy.core.engine] INFO: Spider closed (finished)
Als nächstes extrahieren wir nur die notwendigen Informationen von hier!
Grundsätzlich gibt es nur zwei Dateien, die von Scrapy implementiert werden:
Lassen Sie uns zuerst von item.py aus bearbeiten. Wenn Sie es zum ersten Mal öffnen, sieht es wie in der folgenden Datei aus.
sake/items.py
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class SakeItem(scrapy.Item):
pass
Registrieren Sie in diesem Klassenteil willkürlich die Informationen, die Sie mit Scrapy erhalten möchten.
sake/items.py
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class SakeItem(scrapy.Item):
#Informationsname, den Sie erhalten möchten(Irgendein) = scrapy.Field()
prefecture_maker = scrapy.Field()
prefecture = scrapy.Field()
maker = scrapy.Field()
brand = scrapy.Field()
pass
Dies ist das Ende der Beschreibung von items.py. Als nächstes fahren wir mit der Codierung vonrapy_sake.py fort.
Das ausgefüllte Formular lautet wie folgt. Ich denke, dass das Innere von def parse () reicher ist als das in Kapitel 2 oben.
sake/sake/spiders/scrapy_sake.py
# -*- coding: utf-8 -*-
import scrapy
#items.Vergessen Sie nicht, py zu importieren
from sake.items import SakeItem
class ScrapySakeSpider(scrapy.Spider):
name = 'scrapy_sake'
#allowed_domains = ['ja.wikipedia.org']
start_urls = ['https://www.saketime.jp/ranking/']
def parse(self, response):
items = []
#HTML-Tag li.Japanische Sake-Informationen wurden an einem Ort namens Clearfix gespeichert.
sakes = response.css("li.clearfix")
#Mehrere li auf der Seite.Schauen wir uns jeden Clearfix an
for sake in sakes:
#item.Deklarieren Sie ein in py definiertes SakeItem-Objekt
item = SakeItem()
item["prefecture_maker"] = sake.css("div.col-center p.brand_info::text").extract_first()
#<div class="headline clearfix">Im Falle einer Beschreibung wie,headline.Dazwischen als Clearfix.Etwas anziehen
item["brand"] = sake.css("div.headline.clearfix h2 a span::text").extract_first()
#Bereinigen der erfassten Daten
if (item["prefecture_maker"] is not None) or (item["brand"] is not None):
#Löschen \ n und Leerzeichen
item["prefecture_maker"] = item["prefecture_maker"].replace(' ','').replace('\n','')
#Trennung von Präfektur und Hersteller
item["prefecture"] = item["prefecture_maker"].split('|')[0]
item["maker"] = item["prefecture_maker"].split('|')[1]
items.append(item)
print(items)
#Reflektieren Sie die Seitenumschaltung mit rekursiver Verarbeitung
#ein Tag rel="next"Holen Sie sich die Elemente von
next_page = response.css('a[rel="next"]::attr(href)').extract_first()
if next_page is not None:
#In absoluten Pfad konvertieren, wenn URL relativer Pfad ist
next_page = response.urljoin(next_page)
#Rückgabeanforderung einmal mit Ertrag, Sakes werden nach der Anforderung auf der Seite registriert, und die obige for-Anweisung wird erneut ausgeführt
yield scrapy.Request(next_page, callback=self.parse)
Wenn diese ausgeführt werden, ist dies wie folgt.
:
:
:
2020-04-10 16:52:58 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://www.saketime.jp/ranking/page:110/> from <GET https://www.saketime.jp/ranking/page:110>
2020-04-10 16:52:59 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.saketime.jp/ranking/page:110/> (referer: https://www.saketime.jp/ranking/page:109/)
[{'brand': 'Orochis Zunge',
'maker': 'Kiji Sake Brauerei',
'prefecture': 'Shimane',
'prefecture_maker': 'Shimane|Kiji Sake Brauerei'}, {'brand': '禱 und Minoru',
'maker': 'Fukumitsuya',
'prefecture': 'Ishikawa',
'prefecture_maker': 'Ishikawa|Fukumitsuya'}, {'brand': 'Kanazawa Schönheit',
'maker': 'Fukumitsuya',
'prefecture': 'Ishikawa',
'prefecture_maker': 'Ishikawa|Fukumitsuya'}, {'brand': 'Jinkuro',
'maker': 'Kitayuki Sake Brauerei',
'prefecture': 'Niigata',
'prefecture_maker': 'Niigata|Kitayuki Sake Brauerei'}, {'brand': 'Kenroku Sakura',
'maker': 'Nakamura Sake Brauerei',
'prefecture': 'Ishikawa',
'prefecture_maker': 'Ishikawa|Nakamura Sake Brauerei'}, {'brand': 'Geburt',
'maker': 'Tohoku Meijo',
'prefecture': 'Yamagata',
'prefecture_maker': 'Yamagata|Tohoku Meijo'}, {'brand': 'SUMMERGODDESS',
'maker': 'Mana Tsuru Sake Brauerei',
'prefecture': 'Fukui',
:
:
:
'scheduler/dequeued/memory': 221,
'scheduler/enqueued': 221,
'scheduler/enqueued/memory': 221,
'start_time': datetime.datetime(2020, 4, 10, 7, 51, 13, 756973)}
2020-04-10 16:53:00 [scrapy.core.engine] INFO: Spider closed (finished)
Ich habe in etwa 20 Sekunden 110 Seiten japanischer Sake-Informationen im JSON-Format erhalten. Es ist bequem.
Versuchen Sie, die Websites zu durchsuchen, an denen Sie interessiert sind, um Informationen zu erhalten.
Obwohl es sich um grundlegende Informationen handelt, ist es bei Chrome-Browsern und MacOS möglich, HTML-Informationen der Site anzuzeigen, die Sie mit cmd + option + i durchsuchen möchten. Sie können auch cmd + shift + c drücken, um auf ein Element auf der Site zu klicken und zu sehen, wo es im HTML-Code dargestellt wird.
Recommended Posts