[PYTHON] Collectez les informations de latitude / longitude du magasin avec scrapy + splash ①

1.Tout d'abord

Nous recueillons des informations telles que le nom du magasin, la latitude et la longitude, et le service de déploiement à partir des informations du magasin KFC. Puisque les informations du magasin sont générées par javascript, les éclaboussures sont prises entre les deux.

Liste des précautions pour le scraping Web

2. Environnement d'exécution

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

3. Construction de l'environnement

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 est installé par défaut, il n'est donc pas nécessaire

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 est couvert par docker. Facile.

(Site de référence) [Remarque sur la façon de démarrer le robot d'exploration Python "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) Grattage facile de pages JavaScript à l'aide de scrapy-splash github (scrapy-splash)

  1. scrapy

création de projet

Créez un modèle pour le projet et l'araignée.

python2.7


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

définition d'élément

Définissez l'élément que vous souhaitez obtenir. Cette fois, nous obtiendrons le nom du magasin, l'adresse, map_url (latitude et longitude), et la présence ou l'absence de divers services.

~/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

Réglage initial

Ne mettez pas de charge sur l'autre partie. Requis pour USER_AGENT, ROBOTSTXT_OBEY et 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'

programme d'araignée

~/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='
    #Commencez par la page de résultats de recherche de 47 préfectures.
    for i in range(1,48):
        prfct_id = '{0:02d}'.format(i)
        url = shop_url_home + prfct_id
        start_urls.append(url)

    #Obtient la réponse rendue.
    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url, self.parse,
                args={'wait': 0.5},
        )

    def parse(self, response):
        #Chaque information de magasin(=élément de liste)Spécifier.
        stores = response.xpath('//ul[@id="outShop"]/li')
        for store in stores:
            item = KFCShopspiderItem()
            #Décrivez avec un chemin relatif.
            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

        #De chaque résultat de recherche'prochain'Obtenez la destination du lien et appelez la méthode paese.
        next_page= response.xpath('//li[@class="next"]/a/@href')
        if next_page:
            # 'prochain'Il y en a deux en haut et en bas de la liste des magasins, alors n'obtenez que le premier élément
            url = response.urljoin(next_page[0].extract())
            yield SplashRequest(url, self.parse)

5. Débogage

L'outil de développement Chrome (touche F12) est utile pour vérifier le xpath. Vous pouvez obtenir l'élément que vous souhaitez vérifier à partir de la vue Eléments en cliquant avec le bouton droit de la souris> Copier> Copier XPath.

python2.7


scrapy shell "http://localhost:8050/render.html?url={L'URL que vous souhaitez afficher}"

6. Courir

Nous avons pu obtenir des informations sur plus de 1 000 magasins en 10 minutes environ.

python2.7


scrapy crawl ${PRJ_NAME} -o hoge.csv

Recommended Posts

Collectez les informations de latitude / longitude du magasin avec scrapy + splash ②
Collectez les informations de latitude / longitude du magasin avec scrapy + splash ①
Collectionne les paroles d'Anison avec Scrapy
Coordonnées de latitude et de longitude ↔ Conversion de coordonnées UTM avec python
Obtenez les distances de latitude et de longitude en mètres avec QGIS
Redémarrez avec Scrapy
YOLP: extraire la latitude et la longitude avec l'API Yahoo! Geocoder.