[PYTHON] Sammeln Sie Informationen zu Breiten- und Längengraden des Speichers mit Scrapy + Splash ①

1. Zuallererst

Wir erfassen Informationen wie den Namen des Geschäfts, den Breiten- und Längengrad sowie den Bereitstellungsservice von KFC-Geschäftsinformationen. Da die Geschäftsinformationen durch Javascript generiert werden, wird dazwischen ein Splash abgefangen.

Liste der Vorsichtsmaßnahmen für das Web-Scraping

2. Ausführungsumgebung

AWS EC2: Amazon Linux (2016.09-release) ,t2.micro Python 2.7.12

3. Umweltbau

python2.7


sudo yum groupinstall "Development tools" 
sudo yum install python-devel libffi-devel openssl-devel libxml2-devel libxslt-devel
sudo pip install scrapy
sudo pip install service_identity  #Amazon Linux ist standardmäßig installiert, daher ist dies nicht erforderlich

sudo yum -y install docker-io
sudo service docker start
sudo chkconfig docker on

sudo pip install scrapy-splash

docker pull scrapinghub/splash
docker run -p 8050:8050 scrapinghub/splash

Splash wird von Docker abgedeckt. Einfach.

(Referenzseite) [Hinweis zum Starten des Python-Crawlers "Scrapy"](http://sechiro.hatenablog.com/entry/2016/04/02/Python%E8%A3%BD%E3%82%AF%E3%83%AD % E3% 83% BC% E3% 83% A9% E3% 83% BC% E3% 80% 8CScrapy% E3% 80% 8D% E3% 81% AE% E5% A7% 8B% E3% 82% 81% E6 % 96% B9% E3% 83% A1% E3% 83% A2) Einfaches Scraping der JavaScript-Seite mit Scrapy-Splash github (scrapy-splash)

  1. scrapy

Projekterstellung

Erstellen Sie eine Vorlage für Projekt und Spinne.

python2.7


export PRJ_NAME=KFCShopSpider
scrapy startproject ${PRJ_NAME}
cd ./${PRJ_NAME}/${PRJ_NAME}/spider
scrapy genspider ${PRJ_NAME} kfc.co.jp

Artikeldefinition

Definieren Sie den Artikel, den Sie erhalten möchten. Dieses Mal erhalten wir den Namen des Geschäfts, die Adresse, map_url (Breite und Länge) sowie das Vorhandensein oder Fehlen verschiedener Dienste.

~/KFCShopSpider/KFCShopSpider/items.py


# -*- coding: utf-8 -*-

import scrapy

class KFCShopspiderItem(scrapy.Item):
    name = scrapy.Field()
    address = scrapy.Field()
    map_url = scrapy.Field()
    DriveThrough = scrapy.Field()
    Parking = scrapy.Field()
    Delivery = scrapy.Field()
    Wlan = scrapy.Field()
    pass

Grundeinstellung

Belasten Sie die andere Partei nicht. Erforderlich für USER_AGENT, ROBOTSTXT_OBEY und DOWNLOAD_DELAY.

~/KFCShopSpider/KFCShopSpider/settings.py


# -*- coding: utf-8 -*-

BOT_NAME = 'KFCShopSpider'
SPIDER_MODULES = ['KFCShopSpider.spiders']
NEWSPIDER_MODULE = 'KFCShopSpider.spiders'

USER_AGENT = 'KFCShopSpider (+http://www.yourdomain.com)'
ROBOTSTXT_OBEY = True
DOWNLOAD_DELAY = 3

SPIDER_MIDDLEWARES = {
     'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}

DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}

SPLASH_URL = 'http://localhost:8050/'
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

Spinnenprogramm

~/KFCShopSpider/KFCShopSpider/spider/KFCShop_spider.py


# -*- coding: utf-8 -*-
import scrapy
from scrapy.spiders import CrawlSpider
from scrapy_splash import SplashRequest
from ..items import KFCShopspiderItem

class KFCShopSpider(CrawlSpider):
    name = "KFCShopSpider"
    allowed_domains = ["kfc.co.jp"]

    start_urls = []
    shop_url_home ='http://www.kfc.co.jp/search/fuken.html?t=attr_con&kencode='
    #Beginnen Sie auf der Suchergebnisseite von 47 Präfekturen.
    for i in range(1,48):
        prfct_id = '{0:02d}'.format(i)
        url = shop_url_home + prfct_id
        start_urls.append(url)

    #Ruft die gerenderte Antwort ab.
    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url, self.parse,
                args={'wait': 0.5},
        )

    def parse(self, response):
        #Informationen zu jedem Geschäft(=Listenelement)Konkretisieren.
        stores = response.xpath('//ul[@id="outShop"]/li')
        for store in stores:
            item = KFCShopspiderItem()
            #Beschreiben Sie mit einem relativen Pfad.
            item['address']     = store.xpath('./span[@class="scAddress"]/text()[1]').extract()
            item['map_url']     = store.xpath('./ul/li[2]/div/a/@href').extract()
            item['DriveThrough']= store.xpath('./span[@class="scIcon"]/img[contains(./@src,"check04")]/@alt').extract()
            item['Parking']     = store.xpath('./span[@class="scIcon"]/img[contains(./@src,"check05")]/@alt').extract()
            item['Delivery']    = store.xpath('./span[@class="scIcon"]/img[contains(./@src,"check02")]/@alt').extract()
            item['Wlan']        = store.xpath('./span[@class="scIcon"]/img[contains(./@src,"check03")]/@alt').extract()
            yield item

        #Von jedem Suchergebnis'Nächster'Holen Sie sich das Link-Ziel von und rufen Sie die paese-Methode auf.
        next_page= response.xpath('//li[@class="next"]/a/@href')
        if next_page:
            # 'Nächster'Es gibt zwei oben und unten in der Geschäftsliste, also holen Sie sich nur das erste Element
            url = response.urljoin(next_page[0].extract())
            yield SplashRequest(url, self.parse)

5. Debuggen

Das Chrome Developer Tool (F12-Taste) ist nützlich, um den xpath zu überprüfen. Sie können das zu überprüfende Element in der Elementansicht abrufen, indem Sie mit der rechten Maustaste auf> Kopieren> XPath kopieren klicken.

python2.7


scrapy shell "http://localhost:8050/render.html?url={Die URL, die Sie rendern möchten}"

6. Führen Sie aus

In ca. 10 Minuten konnten wir Informationen zu über 1.000 Filialen erhalten.

python2.7


scrapy crawl ${PRJ_NAME} -o hoge.csv

Recommended Posts

Sammeln Sie Informationen zu Längen- und Breitengraden des Speichers mit Scrapy + Splash ②
Sammeln Sie Informationen zu Breiten- und Längengraden des Speichers mit Scrapy + Splash ①
Sammle Anison-Texte mit Scrapy
Längen- und Breitengradkoordinaten ↔ UTM-Koordinatenkonvertierung mit Python
Erhalten Sie mit QGIS Längen- und Breitengrade in Metern
Starten Sie mit Scrapy neu
YOLP: Extrahieren Sie Längen- und Breitengrade mit der Yahoo! Geocoder-API.