Erster Beitrag! Ich wollte eigentlich Serverless in einen Artikel aufnehmen, aber ich konnte es nicht rechtzeitig schaffen ... Diesmal wird es also die Scraping-Edition sein.
Ich möchte Webseiten, deren Informationen regelmäßig aktualisiert werden, automatisch kratzen!
Erhalten Sie alle 6 Stunden Yahoo! Wetterdaten (Tokio).
Python + Scrapy + AWSlambda + CroudWatchEvents scheint gut zu sein ...?
Führen Sie die folgenden Schritte aus, um die Crawling- und Scraping-Teile zu erstellen.
$ python3 -V
Python 3.7.4
$ pip3 install scrapy
...
Successfully installed
$ scrapy version
Scrapy 1.8.0
In der Hierarchie, in der Sie den Befehl eingegeben haben, wird ein Ordner für Ihr Projekt erstellt.
$ scrapy startproject yahoo_weather_crawl
New Scrapy project 'yahoo_weather_crawl'
$ ls
yahoo_weather_crawl
Dieses Mal werde ich versuchen, diesen Teil des Yahoo-Wetters zu bekommen. Lassen Sie uns das Ankündigungsdatum, das Datum, das Wetter, die Temperatur und die Niederschlagswahrscheinlichkeit ermitteln.
Scrapy verfügt über eine Befehlszeilen-Shell, und Sie können Befehle eingeben, um zu überprüfen, ob das Erfassungsziel ordnungsgemäß erfasst wurde. Fahren Sie also fort, während Sie es einmal überprüfen.
Geben Sie das Erfassungsziel mit xpath an. Sie können den xpath ganz einfach über die Google Chrome-Entwicklertools abrufen (den, der beim Drücken von F12 angezeigt wird).
Der xpath des Ankündigungsdatums und der Uhrzeit, die dieses Mal erfasst wurden, ist wie folgt
//*[@id="week"]/p
Lassen Sie uns dies aus der Antwort herausziehen.
#Starten Sie die Scrapy Shell
$ scrapy shell https://weather.yahoo.co.jp/weather/jp/13/4410.html
>>> announcement_date = response.xpath('//*[@id="week"]/p/text()').extract_first()
>>> announcement_date
'Am 29. November 2019 um 18:00 Uhr angekündigt'
Wenn Sie text () angeben, können Sie nur den Text abrufen. Weitere Informationen finden Sie unter Referenzen.
Vorerst wurden Datum und Uhrzeit festgelegt, also lassen Sie uns die anderen auf die gleiche Weise abrufen.
Weitere Informationen befinden sich im Tabellen-Tag. Rufen Sie daher den gesamten Inhalt der Tabelle einmal ab.
>>> table = response.xpath('//*[@id="yjw_week"]/table')
Sie haben jetzt die Elemente im Tabellen-Tag für `id =" yjw_week "`
.
Wir werden jedes Element von hier bekommen.
#Datum
>>> date = table.xpath('//tr[1]/td[2]/small/text()').extract_first()
>>> date
'1. Dezember'
#Wetter
>>> weather = table.xpath('//tr[2]/td[2]/small/text()').extract_first()
>>> weather
'Bewölkt und manchmal sonnig'
#Temperatur
>>> temperature = table.xpath('//tr[3]/td[2]/small/font/text()').extract()
>>> temperature
['14', '5']
#regnerischer Prozentsatz
>>> rainy_percent = table.xpath('//tr[4]/td[2]/small/text()').extract_first()
>>> rainy_percent
'20'
Jetzt wissen Sie, wie Sie jeden bekommen Wir werden eine Spinne erstellen (der Hauptteil des Prozesses).
Die Struktur des zuvor erstellten Projektordners ist wie folgt.
.
├── scrapy.cfg
└── yahoo_weather_crawl
├── __init__.py
├── __pycache__
├── items.py
├── middlewares.py
├── pipelines.py
├── settings.py
└── spiders
├── __init__.py
└── __pycache__
Definieren Sie zunächst die zu erwerbenden Artikel.
items.py
import scrapy
class YahooWeatherCrawlItem(scrapy.Item):
announcement_date = scrapy.Field() #Datum und Uhrzeit der Ankündigung
date = scrapy.Field() #Datum
weather = scrapy.Field() #Wetter
temperature = scrapy.Field() #Temperatur
rainy_percent = scrapy.Field() #regnerischer Prozentsatz
Als nächstes erstellen Sie den Körper der Spinne im Ordner Spinnen.
spider/weather_spider.py
# -*- coding: utf-8 -*-
import scrapy
from yahoo_weather_crawl.items import YahooWeatherCrawlItem
# spider
class YahooWeatherSpider(scrapy.Spider):
name = "yahoo_weather_crawler"
allowed_domains = ['weather.yahoo.co.jp']
start_urls = ["https://weather.yahoo.co.jp/weather/jp/13/4410.html"]
#Extraktionsprozess für die Antwort
def parse(self, response):
#Datum und Uhrzeit der Ankündigung
yield YahooWeatherCrawlItem(announcement_date = response.xpath('//*[@id="week"]/p/text()').extract_first())
table = response.xpath('//*[@id="yjw_week"]/table')
#Datumsschleife
for day in range(2, 7):
yield YahooWeatherCrawlItem(
#Datenextraktion
date=table.xpath('//tr[1]/td[%d]/small/text()' % day).extract_first(),
weather=table.xpath('//tr[2]/td[%d]/small/text()' % day).extract_first(),
temperature=table.xpath('//tr[3]/td[%d]/small/font/text()' % day).extract(),
rainy_percent=table.xpath('//tr[4]/td[%d]/small/text()' % day).extract_first(),
)
scrapy crawl yahoo_weather_crawler
2019-12-01 20:17:21 [scrapy.core.scraper] DEBUG: Scraped from <200 https://weather.yahoo.co.jp/weather/jp/13/4410.html>
{'announcement_date': 'Ankündigung am 1. Dezember 2019 um 17:00 Uhr'}
2019-12-01 20:17:21 [scrapy.core.scraper] DEBUG: Scraped from <200 https://weather.yahoo.co.jp/weather/jp/13/4410.html>
{'date': '3. Dezember',
'rainy_percent': '10',
'temperature': ['17', '10'],
'weather': 'Sonnig'}
2019-12-01 20:17:21 [scrapy.core.scraper] DEBUG: Scraped from <200 https://weather.yahoo.co.jp/weather/jp/13/4410.html>
{'date': '4. Dezember',
'rainy_percent': '0',
'temperature': ['15', '4'],
'weather': 'Sonnig'}
2019-12-01 20:17:21 [scrapy.core.scraper] DEBUG: Scraped from <200 https://weather.yahoo.co.jp/weather/jp/13/4410.html>
{'date': '5. Dezember',
'rainy_percent': '0',
'temperature': ['14', '4'],
'weather': 'Teilweise bewölkt'}
2019-12-01 20:17:21 [scrapy.core.scraper] DEBUG: Scraped from <200 https://weather.yahoo.co.jp/weather/jp/13/4410.html>
{'date': '6. Dezember',
'rainy_percent': '10',
'temperature': ['11', '4'],
'weather': 'Wolkig'}
2019-12-01 20:17:21 [scrapy.core.scraper] DEBUG: Scraped from <200 https://weather.yahoo.co.jp/weather/jp/13/4410.html>
{'date': '7. Dezember',
'rainy_percent': '30',
'temperature': ['9', '3'],
'weather': 'Wolkig'}
Es sieht so aus, als wäre es gut aufgenommen! Es ist eine große Sache, also lasst es uns in eine Datei ausgeben.
Bei der Ausgabe in eine Datei werden japanische Zeichen standardmäßig verstümmelt Fügen Sie die Codierungseinstellungen zu settings.py hinzu.
settings.py
FEED_EXPORT_ENCODING='utf-8'
$ scrapy crawl yahoo_weather_crawler -o weather_data.json
...
weather_data.json
[
{"announcement_date": "Ankündigung am 1. Dezember 2019 um 17:00 Uhr"},
{"date": "3. Dezember", "weather": "Sonnig", "temperature": ["17", "10"], "rainy_percent": "10"},
{"date": "4. Dezember", "weather": "Sonnig", "temperature": ["15", "4"], "rainy_percent": "0"},
{"date": "5. Dezember", "weather": "Teilweise bewölkt", "temperature": ["14", "4"], "rainy_percent": "0"},
{"date": "6. Dezember", "weather": "Wolkig", "temperature": ["11", "4"], "rainy_percent": "10"},
{"date": "7. Dezember", "weather": "Wolkig", "temperature": ["9", "3"], "rainy_percent": "30"}
]
Ich konnte ausgeben!
Nächstes Mal werde ich diesen Prozess mit AWS kombinieren, um ihn serverlos auszuführen.
Scrapy 1.8 documentation https://doc.scrapy.org/en/latest/index.html Scrapy in 10 Minuten zu verstehen https://qiita.com/Chanmoro/items/f4df85eb73b18d902739 Web Scraping mit Scrapy https://qiita.com/Amtkxa/items/4c1172c932264ae941b4
Recommended Posts