[PYTHON] Regelmäßiges Serverless Scraping mit AWS Lambda + Scrapy Teil 1

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.

Was du machen willst

Ich möchte Webseiten, deren Informationen regelmäßig aktualisiert werden, automatisch kratzen!

Ziel

Erhalten Sie alle 6 Stunden Yahoo! Wetterdaten (Tokio).

Methode

Python + Scrapy + AWSlambda + CroudWatchEvents scheint gut zu sein ...?

Ich werde es vorerst versuchen

Zuerst vom Schaben

Führen Sie die folgenden Schritte aus, um die Crawling- und Scraping-Teile zu erstellen.

  1. Scrapy-Installation
  2. Erstellen Sie ein Scrapy-Projekt
  3. Spinne erstellen
  4. Führen Sie aus

1. Scrapy-Installation

$ python3 -V
Python 3.7.4

$ pip3 install scrapy
...
Successfully installed

$ scrapy version
Scrapy 1.8.0

2. Erstellen Sie ein Scrapy-Projekt

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. image.png 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).

image.png

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.

image.png


>>> 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).

3. Spinne erstellen

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(),
                )

4. Jetzt renn!

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.

Verweise

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

Regelmäßiges Serverless Scraping mit AWS Lambda + Scrapy Teil 1
Verschieben Sie CloudWatch-Protokolle regelmäßig mit Lambda nach S3
Stellen Sie die Python 3-Funktion mit Serverless Framework unter AWS Lambda bereit
Erstellen Sie mit Chalice eine flaschen- / flaschenähnliche Webanwendung auf AWS Lambda
So erstellen Sie mit AWS Lambda eine serverlose API für maschinelles Lernen
Ich habe einen Bot erstellt, um ihn auf Twitter zu posten, indem ich mit AWS Lambda eine dynamische Site im Internet abgekratzt habe (Fortsetzung).
Verwenden Sie AWS Lambda, um Nachrichten zu kratzen und LINE regelmäßig über Updates zu informieren [Python]
Führen Sie regelmäßig Python-Programme auf AWS Lambda aus
Erstellen Sie mit pulumi eine WardPress-Umgebung auf AWS
Versuchen Sie Tensorflow mit einer GPU-Instanz unter AWS
Serverlose Anwendung mit AWS SAM! (APIGATEWAY + Lambda (Python))
Scraping mit Python, Posting auf TwitterBot, regelmäßige Ausführung auf Heroku
[AWS] Spielen mit Schrittfunktionen (SAM + Lambda) Teil 3 (Zweig)
Schaben mit kratzender Schale
Erstellen Sie in Docker eine Ebene für AWS Lambda Python
[AWS] Spielen mit Schrittfunktionen (SAM + Lambda) Teil 1 (Basic)
Ich möchte Lambda mit Python auf Mac AWS!
Vorgehensweise zum Erstellen eines Linienbot in AWS Lambda
[AWS] Spielen mit Schrittfunktionen (SAM + Lambda) Teil 2 (Parameter)
Ich habe gerade eine virtuelle Umgebung mit der AWS-Lambda-Schicht erstellt
Schaben mit Selen + Python Teil 1
Festliches Scraping mit Python, Scrapy
Stellen Sie Django serverlos mit Lambda bereit
PyTorch mit AWS Lambda [Lambda-Import]
Web Scraping mit AWS Lambda
Schaben mit Selen + Python Teil 2
[AWS Hands-on] Erstellen wir einen Promi-Identifikationsdienst mit einer serverlosen Architektur!
# 3 Erstellen Sie eine Python-Umgebung (Django) mit einer EC2-Instanz (ubuntu18.04) von AWS part2
Erstellen Sie mit Python + Django + AWS eine Scraping-App und wechseln Sie Jobs
Verwenden Sie ScraperWiki, um regelmäßig Daten von Ihrer Website abzurufen
Startete eine Webanwendung auf AWS mit Django und wechselte Jobs
Lassen Sie uns einen Web-Chat mit WebSocket mit AWS serverless (Python) durchführen!
Spiele mit einer Schildkröte mit Schildkrötengrafiken (Teil 1)
Führen Sie Python planmäßig auf AWS Lambda aus
Benachrichtigen Sie HipChat mit AWS Lambda (Python)
Vorgehensweise zum Erstellen einer Kube-Umgebung unter Amazon Linux2 (aws) ~ (mit Bonus)
Bereiten Sie die Umgebung von Chainer auf der EC2-Spot-Instanz mit AWS Lambda vor
Ich habe versucht, einen URL-Verkürzungsdienst mit AWS CDK serverlos zu machen
Ich habe einen Slack-Bot geschrieben, der Verzögerungsinformationen mit AWS Lambda benachrichtigt